gpt4 book ai didi

delphi - 在Delphi中用指针调用DLL

转载 作者:行者123 更新时间:2023-12-03 18:00:23 29 4
gpt4 key购买 nike

我是 Delphi 的新手。我有一个包含以下导出函数的 DLL:

bool __stdcall MyFunction(char * name, int * index)  

这段在 C++ 中调用此 DLL 函数的代码完美运行:

typedef void (WINAPI * MyFunction_t)(char *, int *);
void main()
{
HMODULE mydll = LoadLibrary(L"C:\\mydll.dll");
MyFunction_t MyFunction = (MyFunction_t)GetProcAddress(mydll, "MyFunction");

int index = 0;

MyFunction("MyString", &index);
}

我需要在 Delphi 中做同样的事情。这是我的代码,它不起作用(MyFunction 被调用但索引变量没有收到适当的值)。这是一段代码摘录,所以请忽略困惑。任何输入将不胜感激!

type
TMyFunction= function(name: PChar; var index_ptr: Integer): Boolean; stdcall;

var
fMyFunction : TMyFunction;
i : Integer;
h: THandle;

begin
Result := 0;
h := LoadLibrary('c:\\mydll.dll');
fMyFunction := GetProcAddress(h, 'MyFunction');
if @fMyFunction <> nil then
begin
fMyFunction('MyString', i);
Result := i;
end;
FreeLibrary(h);
end;

最佳答案

首先,我假设您正在使用 C 链接与 extern "C",以防此函数在 C++ 翻译单元中定义。

如果您使用的是 Delphi 2009 或更高版本,您需要注意 PChar 是一个指向以 null 结尾的 字符串的指针。

要与您需要使用的 ANSI C 函数互操作:

type
TMyFunction= function(name: PAnsiChar; var index: Integer): Boolean; stdcall;

C bool 类型可能最好映射到 LongBool,因为它与 Delphi Boolean 不太一样:

type
TMyFunction= function(name: PAnsiChar; var index: Integer): LongBool; stdcall;

你不需要在字符串中转义 \ 所以你可以这样写:

h := LoadLibrary('c:\mydll.dll');

您可能应该检查对 LoadLibrary 的调用是否有错误,从技术上讲,h 是一个 HMODULE 而不是 THandle,尽管这不会给您带来任何问题。

Delphi 惯用的写法是:

  if Assigned(fMyFunction) then
fMyFunction('MyString', Result);

基本上对我来说它看起来合理,但我最怀疑字符宽度。

希望对您有所帮助。

关于delphi - 在Delphi中用指针调用DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798283/

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