以下一段是32位ASM代码
.386
.model flat
option prologue:none
option epilogue:none
option dotname
.code
align DWORD
DllMain proc stdcall public, instance:DWORD, reason:DWORD, reserved:DWORD
mov eax, 1 ; success
ret 12
DllMain endp
align DWORD
InvokeFunc proc stdcall public, funcptr:DWORD
pop ecx ; save return address
pop edx ; Get function pointer
push ecx ; Restore return address
jmp edx ; Transfer control to the function pointer
InvokeFunc endp
end
但编译后的 DLL 不能运行于Win7/64位系统中.
所使用的编译文件内容如下:
MLFLAGS = /c /coff /Cp /Fl /Sc /Sg
All: Invoke.dll UnitTest.exe
Clean:
[email protected] exist Invoke.obj erase Invoke.obj
[email protected] exist Invoke.dll erase Invoke.dll
[email protected] exist Invoke.lib erase Invoke.lib
[email protected] exist Invoke.exp erase Invoke.exp
[email protected] exist Invoke.lst erase Invoke.lst
[email protected] exist UnitTest.exe erase UnitTest.exe
Invoke.obj: Invoke.asm
ml $(MLFLAGS) $**
Invoke.dll: Invoke.obj
link $** -DLL -entry:DllMain /machine:i386 /subsystem:windows /out:Invoke.dll /export:InvokeFunc
UnitTest.exe: UnitTest.cs
csc $**
有关详细信息,来自 CodeProject:
http://www.codeproject.com/Articles/1557
请大拿们帮助解决一下如何编译成一个可在64位上运行的 DLL。
64位 asm 32位
------解决方案--------------------
试试:
HINSTANCE typedef qword
LPVOID typedef qword
.code
align DWORD
DllMain proc public, instance: HINSTANCE, reason: DWORD, reserved: LPVOID
mov rax, 1 ; success
ret
DllMain endp
align DWORD
InvokeFunc proc public, funcptr: LPVOID
jmp rcx ; Transfer control to the function pointer
InvokeFunc endp
end
------解决方案--------------------
因为Dll是32位的,而UnitTest.exe是Net程序,在64位系统下默认是64位的程序,而64位程序不能调用32位DLL……你可以用.config文件来指定UnitTest.exe运行在32位下
------解决方案--------------------
我无法修改上面那个楼层的内容,所以只能再回复一次了
如果修改ASM代码,4楼的代码正确,用64位的ML编译下,另Link参数要修改一下,/machine:x64
下面是4楼的代码,我只是添加个注释帮助楼主理解下(注意:.386一定要去掉,.model也去掉)
HINSTANCE typedef qword ;64位下,Pointer、Handle都为8个字节,即qword
LPVOID typedef qword
.code
align DWORD
DllMain proc public, instance: HINSTANCE, reason: DWORD, reserved: LPVOID
mov rax, 1 ; success
ret
DllMain endp
align DWORD
InvokeFunc proc public, funcptr: LPVOID
jmp rcx ;64位下,参数传递分别为--第1个用RCX,第2个用RDX,第3个用r8,第4个用r9,第5+用stack
;所以funcptr参数就是rcx,直接jmp就行了
InvokeFunc endp
end
还有一种方法就是我在楼上所说的,用.config文件指定UnitTest.exe运行在32位的net framework下