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

Posted

技术标签:

【中文标题】在 Windows 7 中使用 VC++ 和 C# 中的 MemoryMappedFiles 或命名管道进行进程间通信【英文标题】:Inter-process communication using MemoryMappedFiles or Named Pipes in VC++ and C# in Windows 7 【发布时间】:2011-03-24 20:32:04 【问题描述】:

我正在尝试在 VC++ DLL 和 C# 应用程序之间进行通信。我已经阅读了大量的资源和材料,我尝试使用 MemoryMapped 文件和管道来完成它,但不幸的是我无法开始工作。

以下是我如何创建用 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】:
::CreateFile((LPCWSTR)"\\\\.\\pipe\\myPipe", ...)

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

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

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

【讨论】:

非常感谢,问题解决了。 dll是由另一个进程加载的,我想我没有其他选择了。

以上是关于在 Windows 7 中使用 VC++ 和 C# 中的 MemoryMappedFiles 或命名管道进行进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

在VC中获取Windows XP,Windows 7当前登录用户名[关闭]

在 Windows 7 中构建的 VC++ 程序不能在 Windows Xp 上运行

在Windows系统中使用VC9VC11编译32位64位PHP及其扩展

在 Windows (VC90) 中使用 C 绑定构建 Python 包导致 LNK1181 致命错误

VC6.0和VS2005:C++和C#编写调用COM组件

如何从 mp4 容器中获取 aac 音频? (Windows 电话 7 和 C#)