用delphi实现DLL过程中的参数不匹配
我正在使用Delphi2007和DLL,我已经编写了一个程序,使用一个整数和一个字符串作为参数。我在程序中动态加载dll,以便测试它,并将参数作为程序的第一条指令打印在屏幕上。传递的值为0表示整数,为“”表示字符串,但当打印它们时,它们会变成类似14532的值和垃圾字符串。我知道我必须为dll调用使用一个具体的字符串类型,我可以修复它,但整数的情况对我来说似乎很神秘。有什么想法吗 我现在无法访问代码,但我将尝试复制它: 我的程序有点像用delphi实现DLL过程中的参数不匹配,delphi,dll,parameters,Delphi,Dll,Parameters,我正在使用Delphi2007和DLL,我已经编写了一个程序,使用一个整数和一个字符串作为参数。我在程序中动态加载dll,以便测试它,并将参数作为程序的第一条指令打印在屏幕上。传递的值为0表示整数,为“”表示字符串,但当打印它们时,它们会变成类似14532的值和垃圾字符串。我知道我必须为dll调用使用一个具体的字符串类型,我可以修复它,但整数的情况对我来说似乎很神秘。有什么想法吗 我现在无法访问代码,但我将尝试复制它: 我的程序有点像 procedure proc(Code: integer;
procedure proc(Code: integer; cod: String);stdcall;
begin;
showmessage(inttostr(code)+ " "+cod);
end;
另一方面是:
type
call: TCall(Code: integer; cod:String)
handler: THandler
end
....
....
procedure onClickEvent(...)
begin;
handler := loadlibrary(.../library.dll);
if handler <> 0 then
begin
@call := getprocaddress(handler, "proc");
if call <> nil then
call(0,"");
end
freelibrary(handler)
end
类型
调用:TCall(代码:整数;代码:字符串)
处理者:坦德尔
结束
....
....
过程onClickEvent(…)
开始;
处理程序:=loadlibrary(…/library.dll);
如果处理程序为0,则
开始
@调用:=getprocaddress(处理程序,“proc”);
如果是零的话
调用(0,“”);
结束
freelibrary(处理程序)
结束
在dll中使用PChar,而不是字符串。
更多信息请访问
注意:您发布的代码不能是您的真实代码。不会的
编译。请仅张贴直接从您的网站复制和粘贴的代码
编辑不要重新键入或编造
正如评论所说,不要使用string
。这是一种特定于Delphi的类型,甚至不总是相同的。其他语言将不知道如何使用它。根据您的需要使用PWideChar
或PAnsiChar
此外,您对调用的声明
是错误的(您必须将其声明为stdcall
,此后,参数将在堆栈上传递。如果您忘记了这一点,参数将在寄存器中传递,但DLL希望它们在堆栈上):
DLL中的实现:
procedure proc(Code: integer; Cod: PWideChar); stdcall;
begin
ShowMessage(IntToStr(Code)+ " " + Cod);
end;
现在你可以这样称呼它:
MyString := 'Hello';
Call(0, PWideChar(MyString));
您不能使用字符串。不适用于互操作。界面的另一面是什么样子的?我编辑以添加更多内容。正如我所说的,我是凭记忆写的,可能有点不同。我在加载dll时总是用同样的方法。编造和发布假代码是毫无意义的。不要那样做。张贴实际代码。停止使用字符串-1正确。我知道,但我没有原始代码。我只是想知道问题可能在哪里,然后试着自己解决它。顺便说一下,谢谢你的时间。你需要知道另一边是什么。没有这些信息,这个问题毫无意义。谢谢,我知道字符串问题,但我还不知道正确的类型。我完全确定我没有在声明中编写stdcall。如果这是问题所在,我将尝试向您确认。还要感谢字符串示例,因为我刚刚开始使用Delphi,我还没有找到它的示例。考虑到代码不是远程编译的,也不是真正的代码,我们只能猜测是否存在调用约定不匹配。这个问题真的应该修正或删除。事实上,他得到了奇怪的结果,即使是整数,让我觉得这真的是一个调用约定不匹配。但你是对的,这还不确定。打电话会议。或参数不匹配。谁能说呢。Asker需要学会停止编造东西。@David:请看顶部我的补充内容(blockquote)。
MyString := 'Hello';
Call(0, PWideChar(MyString));