Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用delphi实现DLL过程中的参数不匹配_Delphi_Dll_Parameters - Fatal编程技术网

用delphi实现DLL过程中的参数不匹配

用delphi实现DLL过程中的参数不匹配,delphi,dll,parameters,Delphi,Dll,Parameters,我正在使用Delphi2007和DLL,我已经编写了一个程序,使用一个整数和一个字符串作为参数。我在程序中动态加载dll,以便测试它,并将参数作为程序的第一条指令打印在屏幕上。传递的值为0表示整数,为“”表示字符串,但当打印它们时,它们会变成类似14532的值和垃圾字符串。我知道我必须为dll调用使用一个具体的字符串类型,我可以修复它,但整数的情况对我来说似乎很神秘。有什么想法吗 我现在无法访问代码,但我将尝试复制它: 我的程序有点像 procedure proc(Code: integer;

我正在使用Delphi2007和DLL,我已经编写了一个程序,使用一个整数和一个字符串作为参数。我在程序中动态加载dll,以便测试它,并将参数作为程序的第一条指令打印在屏幕上。传递的值为0表示整数,为“”表示字符串,但当打印它们时,它们会变成类似14532的值和垃圾字符串。我知道我必须为dll调用使用一个具体的字符串类型,我可以修复它,但整数的情况对我来说似乎很神秘。有什么想法吗

我现在无法访问代码,但我将尝试复制它:

我的程序有点像

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));