我可以将dll加载到共享内存中吗
Can I load a dll into shared memory?
我可以从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);
通过IPC共享dll是正确的方法吗?我可以在读取器接口访问DLL中定义的函数吗?
根据定义,不可能从64位代码中调用32位函数。处理器在32位和64位模式下的表现不同。通过将代码段选择器分别设置为32位和64位模式,操作系统可以为32位应用程序和64位应用程序做不同的事情,但这对整个应用程序来说是一个很大的切换。
-
32位调用与64位代码具有不同的调用约定。(64位模式为所有调用的前5-6个自变量使用寄存器,32位模式仅为3个自变量,而不是为所有函数使用寄存器)。一般寄存器的用法(哪些寄存器用于什么)是不同的,所以需要保留在32位的寄存器不需要保留在64位的寄存器,等等
-
32位操作清除64位寄存器的上部,不管它们是否愿意。因此,仅仅将
eax
设置为5
就会改变eax
的高64位,而32位代码甚至不知道这一点。 -
64位模式下的指针是在整个64位范围内分配的[嗯,47位,但仍比32多15位],因此即使不存在任何其他问题,您也无法将任何指针传递给被调用的代码。
-
带有寄存器操作数的
push
和pop
指令现在是64位的(不管你是否想要),所以32位代码保存寄存器时会认为它们占用了4个字节的堆栈,而它们将占用8个字节,这意味着在被调用的函数中,堆栈指针计算的任何偏移量都将是错误的,包括公共序列:push ebp
和mov ebp, esp
,CCD_ 8的值现在是错误的。 -
某些指令已不再可用或仅以其替代形式可用。特别是,字节值0x40-0x4f是64位指令的"前缀",而不是它们过去的指令。
-
任何来自"导入代码"的调用都将被视为64位,因此操作系统调用、C库调用等将无法正常工作。
当然,您可以读取文件,将其转录为64位模式,但这将需要大量的工作来找到一个理解代码并能够翻译它的翻译器(因为你需要知道什么是实际的代码,以及什么是切换语句或嵌入代码段中的文本字符串的跳转表,这些不应该被翻译,至少不应该以同样的方式翻译)。
很可能将代码重新编译为64位会容易10倍。或者将64位应用程序重新编译为32位(这几乎可以肯定是EASIEST选项)。
如果你不能将这个dll重新编译为64位,那么你唯一的选择确实是IPC,但不是你描述它的方式。你必须编写额外的应用程序,让它命名为dllwrapper32.exe,它将加载你的32位dll,并使用一些IPC方法公开它的接口。您的64位应用程序将使用此IPC方法通过dllwrapper32.exe进程与32位dll通信。
你也可以写64位dll包装器,它将在64位进程和dllwrapper32.exe之间进行通信
^-- loads ----> [32 bit dll]
/
[dllwrapper32.exe] <---- IPC -----> [64 bit process]
现在有64位包装器dll:
^-- loads ----> [32 bit dll]
/
[dllwrapper32.exe] <---- IPC -----> [64 bit wrapper dll]
/
[64 bit process] - loads ----'
IPC可以是你想要的东西:
- 剪贴板
- COM
- 数据复制
- DDE
- 文件映射
- 邮件槽
- 管道
- RPC窗口
- 插座
我想COM会被推荐。
所以最后——做了很多工作。
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- Directx 12 :在两个进程之间共享图形内存
- 有没有办法列出所有共享内存对象的名称?
- 子进程更新共享 mmap 内存,但父进程没有更改
- C++线程之间的内存共享
- 使用Windows共享内存共享小数据
- 更有效地使用fork()和写时复制内存共享
- 从托管代码到非托管代码跨共享内存共享整数数组
- 通过内存共享c++对象
- 内存共享;继承;基实例和派生实例;c++
- Matlab与c++在MEX中的内存共享
- 跨共享内存共享 std::字符串