语境

我正在尝试在运行时将图像数据从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:对于为什么由Lync.exe加载的CreateFileMapping()在我的DLL中创建的内存映射文件似乎对我的客户端应用程序不可见,从而导致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/

10-13 08:24