我正在尝试在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上的相同用户帐户下运行。我在这里缺少什么?
答案 0 :(得分:4)
::CreateFile((LPCWSTR)"\\\\.\\pipe\\myPipe", ...)
这不起作用,你不能将char *强制转换为宽字符串,需要进行转换。但这里没有必要,因为这是一个字符串文字。通过为L
添加前缀使其成为unicode文字::CreateFile(L"\\\\.\\pipe\\myPipe", ...)
与MMF相同的问题。还要考虑使用进程外通信机制与DLL通信没有多大意义。只需在进程中加载它。使用pinvoke或C ++ / CLI包装器。