开发者社区 问答 正文

.exe和.dll之间共享变量

我正在创建使用LoadLibrary()加载外部dll的应用程序。然后,我通过GetProcAddress()加载函数和变量。函数被调用,变量被加载。

但是我想这样做,例如,我在DLL中得到的int为5,我将其加载到.exe中,然后在该.exe中将其设置为10。但是当我在DLL中删除该int时,它显示为5并在中。 exe会显示10。所以这意味着变量不会共享,而我只是在加载值。

有人知道我该怎么做吗?

C ++ Windows

展开
收起
Puppet 2019-12-17 15:56:51 417 分享 版权
阿里云 AI 助理回答

在Windows环境下,通过LoadLibraryGetProcAddress使用DLL时,确实如您所观察到的,变量默认不会在调用进程(.exe)与DLL之间共享。这是因为每个进程都有自己的独立内存空间,当您从DLL加载一个整数变量时,实际上是复制了该变量的值到您的进程中。

如果您希望在.exe和DLL之间共享数据,有几种方法可以实现:

  1. 使用共享内存:您可以使用Windows API中的共享内存功能,如CreateFileMappingMapViewOfFile来创建一块可以在不同进程间共享的内存区域。这样,无论是在.exe还是DLL中修改这块内存的内容,对双方都是可见的。

  2. 全局原子变量:虽然不推荐用于复杂的数据结构,但对于简单的整数等基本类型,可以考虑使用CreateMutexOpenMutexReleaseMutex等API配合全局原子变量进行同步和共享。

  3. COM组件:如果情况允许,设计一个COM组件可以提供更高级别的接口来进行跨进程通信和数据共享。

  4. 内存映射文件:除了直接的共享内存外,还可以通过创建内存映射文件来实现进程间的共享数据。这种方式同时支持磁盘持久化。

  5. 套接字或管道:对于更复杂的交互,可以通过命名管道或者TCP套接字在进程间传递信息,但这通常用于更高级的通信场景。

  6. 动态链接库导出全局变量:理论上,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;
}

请注意,在实际应用中,您还需要确保正确管理共享资源的生命周期,并处理好并发访问的同步问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: