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

在UWP和桌面应用程序之间共享命名互斥,uwp,synchronization,mutex,desktop-bridge,Uwp,Synchronization,Mutex,Desktop Bridge,有没有办法在同一个软件包中的UWP应用程序和桌面网桥应用程序之间共享互斥?它们似乎有不同的名称空间;使用相同的名称不会在进程之间产生相同的对象。根据WinObj,UWP应用程序的对象存储在AppContainerNamedObjects\{app_SID}下的特殊名称空间中,而不是像往常一样存储在BaseNamedObjects下。但是,桌面应用程序(尽管从同一个应用程序包运行)确实使用BaseNamedObjects命名空间,因此这两个进程不能共享同步对象 这有什么办法吗?我所想到的最好的方法

有没有办法在同一个软件包中的UWP应用程序和桌面网桥应用程序之间共享互斥?它们似乎有不同的名称空间;使用相同的名称不会在进程之间产生相同的对象。根据
WinObj
,UWP应用程序的对象存储在
AppContainerNamedObjects\{app_SID}
下的特殊名称空间中,而不是像往常一样存储在
BaseNamedObjects
下。但是,桌面应用程序(尽管从同一个应用程序包运行)确实使用
BaseNamedObjects
命名空间,因此这两个进程不能共享同步对象


这有什么办法吗?我所想到的最好的方法是检查文件是否存在等愚蠢的事情,但这既过于复杂,又表现不佳。互斥锁是简单、快速的,并且正是针对这个用例设计的(跨进程的同步);它们就不能在这里使用吗?

你可以在UWP和桌面之间共享互斥,尽管我不知道这是否是一种黑客行为。我知道,我刚试过。在C++侧,您调用CeaReMutEx,然后(不知何故),通过进程间通信,UWP应用程序的PID被告知。然后,在创建的互斥体上使用同步访问调用DuplicateHandle。然后,您将这些句柄ID传递给UWP应用程序,该应用程序现在拥有互斥锁并可以对其进行等待。在UWP应用程序中,您需要创建互斥体,然后使用传递的互斥体ID对其调用SetSafeWaitHandle()。这很粗糙,但似乎有用。我不明白的是为什么它对自动事件不起作用。疯狂。

你解决了这个问题吗?@Benni不完全是,不。桌面应用程序可以访问AppContainerNameObjects名称空间(及其子名称空间),但这完全是一个黑客行为;根据MSDN,互斥体名称中不应该有路径分隔符,而且对于商店或桌面应用程序首先可靠启动的情况很容易编写代码,但对于其中任何一个启动的时间都有点棘手。桌面应用程序如何访问AppContainerNamedObjects命名空间?什么是总黑客?我需要它只是为了测试,不是为了生产应用程序。@ericfrazer使用Sysinternals中的
winobj
,您可以找到用于AppContainerNameObjects的路径。它位于IIRC的
BaseNamedObjects
子目录中(我现在不在Windows框中)。您可以(即使MSDN说您不能)通过在对象名称中添加
`字符来访问或创建该路径,就像您对文件所做的那样。对象路径将被视为相对于
BaseNamedObjects`。注意奇怪的行为,如UWP应用程序可能无法打开由桌面应用程序创建的对象,并且如果UWP未运行,路径将不存在。编辑上述注释:您可以通过在对象名称中添加“\”字符来完成此操作,就像文件一样。这是可行的,但需要先启动Win32应用程序(或者至少,在Win32应用程序启动之前,UWP应用程序不需要互斥),并且应用程序之间已经有IPC通道。