我在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