在UWP和桌面应用之间共享命名互斥量

6
有没有办法在同一个包中的UWP应用和桌面桥接应用之间共享互斥量?它们似乎有不同的命名空间;使用相同的名称在进程之间不能产生相同的对象。根据WinObj,UWP应用程序的对象存储在特殊的命名空间下AppContainerNamedObjects\{APP_SID},而不是像通常一样存储在BaseNamedObjects下。然而,尽管从同一个应用程序包运行,桌面应用程序仍然使用BaseNamedObjects命名空间,因此两个进程无法共享同步对象。
有没有解决这个问题的方法?我想到的最好的方法涉及到检查文件是否存在,但这既过于复杂又性能低下。互斥量简单、快速,专为此使用情况(跨进程同步)设计;难道它们在这里不能使用吗?

你解决了这个问题吗? - Benni
@Benni 不完全是这样。桌面应用程序可以访问AppContainerNamedObjects命名空间(及其子命名空间),但这是一种完全的黑客方式;根据MSDN,您不应该在互斥体名称中使用路径分隔符,并且很容易编写代码以处理存储或桌面应用程序可靠地首先启动的情况,但对于任何一个可能的情况都有点棘手。 - CBHacking
桌面应用程序如何访问AppContainerNamedObjects名称空间?有什么完整的解决方案吗?我只需要这个来进行测试,而不是用于生产应用程序。 - eric frazer
使用 Sysinternals 的 “winobj”,您可以找到用于 AppContainerNamedObjects 的路径。如果我没记错的话,它在“BaseNamedObjects”的子目录中(我现在不在 Windows 上)。您可以通过在对象名称中添加“\”字符来访问或创建该路径,就像对文件一样,尽管 MSDN 表示不能访问或创建该路径。对象路径将被视为相对于“BaseNamedObjects”。请注意奇怪的行为,例如 UWP 应用程序可能无法打开由桌面应用程序创建的对象,并且如果 UWP 没有运行,则路径将不存在。 - CBHacking
编辑上面的评论:您可以通过在对象名称中添加 \\ 字符来实现,就像处理文件名一样。 - CBHacking
1个回答

2
你可以在UWP和桌面之间共享互斥量,但我不知道这是否是一种技巧。我知道,我刚刚尝试过了。在C++方面,您调用CreateMutex,然后(某种方式),通过进程间通信得知UWP应用程序的PID。然后,您使用SYNCHRONIZE访问权限调用DuplicateHandle以获取您创建的互斥量的句柄。然后,您将这些句柄ID传递给现在拥有该互斥量并且可以等待它的UWP应用程序。在UWP应用程序中,您需要创建互斥量,然后使用您传递给它的互斥量ID调用SetSafeWaitHandle()。虽然有点技巧性,但似乎可以工作。我无法弄清楚为什么它不能用于AutoResetEvents。疯狂。

这个方法可行,但需要先启动Win32应用程序(或者至少在Win32应用程序启动之前UWP应用程序不需要使用互斥量),并且需要已经建立了应用程序之间的IPC通道。 - CBHacking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接