2009-03-04 81 views
1

你能告诉我如何在我的C程序中使用以下功能。如何从德尔福的DLL中导入函数?

德尔福DLL - 导出功能:

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

我没有为DLL的源代码,所以我必须适应我的C程序到DLL,而不是周围的其他方式。

我做以下,并得到错误

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:"); 
} 

感谢

+0

你准确得到了什么错误?没有这些信息就很难提供帮助。 – rusvdw 2009-03-04 14:49:08

+0

该程序编译并运行,但在调用DLL函数时崩溃。 – Ampere 2009-03-05 09:04:28

回答

7

由于您没有DLL的源代码,因此您需要在C方面获得一点创意。即使ShortString被列为功能结果,它实际上是调用者提供放置结果的位置的责任。因为这是一个stdcall函数,参数从右向左传递,所以这意味着ShortString结果的地址最后传入。为了排列起来,它需要列出第一个参数。我会做第一个API,GetCPUID。在C语言中,它可能是这个样子:

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 
} 

我将离开GetPartitionID作为练习读者:-)。

1

ShortString短是不一样的PChar类型(字符*)。它是一个char数组,第一个字符是字符串的长度。对于C来说,最好是一路使用PChar(char *)。

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); 
+0

我没有该DLL的源代码,所以我可以将我的C程序调整到该DLL,而不是其他方式。 – Ampere 2009-03-04 15:47:51