Mam "tajemniczą bibliotekę dll" innej firmy napisaną z Delphi (nieznana wersja), działającym przykładem w delphi (przeszłość 2009), pilną potrzebą użycia wspomnianej biblioteki DLL w moim kodzie C# i prawie nie ma odpowiedniej wiedzy o tym, jak to zrobić.Używanie biblioteki DLL Delphi w C#
Oto przykład Delpi w użyciu tego dll:
type
TD_Query = function(host: WideString; port : Word;pud,query : WideString):WideString; stdcall;
procedure TForm11.Button6Click(Sender: TObject);
var
Handle : LongWord;
D_Query : TD_Query;
sss : WideString;
begin
Handle := LoadLibrary('kobrasdk.dll');
sss:='';
if Handle <> 0 then
begin
@D_Query := GetProcAddress(Handle, 'D_Query');
sss:=D_Query('host',8201,'pud','query');
FreeLibrary(Handle);
end;
end;
i tu jest moje próby interpretowania go w C#:
class Program
{
[DllImport("C:\\Games\\kobrasdk.dll", CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string D_Query(string host, ushort port, string pud, string query);
static void Main(string[] args)
{
D_Query("test", 8201, "test", "test");
}
}
Niestety, co mam jest błąd: Próba odczytu lub zapisz pamięć chronioną. Często jest to wskazówką, że inna pamięć jest uszkodzona.
Z tego, co przeczytałem w ciągu dnia, prawdopodobnie zmyliłem typ zwrotu lub typy parametrów. Wsparcie?
Wygląda na to, że konwencja telefonowania może być błędna między innymi. Nie jestem ekspertem od Delphi, ale może to pomóc http://stackoverflow.com/questions/16601423/calling-a-delphi-method-in-a-dll-from-c-sharp –
Eww, funkcje DLL nie powinny nigdy powracać dowolny typ łańcucha, który może powodować problemy. –
Czy jest szansa, że ta biblioteka DLL Delphi używa ShareMem? –