Delphi 如何使用参数调用DLL过程?
我在使用带有参数的Dll过程发送时遇到问题,我不允许在我的测试项目中向Dll方法的调用中添加参数 我正在尝试调用此dll方法:Delphi 如何使用参数调用DLL过程?,delphi,dll,Delphi,Dll,我在使用带有参数的Dll过程发送时遇到问题,我不允许在我的测试项目中向Dll方法的调用中添加参数 我正在尝试调用此dll方法: procedure Transfer(sMessage: PChar); stdcall; begin MainForm.ShowThis(sMessage); end; exports Transfer; TestProj使用以下方法: procedure TForm1.Button1Click(Sender: TObject); var DLLHandl
procedure Transfer(sMessage: PChar); stdcall;
begin
MainForm.ShowThis(sMessage);
end;
exports
Transfer;
TestProj使用以下方法:
procedure TForm1.Button1Click(Sender: TObject);
var
DLLHandle : THandle;
begin
DLLHandle := LoadLibrary ('C:\Program Files\Borland\Delphi5\Projects\Dll\MyLink.dll');
if DLLHandle >= 32 then
try
@Trans := GetProcAddress (DLLHandle, 'Transfer');
if @Trans <> nil then
Trans //Would like to say something like: Trans('Hello')
else
Showmessage('Could not load method address');
finally
FreeLibrary(DLLHandle);
end
else
Showmessage('Could not load the dll');
end;
procedure TForm1.按钮1点击(发送方:TObject);
变量
德尔汉德尔:坦德尔;
开始
DLLHandle:=LoadLibrary('C:\ProgramFiles\Borland\Delphi5\Projects\Dll\MyLink.Dll');
如果DLLHandle>=32,则
尝试
@Trans:=GetProcAddress(DLLHandle,'Transfer');
如果@Trans nil那么
Trans//想说一些类似于:Trans('Hello')的话
其他的
Showmessage('无法加载方法地址');
最后
免费图书馆;
结束
其他的
Showmessage('无法加载dll');
结束;
如果我使用“Trans('Hello')”命令,我得到的编译错误是:
[错误]单元1.pas(51):实际参数太多
我可以在没有参数的情况下运行它,但是我只会在我的showmessage框中得到jiberish,然后崩溃,因为我不发送任何消息
所以问题是如何将字符串作为参数发送到dll中?我做错了什么 不应在赋值的左侧使用指针符号(@),Trans变量应如下所示:
type
TTransferPtr = procedure (sMessage: PChar); stdcall;
var
Trans: TTransferPtr;
// Then use it like this:
Trans := TTransferPtr(GetProcAddress (DLLHandle, 'Transfer'));
if @Trans <> nil then
Trans(PChar('Hello'));
类型
ttTransferptr=程序(消息:PChar);stdcall;
变量
Trans:tttransferptr;
//然后像这样使用它:
Trans:=tttransferptr(GetProcAddress(DLLHandle,'Transfer'));
如果@Trans nil那么
Trans(PChar('Hello'));
不应在赋值的左侧使用指针符号(@),Trans变量应如下所示:
type
TTransferPtr = procedure (sMessage: PChar); stdcall;
var
Trans: TTransferPtr;
// Then use it like this:
Trans := TTransferPtr(GetProcAddress (DLLHandle, 'Transfer'));
if @Trans <> nil then
Trans(PChar('Hello'));
类型
ttTransferptr=程序(消息:PChar);stdcall;
变量
Trans:tttransferptr;
//然后像这样使用它:
Trans:=tttransferptr(GetProcAddress(DLLHandle,'Transfer'));
如果@Trans nil那么
Trans(PChar('Hello'));
谢谢,这一切都是按照你说的方式进行的。传输的第一步是一个过程,所以它不应该返回字符串,所以:ttTransferptr=procedure(sMessage:PChar);stdcall。要使if-Trans-nil正常工作,它需要一个指针地址:if@Trans-nil。但除此之外,这是正确的。感谢againAh,为错误感到抱歉,我应该在发布之前先测试它。如果DLL是在D2009之前编写的,那么应用程序应该使用PAnsiChar
而不是PChar
,以确保在将应用程序编写/升级到D2009+时的兼容性。非常感谢您所说的方法。传输的第一步是一个过程,所以它不应该返回字符串,所以:ttTransferptr=procedure(sMessage:PChar);stdcall。要使if-Trans-nil正常工作,它需要一个指针地址:if@Trans-nil。但除此之外,这是正确的。感谢againAh,为错误感到抱歉,我应该在发布之前先测试它。如果DLL是在D2009之前编写的,那么应用程序应该使用PAnsiChar
而不是PChar
,以确保在将应用程序编写/升级到D2009+时的兼容性。