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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
Windows 动态和静态DLL链接是不同的_Windows_Delphi_Dll_Linker_Delphi Xe3 - Fatal编程技术网

Windows 动态和静态DLL链接是不同的

Windows 动态和静态DLL链接是不同的,windows,delphi,dll,linker,delphi-xe3,Windows,Delphi,Dll,Linker,Delphi Xe3,我有一个C DLL,想从Delphi XE3 Update 2调用它。 奇怪的是,在我的项目中,动态调用它似乎不同于静态调用它。下面是要复制的“最小”代码(我已更改了库/函数名): 输出是 static: keylist is nil 这意味着动态调用函数不同于静态调用函数。 通过动态调用keylist,可以正确初始化keylist。 查看生成的汇编代码,我发现变量“keylist” 被放入eax寄存器: testProject.dpr.34: keylist_open(@keylist);

我有一个C DLL,想从Delphi XE3 Update 2调用它。 奇怪的是,在我的项目中,动态调用它似乎不同于静态调用它。下面是要复制的“最小”代码(我已更改了库/函数名):

输出是

static: keylist is nil
这意味着动态调用函数不同于静态调用函数。 通过动态调用keylist,可以正确初始化keylist。 查看生成的汇编代码,我发现变量“keylist” 被放入eax寄存器:

testProject.dpr.34: keylist_open(@keylist);
004D16A2 B804B04D00       mov eax,$004db004
004D16A7 E8ECC6FFFF       call keylist_open
然后

再跳一跳

libLib.keylist_open:
5B364508 E903A23D00       jmp $5b73e710
但是dll(我不知道这是哪个函数,某个入口点或键列表例程)存在

似乎eax中的eax参数正在被覆盖。 两行之后,动态调用的代码是:

testProject.dpr.37: keylist_openDynamic(@keylist);

004D16CE 6804B04D00       push $004db004
004D16D3 FF15F0564D00     call dword ptr [$004d56f0]
跳到

libLib.keylist_open:
5B364508 E903A23D00       jmp $5b73e710
也就是说,是同一个代码。但由于参数现在不存储在eax中,因此覆盖eax并不重要


call Anywhere在这里说明了问题所在,即我的静态代码有什么问题以及原因?

这两个版本在调用约定上有所不同。运行时链接变量使用
stdcall
,加载时链接变量使用
寄存器


让通话约定匹配,一切都会好起来。

老鼠!就这样!不应该依赖于delphi教程,它链接了delpih dll,所以认为stdcall只用于动态链接:(…非常感谢!!
5B73E710 55               push ebp
5B73E711 8BEC             mov ebp,esp
5B73E713 81ECDC000000     sub esp,$000000dc
5B73E719 53               push ebx
5B73E71A 56               push esi
5B73E71B 57               push edi
5B73E71C 8DBD24FFFFFF     lea edi,[ebp-$000000dc]
5B73E722 B937000000       mov ecx,$00000037
5B73E727 B8CCCCCCCC       mov eax,$cccccccc
...
testProject.dpr.37: keylist_openDynamic(@keylist);

004D16CE 6804B04D00       push $004db004
004D16D3 FF15F0564D00     call dword ptr [$004d56f0]
libLib.keylist_open:
5B364508 E903A23D00       jmp $5b73e710