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

标签 c++ dll com ipc memory-mapped-files

上下文

我试图在运行时将图像数据从 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::客户端客户端(IPC_SERVER_ADDR);//类实例成员

测试

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

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

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

问题

TL;DR:对于为什么在我的 DLL 中由 CreateFileMapping() 创建的内存映射文件(由 Lync.exe 加载)似乎不可见,是否有明确的解释到我的客户端应用程序,导致 OpenFileMapping() 失败,错误代码为 ERROR_FILE_NOT_FOUND?

最佳答案

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

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

关于c++ - OpenFileMapping() 找不到在 COM DLL 中创建的 MMF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31394199/

相关文章:

c++ - 无符号与有符号范围保证

c++ - 如何使用 C++ 读取文件并打印到控制台而不使用变量?

python - skimage - 导入错误 : DLL load failed: The specified module could not be found

c++ - OpenGL - 从 DisplayList 转换为使用 VBO

c++ - CUDA FFT 不返回我期望的值

.net - `Exporting a function from a DLL` 是什么意思?

.net - 将 TLB 转换为 IDL

c++ - 从另一个线程触发 COM 事件

c++ - 静态链接 SHFolder 组件

c++ - 加载/卸载时由共享库执行的代码