我在C#中有两个exe,一个是vC++ exe。这两个exe都需要访问一个文件。在c#exe中创建命名互斥并在C++中访问它一个dll
所以我打算在c#中创建一个命名互斥体。 vC++我怎样才能访问这个命名互斥体。任何一个可以给我的范例代码,这
我在C#中有两个exe,一个是vC++ exe。这两个exe都需要访问一个文件。在c#exe中创建命名互斥并在C++中访问它一个dll
所以我打算在c#中创建一个命名互斥体。 vC++我怎样才能访问这个命名互斥体。任何一个可以给我的范例代码,这
事情是这样的:
HANDLE hMutex = CreateMutex(NULL, FALSE, name);
if (hMutex == NULL) {
// Handle failure.
}
如果您需要知道互斥锁是否已经存在,请检查hMutex != null && GetLastError() == ERROR_ALREADY_EXISTS
。
对于两个进程在同一个会话中的情况,您得到的默认ACL应该是正确的,否则您需要设置适当的ACL。
如果您已经创建了C#中的互斥体,你的C++代码会是这样的:在C++代码
HANDLE mutexHandle = OpenMutex(SYNCHRONIZE,0,"NameOfYourMutex");
if(mutexHandle == 0) {
//handle error
}
谢谢谢谢谢谢你!我的错误是在C#中创建互斥锁,然后在C++中调用CreateMutex。在C++中没有错误,它的处理就好像它是一个新的互斥体 - 与来自C#的互斥体无关。但OpenMutex的作品!他们使用相同的互斥体。 – 2016-09-03 00:01:37
这可能是一篇很好的文章,以“管理/非托管代码互操作性概述”开头,您可以在这里查看:http://msdn.microsoft.com/en-us/library/ms973872.aspx – Lazarus 2010-02-18 12:54:19
添加样本:不要让“命名空间”咬你。我以前在终端服务应用程序中遇到过问题,因为我没有想到(也没有正确阅读)互斥体名称可以包含范围 - 对于我来说,我需要用“Global \ MyMutex”替换“MyMutex”。 – 2010-02-18 14:11:42
@Benjamin:所有(Win2k及更高版本)命名对象现在被限定为会话或全局。要创建全局命名的对象,需要特定的用户权限(普通用户帐户无法执行此操作)。这就是为什么我在回答中避免了整个ACL问题的一部分:-)。 – Richard 2010-02-18 14:54:47