Frage

Können Sie mir sagen, wie verwende ich die folgenden Funktionen in meinem C-Programm.

Delphi DLL - Exportierte Funktionen:

function GetCPUID (CpuCore: byte): ShortString; stdcall;
function GetPartitionID(Partition : PChar): ShortString; stdcall;

Ich habe nicht den Quellcode für die DLL so dass ich zu dieser DLL mein C-Programm anpassen muss und nicht umgekehrt.

ich die folgenden und bekommen Fehler

typedef char* (_stdcall *GETCPUID)(BYTE);
typedef char* (_stdcall *GETPID)(PCHAR);
GETCPUID pGetSerial;
GETPID pGetPID

HMODULE hWtsLib = LoadLibrary("HardwareIDExtractor.dll");
if (hWtsLib){
pGetSerial = (GETCPUID)GetProcAddress(hWtsLib, "GetCPUID");
char *str = (char*) malloc(1024);
str = pGetSerial((BYTE)"1");

pGetPID= (GETPID )GetProcAddress(hWtsLib, "GetPartitionID");
char *str1 = (char*) malloc(1024);
str1 = pGetPID("C:");
}

Danke

War es hilfreich?

Lösung

Da Sie die Quelle nicht auf die DLL haben, müssen Sie ein wenig kreativ auf der C-Seite der Dinge zu bekommen. Auch wenn die Short als Funktionser aufgeführt ist, ist es eigentlich in der Verantwortung des Anrufer einen Ort zu schaffen, bei dem das Ergebnis zu platzieren. Da dies eine stdcall Funktion, Parameter werden von rechts nach links übergeben, so dass heißt, dass die Adresse des Short Ergebnis ist in der letzten passierten. Um dies bis zu Zeile, muss es auf den ersten Parameter aufgeführt. Ich werde die erste API tun, GetCPUID. In C, könnte es etwa so aussehen:

typedef struct ShortString {
  char len;
  char data[255];
};
typedef void (_stdcall *GETCPUID)(struct ShortString *result, BYTE cpuCore);

GETCPUID pGetSerial;

HMODULE hWtsLib = LoadLibrary("HardwareIDExtractor.dll");
if (hWtsLib) {
  ShortString serial;
  pGetSerial = (GETCPUID)GetProcAddress(hWtsLib, "GetCPUID");
  pGetSerial(&serial, '1');
  char *str = malloc(serial.len + 1); // include space for the trailing \0
  strlcpy(str, serial.data, serial.len);
  str[serial.len] = '\0'; // drop in the trailing null
}

Ich werde das GetPartitionID als eine Übung für den Leser überlassen: -).

Andere Tipps

Short ist nicht das gleiche wie PChar (char *). Es ist eine Reihe von Zeichen mit dem ersten Zeichen der Länge der Saite ist. Für C ist es am besten, Sie verwenden PChar (char *) den ganzen Weg.

procedure GetCPUID (CpuCore: byte; CpuId: PChar; Len: Integer); stdcall;
procedure GetPartitionID(Partition : PChar; PartitionId: PChar; Len: Integer); stdcall;

typedef (_stdcall *GETCPUID)(BYTE, char*, int);
typedef (_stdcall *GETPID)(PCHAR, char*, int);
GETCPUID pGetSerial;
GETPID pGetPID

HMODULE hWtsLib = LoadLibrary("HardwareIDExtractor.dll");
if (hWtsLib){
pGetSerial = (GETCPUID)GetProcAddress(hWtsLib, "GetCPUID");
char *str = (char*) malloc(1024);
pGetSerial((BYTE)"1", str, 1024);

pGetPID= (GETPID )GetProcAddress(hWtsLib, "GetPartitionID");
char *str1 = (char*) malloc(1024);
pGetPID("C:", str, 1024);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top