使用VC ++中的MemoryMappedFiles或命名管道以及Windows 7中的C#进行进程间通信

时间:2011-03-24 20:32:05

标签: c# visual-c++ ipc named-pipes memory-mapped-files

我正在尝试在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上的相同用户帐户下运行。我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

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

这不起作用,你不能将char *强制转换为宽字符串,需要进行转换。但这里没有必要,因为这是一个字符串文字。通过为L

添加前缀使其成为unicode文字
::CreateFile(L"\\\\.\\pipe\\myPipe", ...)

与MMF相同的问题。还要考虑使用进程外通信机制与DLL通信没有多大意义。只需在进程中加载​​它。使用pinvoke或C ++ / CLI包装器。