2010-02-18 88 views
0

我在C#中有两个exe,一个是vC++ exe。这两个exe都需要访问一个文件。在c#exe中创建命名互斥并在C++中访问它一个dll

所以我打算在c#中创建一个命名互斥体。 vC++我怎样才能访问这个命名互斥体。任何一个可以给我的范例代码,这

+0

这可能是一篇很好的文章,以“管理/非托管代码互操作性概述”开头,您可以在这里查看:http://msdn.microsoft.com/en-us/library/ms973872.aspx – Lazarus 2010-02-18 12:54:19

+0

添加样本:不要让“命名空间”咬你。我以前在终端服务应用程序中遇到过问题,因为我没有想到(也没有正确阅读)互斥体名称可以包含范围 - 对于我来说,我需要用“Global \ MyMutex”替换“MyMutex”。 – 2010-02-18 14:11:42

+0

@Benjamin:所有(Win2k及更高版本)命名对象现在被限定为会话或全局。要创建全局命名的对象,需要特定的用户权限(普通用户帐户无法执行此操作)。这就是为什么我在回答中避免了整个ACL问题的一部分:-)。 – Richard 2010-02-18 14:54:47

回答

1

事情是这样的:

HANDLE hMutex = CreateMutex(NULL, FALSE, name); 
if (hMutex == NULL) { 
    // Handle failure. 
} 

如果您需要知道互斥锁是否已经存在,请检查hMutex != null && GetLastError() == ERROR_ALREADY_EXISTS

对于两个进程在同一个会话中的情况,您得到的默认ACL应该是正确的,否则您需要设置适当的ACL。

1

如果您已经创建了C#中的互斥体,你的C++代码会是这样的:在C++代码

HANDLE mutexHandle = OpenMutex(SYNCHRONIZE,0,"NameOfYourMutex"); 
if(mutexHandle == 0) { 
    //handle error 
} 
+0

谢谢谢谢谢谢你!我的错误是在C#中创建互斥锁,然后在C++中调用CreateMutex。在C++中没有错误,它的处理就好像它是一个新的互斥体 - 与来自C#的互斥体无关。但OpenMutex的作品!他们使用相同的互斥体。 – 2016-09-03 00:01:37