在Delphi中用指针调用dll
我是德尔福的新手。我有一个DLL,其中包含以下导出函数:在Delphi中用指针调用dll,delphi,dll,pointers,Delphi,Dll,Pointers,我是德尔福的新手。我有一个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 MyFunct
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);
}
我需要在德尔福做同样的事情。这是我的代码,它不起作用(调用了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;
类型
TMyFunction=函数(名称:PChar;变量索引:整数):布尔;stdcall;
变量
fMyFunction:TMyFunction;
i:整数;
h:THandle;
开始
结果:=0;
h:=LoadLibrary('c:\\mydll.dll');
fMyFunction:=GetProcAddress(h,'MyFunction');
如果@fMyFunction为零,则
开始
fMyFunction('MyString',i);
结果:=i;
结束;
免费图书馆(h);
结束;
<代码> > p>不要在您的TMyType类型中使用STDCULL。 < P>首先,假设在C++翻译单元中定义了该函数,则假定您使用C链接与<代码>外“C”<代码>。
如果您使用的是Delphi 2009或更高版本,则需要注意PChar是指向以null结尾的wide字符串的指针
要与ANSI C函数进行互操作,您需要使用:
type
TMyFunction= function(name: PAnsiChar; var index: Integer): Boolean; stdcall;
Cbool
类型可能最好映射到LongBool
,因为它与DelphiBoolean
不完全相同:
type
TMyFunction= function(name: PAnsiChar; var index: Integer): LongBool; stdcall;
无需以字符串形式转义\
,即可编写:
h := LoadLibrary('c:\mydll.dll');
您可能应该检查LoadLibrary调用中的错误,从技术上讲,h
是一个HMODULE
而不是THandle
,尽管这不会给您带来任何问题
惯用的德尔菲是这样写的:
if Assigned(fMyFunction) then
fMyFunction('MyString', Result);
基本上,我觉得它很合理,但我最怀疑的是字符宽度
希望对您有所帮助。您的dll是用什么语言构建的?您的C代码正在调用“void”函数,但是Delphi代码调用了一个返回bool的函数…?@Roddy这是调用该函数的C代码中的一个问题,但它似乎是良性的,因为这些代码都没有对返回值做任何处理。另一件事:您最好为输入字符串“MyString”分配一个Pchar变量。声明一个Pchar变量,在其上设置“MyString”字符串,并将该变量传递给dll。也许dll因此引发了一个异常。用这种方式传递PChar是完全正确的非常好的回答,我对C/C++不太在行,但是TMyFunction不应该被定义为TMyFunction=function(名称:PAnsiChar;索引:PInteger):LongBool;stdcall;由于导出的函数定义为int*index?@dorin,这取决于。如果它是一个可选参数,那么应该按照您建议的方式执行。否则,它会作为var参数更好。这个函数被定义为布尔-ysSTDLead MyFalm(char * Node,int * index),所以我怀疑名称和索引是强制性的,但是无论如何,这会告诉你C++过于神秘:-\doLin没有,你不能从代码签名中看出。两者都有可能。看看msdn中的几个api文档,看看一些指针参数将如何标记为[in,opt],比如,以及其他只是[in]。您应该始终编写它,它适用于旧版本的delphi,并且在升级时/升级时不需要更改。OP还没有说他使用的是什么版本的delphi。