Windows 动态和静态DLL链接是不同的
我有一个C DLL,想从Delphi XE3 Update 2调用它。 奇怪的是,在我的项目中,动态调用它似乎不同于静态调用它。下面是要复制的“最小”代码(我已更改了库/函数名): 输出是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);
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