Hallo zusammen
ich hätte mal eine Frage da ich im Moment selber völlig auf dem Schlauch stehe und hoffe das mir hier vielleicht jemand kurz helfen kann.
Folgendes Problem: Ich habe eine DLL (geschrieben in C), welche diverse Funktionen implementiert. Unter anderem auch Funktionen die einen Zeiger auf ein Char-Array zurückgeben. Das ganze sieht dann z.B. wie folgt in der Deklaration der C-Bibliothek aus:
Quelltext
1:
| __declspec(dllexport) const unsigned char* __stdcall RegKey_GetNetadapterInfos(); |
Soweit, so gut. Nun möchte ich eben diese Funktion in Delphi nutzen und habe es schon runtergebrochen auf ein simpelstes Konsolenprogramm zum testen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| {$X+} program Project1; {$APPTYPE CONSOLE} uses SysUtils;
Function RegKey_GetNetadapterInfos():PChar; stdcall; external 'RegKeyA.dll';
var test1:PChar; var test3:string;
begin test1 := RegKey_GetNetadapterInfos(); test3 := PChar(test1); write('hello world'); Readln; end. |
Wie man an den auskommentierten Dingen sieht habe ich auch schon versucht andere Datentypen als PChar zu nehmen (PAnsiChar, PByteArray usw. usw.). Auch habe ich schon Pointer zurückgegeben (dann hab ich halt ne Hex-Adresse) oder auch nen Integer, und anschließend mit Ptr() als Pointer interpretiert.
Gemeinsam ist das die Pointer-Adresse scheinbar immer die gleiche ist und das z.B. bei PChar nen Haufen Müll drinsteht (aber 2-3 Zeichen die sich immer wiederholen), oder aber bei anderen Typen auch mal gar nix.
Jemand eine Vorstellung was ich bei "const unsigned char *" gerade falsch mache ?
Übrigens eine Einbindung in C# geht problemlos:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| class Program { [DllImport("REGKEYA.DLL", EntryPoint="RegKey_GetNetadapterInfos", CharSet=CharSet.Ansi)] public static extern string RegKey_GetNetadapterInfos(); public static void Main(string[] args) { Console.WriteLine("Hello World!"); Console.WriteLine(Program.RegKey_GetNetadapterInfos()); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } |
Das funktioniert z.B. super.
Für jeden Anregung wäre ich dankbar!
Danke!