OpenFileMapping() 找不到在 COM DLL 中创建的 MMF

Posted

技术标签:

【中文标题】OpenFileMapping() 找不到在 COM DLL 中创建的 MMF【英文标题】:OpenFileMapping() can't find MMF created in COM DLL 【发布时间】:2015-07-13 21:58:21 【问题描述】:

上下文

我试图在运行时将图像数据从 C++ .exe 应用程序发送到作为 COM DLL 实现的 DirectShow 源过滤器。为此,我尝试使用内存映射文件执行 IPC,使用从here 获取的代码的略微修改版本。所有客户端和服务器都使用相同的ipc.cipc.h

hFile = INVALID_HANDLE_VALUE,我允许使用外部字符串来设置lpName

服务器

我将DLL调试器设置为Command -> lync.exeDebugger Type -> Mixed,让我可以调试过滤器的实际使用。服务器创建(具有函数作用域的静态实例)成功并返回一个有效句柄。

HRESULT CVSourceStream::FillBuffer(IMediaSample *pms) 
    static osIPC::Server server(IPC_SERVER_ADDR); // filename shared by client/server   
    ... // set timestamp on sample
    BYTE *pData;
    pms->GetPointer(&pData);
    server.read(&pData, IPC_BLOCK_SIZE);
    return S_OK;

客户

但是,当我在应用程序中创建osIPC::Client 实例时尝试打开文件映射时,OpenFileMapping() 调用失败并返回NULL,最后一个错误代码为ERROR_FILE_NOT_FOUND

osIPC::Client client(IPC_SERVER_ADDR); // class instance member

测试

为了测试,我编写了一对轻量级的客户端/服务器 Visual Studio 解决方案,每个解决方案都有相应的初始化类型(非静态/静态)。每个解决方案基本上只是一个main(),它创建osIPC::ClientosIPC::Server,然后传递字节缓冲区。到这里,OpenFileMapping() 调用成功了。

将我的应用程序与轻量级服务器结合运行成功,但将 DLL 与轻量级客户端结合失败,导致我怀疑过滤器导致问题。

我尝试将Global\\ 附加到传递给CreateFileMapping() 调用的文件名以使用全局命名空间,但没有结果。

问题

TL;DR: 有没有清楚的解释为什么我的 DLL 中由 Lync.exe 加载的CreateFileMapping() 创建的内存映射文件对我的客户端应用程序似乎不可见,导致@ 987654341@ 失败,错误代码为ERROR_FILE_NOT_FOUND

【问题讨论】:

Codeproject.com 代码始终缺少“仅适用于我的机器”标签。 (LPCWSTR)m_sMemName 是非常糟糕的代码。不要在上面浪费时间。 感谢您的提醒。我一直在努力为我的实习快速学习 Windows/COM。通读这篇文章时,我发现非 Windows 的设计相当合理。您对如何修复 Windows 接口代码有什么建议吗?还是我应该从头开始构建解决方案? 【参考方案1】:

正如@Hans Passant 所指出的,引用的代码从char *LPWSTR 进行了不安全的类型转换。通过明确指定我自己的 Unicode 字符串并调整 osIPC::ClientosIPC::Server 的构造函数和内部变量类型,我设法让 IPC 正常工作。

根据是否将UNICODE 定义为宏和其他一些项目设置,这会导致整个代码出现不可预测的行为。

【讨论】:

以上是关于OpenFileMapping() 找不到在 COM DLL 中创建的 MMF的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio:找不到 jp.co.cyberagent.android:gpuimage:2.0.4

找不到业力覆盖

Heroku bash:节点:找不到命令

/hibernate.cfg.xml 在 Intellij 中找不到

在 Android Studio 中找不到 JDBC 类

分享链接时找不到 Facebook 显示页面