Autor Beitrag
STBaf
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 11.11.09 14:16 
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:

ausblenden 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:

ausblenden 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:
ausblenden 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!
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.