语境
我正在尝试在运行时将图像数据从C ++ .exe应用程序发送到实现为COM DLL的DirectShow源过滤器。为此,我尝试使用内存映射文件来执行IPC,使用从here取得的经过稍微修改的代码版本。所有客户端和服务器使用相同的ipc.c
和ipc.h
。hFile = INVALID_HANDLE_VALUE
,并且允许使用外部字符串设置lpName
。
服务器
我将DLL调试器设置为Command -> lync.exe
和Debugger 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::Client
或osIPC::Server
然后传递字节缓冲区。在这里,OpenFileMapping()
调用成功。与轻量级服务器一起运行我的应用程序成功,但是将DLL与轻量级客户端组合在一起失败,这使我怀疑过滤器是否引起了问题。
我尝试将
Global\\
附加到传递给CreateFileMapping()
调用的文件名上,以使用全局名称空间而没有结果。题
TL; DR:对于为什么由Lync.exe加载的
CreateFileMapping()
在我的DLL中创建的内存映射文件似乎对我的客户端应用程序不可见,从而导致OpenFileMapping()
失败,错误代码为ERROR_FILE_NOT_FOUND
? 最佳答案
正如@Hans Passant指出的那样,引用的代码从char *
到LPWSTR
进行了不安全的类型转换。通过显式指定自己的Unicode字符串并调整osIPC::Client
和osIPC::Server
的构造函数和内部变量类型,我设法使IPC正常工作。
根据是否将UNICODE
定义为宏和某些其他项目设置,这导致整个代码的行为无法预测。
关于c++ - OpenFileMapping()找不到在COM DLL中创建的MMF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31394199/