Entwickler-Ecke

Windows API - Datentyp für Rückgabe aus C-DLL


STBaf - Mi 11.11.09 14:16
Titel: Datentyp für Rückgabe aus C-DLL
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;

// Type ByteArray = array[0..32767] of byte;
// Type PCharArray = ^CharArray;

Function RegKey_GetNetadapterInfos():PChar; stdcallexternal '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!");
      
      // TODO: Implement Functionality Here
      
      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!


Delete - Mi 11.11.09 20:40

unsigned char is 8bit (1 byte)

char sName[100]; //String in C

sName : array [0..99] of Char; //in Delphi geht String[100] nicht; //= 100 bytes


BenBE - Do 12.11.09 12:37

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
sName : array [0..99] of Char; //in Delphi geht String[100] nicht; //= 100 bytes

Geht schon, ist aber was anderes ... nämlich ein ShortString mit 100 Zeichen, der im RAM 101 Bytes belegt.