1

VC ++ DLLとC#アプリケーションの間で通信しようとしています。たくさんのリソースと資料を読んだので、MemoryMappedファイルとPipesの両方でそれをやろうとしましたが、残念ながら仕事に取り掛かることができませんでした。

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();

私の問題は、どのアプローチを使用しても、open呼び出しは常に「ファイルが見つかりません」というエラーを返すことです。アプリケーションは両方とも、64ビットWindows 7の同じユーザーアカウントで実行されます。ここで何が欠けていますか?

4

1 に答える 1

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

char* をワイド文字列にキャストすることはできません。変換が必要です。ただし、これは文字列リテラルであるため、ここでは必要ありません。L をプレフィックスとして Unicode リテラルにします

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

MMFと同じ問題。また、プロセス外通信メカニズムを使用して DLL と対話することはあまり意味がないことも考慮してください。インプロセスでロードするだけです。pinvoke または C++/CLI ラッパーを使用します。

于 2011-03-24T20:54:52.553 に答える