【问题标题】:DLL shared memory problems with different session, service and user session不同会话、服务和用户会话的 DLL 共享内存问题
【发布时间】:2012-05-31 05:08:38
【问题描述】:

首先,感谢您阅读此内容:)

我使用 DLL 共享内存并使用联锁〜功能。 (赢 7)

服务 exe 和用户应用 exe 加载的 DLL。

你知道,服务会话是 0,用户会话是 1 如此不同。

如果 DLL 的共享内存值被用户应用程序 exe 更改,则不反映服务的 DLL 共享内存值。

有没有办法同步服务和用户应用的 DLL 共享内存?

【问题讨论】:

  • 不使用命名文件映射。使用 dll 的共享部分。
  • DLL 共享内存是一项遗留功能。你不应该使用它。

标签: windows session sync shared


【解决方案1】:

共享部分不再跨会话边界工作。微软认为这是一个安全问题,并故意破坏了该功能,如果没记错的话,这是很久以前的事了。我相信现在每个会话都会看到它自己的部分的私有副本。

但是内存映射文件 (MMF) 可以正常工作,我现在使用它来代替共享部分。唯一的缺点是必须以高权限创建全球可用的 MMF,因此我使用服务来创建 MMF。

【讨论】:

    【解决方案2】:

    尝试使用全局共享内存。 Microsoft's documentation 说:

    在文件映射对象名称前加上“Global\”允许 进程相互通信,即使它们在不同的 终端服务器会话。

    【讨论】:

    • 我使用下面的代码#pragma data_seg ("/SECTION:.MYSEC,RWS") int i = 0; char a[32]n = "你好世界"; #pragma data_seg() 你的意思是“.MYSEC”到“Global\.MYSEC”吗?
    • 您不能使用 dll 共享数据段跨会话共享。
    【解决方案3】:

    不要忘记credentials 在跨会话共享内存时也起作用。

    这要求第一个进程必须具有 SeCreateGlobalPrivilege 权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2018-06-25
      相关资源
      最近更新 更多