OpenFileMapping() 找不到在 COM DLL 中创建的 MMF
OpenFileMapping() can't find MMF created in COM DLL
上下文
我正在尝试在运行时将图像数据从 C++ .exe 应用程序发送到作为 COM DLL 实现的 DirectShow 源过滤器。为此,我尝试使用内存映射文件来执行 IPC,使用从 here 中获取的代码的略微修改版本。所有客户端和服务器都使用相同的 ipc.c
和 ipc.h
.
hFile = INVALID_HANDLE_VALUE
,我允许使用外部字符串来设置 lpName
。
服务器
我将 DLL 调试器设置为 Command -> lync.exe
和 Debugger Type -> Mixed
,允许我调试过滤器的实际使用。服务器创建(具有函数作用域的静态实例)成功并且 returns 一个有效句柄。
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
测试
为了测试,我编写了一对 client/server 轻量级 Visual Studio 解决方案,每个解决方案都有相应的初始化类型 (non-static/static)。每个解决方案基本上只是一个 main()
创建 osIPC::Client
或 osIPC::Server
然后传递字节缓冲区。此处,OpenFileMapping()
调用成功。
运行 我的应用程序与轻量级服务器结合成功,但将 DLL 与轻量级客户端结合失败,导致我怀疑过滤器导致问题。
我尝试将 Global\
附加到传递给 CreateFileMapping()
调用的文件名以使用全局命名空间,但没有结果。
问题
TL;DR: 对于 Lync.exe 加载的 CreateFileMapping()
在我的 DLL 中创建的内存映射文件似乎对 Lync.exe 不可见的原因有明确的解释吗我的客户端应用程序导致 OpenFileMapping()
失败,错误代码为 ERROR_FILE_NOT_FOUND
?
正如@Hans Passant 指出的那样,引用的代码进行了从 char *
到 LPWSTR
的不安全类型转换。通过显式指定我自己的 Unicode 字符串并调整 osIPC::Client
和 osIPC::Server
的构造函数和内部变量类型,我设法使 IPC 正常工作。
根据 UNICODE
是否被定义为宏和一些其他项目设置,这会导致整体代码出现不可预测的行为。
上下文
我正在尝试在运行时将图像数据从 C++ .exe 应用程序发送到作为 COM DLL 实现的 DirectShow 源过滤器。为此,我尝试使用内存映射文件来执行 IPC,使用从 here 中获取的代码的略微修改版本。所有客户端和服务器都使用相同的 ipc.c
和 ipc.h
.
hFile = INVALID_HANDLE_VALUE
,我允许使用外部字符串来设置 lpName
。
服务器
我将 DLL 调试器设置为 Command -> lync.exe
和 Debugger Type -> Mixed
,允许我调试过滤器的实际使用。服务器创建(具有函数作用域的静态实例)成功并且 returns 一个有效句柄。
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
测试
为了测试,我编写了一对 client/server 轻量级 Visual Studio 解决方案,每个解决方案都有相应的初始化类型 (non-static/static)。每个解决方案基本上只是一个 main()
创建 osIPC::Client
或 osIPC::Server
然后传递字节缓冲区。此处,OpenFileMapping()
调用成功。
运行 我的应用程序与轻量级服务器结合成功,但将 DLL 与轻量级客户端结合失败,导致我怀疑过滤器导致问题。
我尝试将 Global\
附加到传递给 CreateFileMapping()
调用的文件名以使用全局命名空间,但没有结果。
问题
TL;DR: 对于 Lync.exe 加载的 CreateFileMapping()
在我的 DLL 中创建的内存映射文件似乎对 Lync.exe 不可见的原因有明确的解释吗我的客户端应用程序导致 OpenFileMapping()
失败,错误代码为 ERROR_FILE_NOT_FOUND
?
正如@Hans Passant 指出的那样,引用的代码进行了从 char *
到 LPWSTR
的不安全类型转换。通过显式指定我自己的 Unicode 字符串并调整 osIPC::Client
和 osIPC::Server
的构造函数和内部变量类型,我设法使 IPC 正常工作。
根据 UNICODE
是否被定义为宏和一些其他项目设置,这会导致整体代码出现不可预测的行为。