2011-03-24 51 views
1

我試圖在VC++ DLL和C#應用程序之間進行通信。我已經閱讀了大量的資源和材料,我試圖用MemoryMapped文件和Pipes來做,但不幸的是我無法工作。在Windows 7中使用MemoryMappedFiles或命名管道在VC++和C#中的進程間通信

下面是如何創建C#編寫的 「接收器」/服務器部分:

// MemoryMappedFile approach 
mmf = MemoryMappedFile.CreateNew(
      @"myMMF", 
      1024*1024, 
      MemoryMappedFileAccess.ReadWriteExecute); 

// Named Pipe approach 
NamedPipeServerStream pipe = new NamedPipeServerStream("myPipe", PipeDirection.InOut); 

這是用VC++對方:

// MMF approach 
HANDLE fmap = ::OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, false, (LPCWSTR)"myMMF"); 
if(fmap == NULL) 
    return errorMsg(); 

// Named pipe 
HANDLE pipe = ::CreateFile((LPCWSTR)"\\\\.\\pipe\\myPipe", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 
if(pipe == INVALID_HANDLE_VALUE) 
    return errorMsg(); 

我的問題是,不管哪一種方式我用,打開的調用總是返回「文件未找到」錯誤。這些應用程序都在我的64位Windows 7上以相同的用戶帳戶運行。我在這裏錯過了什麼?

+1

演員們都是壞人,好嗎? – 2011-03-24 21:04:23

回答

4
::CreateFile((LPCWSTR)"\\\\.\\pipe\\myPipe", ...) 

這是行不通的,你不能將char *轉換爲寬字符串,需要轉換。但這裏沒有必要,因爲這是一個字符串文字。通過加前綴使其成爲unicode文字L

::CreateFile(L"\\\\.\\pipe\\myPipe", ...) 

與MMF相同的問題。還要考慮使用進程外通信機制與DLL進行通信沒有多大意義。只是在進程中加載​​它。使用pinvoke或C++/CLI包裝器。

+0

非常感謝,解決了這個問題。該DLL由另一個進程加載,我想我沒有任何其他選項。 – svens 2011-03-24 21:16:12

相關問題