c# - 在 Windows 7 中使用 VC++ 和 C# 中的 MemoryMappedFiles 或命名管道进行进程间通信

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

我正在尝试在 VC++ DLL 和 C# 应用程序之间进行通信。我已经阅读了大量的资源和 Material ,我尝试同时使用 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();

我的问题是,无论我使用哪种方法,打开调用总是返回“找不到文件”错误。这些应用程序都在我的 64 位 Windows 7 上以相同的用户帐户运行。我在这里缺少什么?

最佳答案

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

那行不通,您不能将 char* 转换为宽字符串,需要进行转换。但这里没有必要,因为这是一个字符串文字。通过前缀 L 使其成为 unicode 文字

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

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

关于c# - 在 Windows 7 中使用 VC++ 和 C# 中的 MemoryMappedFiles 或命名管道进行进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5425141/

相关文章:

c# - 对等网络应用程序的网络发现

c# - 默认值设置为 0 的 SqlParameter 无法按预期工作

c# - HidLibrary,从 USB 设备获取序列号

c++ - 如何在 C++ 中使用复杂变量数组?

.net - C+C# 进程间通信 : Named Pipes, 内存映射文件还是其他?

c# - IProgress<T> 不会在当前上下文中触发事件

c++ - 尽管没有库依赖性,但编译 cryptopp 时 MT/MD 不匹配

c++ - 以编程方式在 Windows 中获取事件连接

c++ - boost 共享内存。当前有多少进程正在使用共享内存?

c - 派生一个不使用自己的内存副本的子进程