我正在创建使用LoadLibrary()加载外部dll的应用程序。然后,我通过GetProcAddress()加载函数和变量。函数被调用,变量被加载。
但是我想这样做,例如,我在DLL中得到的int为5,我将其加载到.exe中,然后在该.exe中将其设置为10。但是当我在DLL中删除该int时,它显示为5并在中。 exe会显示10。所以这意味着变量不会共享,而我只是在加载值。
有人知道我该怎么做吗?
C ++ Windows
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Windows环境下,通过LoadLibrary
和GetProcAddress
使用DLL时,确实如您所观察到的,变量默认不会在调用进程(.exe)与DLL之间共享。这是因为每个进程都有自己的独立内存空间,当您从DLL加载一个整数变量时,实际上是复制了该变量的值到您的进程中。
如果您希望在.exe和DLL之间共享数据,有几种方法可以实现:
使用共享内存:您可以使用Windows API中的共享内存功能,如CreateFileMapping
和MapViewOfFile
来创建一块可以在不同进程间共享的内存区域。这样,无论是在.exe还是DLL中修改这块内存的内容,对双方都是可见的。
全局原子变量:虽然不推荐用于复杂的数据结构,但对于简单的整数等基本类型,可以考虑使用CreateMutex
、OpenMutex
、ReleaseMutex
等API配合全局原子变量进行同步和共享。
COM组件:如果情况允许,设计一个COM组件可以提供更高级别的接口来进行跨进程通信和数据共享。
内存映射文件:除了直接的共享内存外,还可以通过创建内存映射文件来实现进程间的共享数据。这种方式同时支持磁盘持久化。
套接字或管道:对于更复杂的交互,可以通过命名管道或者TCP套接字在进程间传递信息,但这通常用于更高级的通信场景。
动态链接库导出全局变量:理论上,DLL可以导出全局变量,但直接操作这些变量需要非常小心处理多线程访问和同步问题,且不是最佳实践,因为这可能导致不可预测的行为,尤其是在多线程环境中。
考虑到您的需求是简单地共享一个整数值,使用共享内存可能是最直接有效的方法。下面是一个简化的共享内存示例代码片段:
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
TEXT("MySharedMemory")); // name of mapping object
if (hMapFile == NULL)
{
printf("Could not open file mapping object (%d).\n", GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(int));
if (pBuf == NULL)
{
printf("Could not map view of file (%d).\n", GetLastError());
CloseHandle(hMapFile);
return 1;
}
// 修改共享内存中的值
*(int*)pBuf = 10;
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
请注意,在实际应用中,您还需要确保正确管理共享资源的生命周期,并处理好并发访问的同步问题。