Rah*_*ngh 3 c++ windows dll 32bit-64bit
我从64位应用程序访问32位dll.为此,我使用共享内存IPC,我做了类似的事情
TCHAR szName[]=TEXT(Path of DLL on local machine);
TCHAR szMsg[]=TEXT("abc");
HANDLE file = CreateFile(szName,
GENERIC_READ,
0,
NULL,
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
Run Code Online (Sandbox Code Playgroud)
这是通过IPC共享DLL的正确方法吗?我可以在阅读器界面访问DLL内定义的函数吗?
根据定义,不可能从64位代码调用32位函数.处理器在32位和64位模式下的行为不同.通过将代码段选择器分别设置为32位和64位模式,操作系统可以为32位和64位应用程序执行不同的操作,但这对于整个应用程序来说是一个很大的开关.
32位调用与64位代码具有不同的调用约定.(64位模式使用寄存器用于所有调用的前5-6个参数,32位模式仅使用3个参数,而不是所有函数).通用寄存器用法(哪些寄存器用于什么)是不同的,因此需要以32位保留的寄存器不需要64位位,依此类推.
32位操作清除64位寄存器的上半部分,无论它们是否需要.所以只需设置eax为5将改变高位64位eax,而32位代码甚至不存在知识.
64位模式的指针分配在完整的64位范围内[好,47位,但仍然比32位多15位],因此您将无法将任何指针传递给被调用的代码,即使没有一个其他问题存在.
push和pop与寄存器操作数的指令现在是64位(不管是否希望或不),所以在32位的代码将保存寄存器以为他们占用4个字节堆栈的,而且他们会占用8,这意味着从任何偏移堆栈指针计算在被调用函数内部将是错误的 - 包括公共序列:push ebp并且mov ebp, esp,esp现在的值是错误的.
某些说明不再可用,或仅以其他形式提供.特别是,字节值0x40-0x4f是64位指令的"前缀",而不是它们以前的指令.
来自"导入代码"的任何调用都将被视为64位,因此操作系统调用,C库调用等将无法正常工作.
当然,您可以阅读该文件,将其转录为64位模式,但这需要大量的工作来提供一个理解代码并可以将其翻译的翻译器(因为您需要知道什么是实际的代码,例如,嵌入在代码段中的switch语句或文本字符串的跳转表,不应该被翻译,至少不是以相同的方式翻译.
最有可能的是,将代码重新编译为64位更容易10倍.或者将您的64位应用程序重新编译为32位(几乎可以肯定是EASIEST选项).
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |