gpt4 book ai didi

c - 如何从 Delphi 制作的 DLL 导入函数?

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:47 27 4
gpt4 key购买 nike

你能告诉我如何在我的 C 程序中使用以下函数吗?

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

谢谢

最佳答案

由于您没有 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 作为练习留给读者:-)。

关于c - 如何从 Delphi 制作的 DLL 导入函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/609970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com