我尝试在不接触注册表的情况下进行 COM。我从一个非常简单的 C++“客户端”开始,尝试CoCreateInstance
使用随机的任意 UUID。
#include <stdio.h>
#include <Windows.h>
int main() {
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
if (FAILED(hr)) {
return 0;
} // endif
const IID SomeClass = { 42, 65535, 42, { 'H', 'e', 'l', 'l', 'o', ' ', 'S', 'O'} };
const IID SomeInterface;
memset((void*)&SomeInterface, (char)rand(), sizeof(SomeInterface));
void * pInterface;
hr = CoCreateInstance(SomeClass, nullptr, CLSCTX_INPROC_SERVER, SomeInterface, &pInterface );
if (FAILED(hr)) {
printf("'CoCreateInstance' failed with error 0x%X", hr);
} // endif
CoUninitialize();
return 0;
}
可以想象,程序的输出是:
“CoCreateInstance”失败,错误为 0x80040154
(0x80040154 是臭名昭著的“找不到类”)
有人告诉我,在这种情况下,Windows 会在图像目录中搜索一个或多个“清单”文件。
到目前为止,我很难创建这样的文件,所以作为最后的手段,我画了procmon.exe
.
我设法获得了一个与上述程序的执行相对应的 CSV 文本文件,使用的过滤器排除了与进程名称无关的任何事件。
然后我使用记事本++,发现了一些与RegOpenKey
我的虚拟“类”相关的事件,所有事件都以“未找到名称”结尾
然后我搜索CreateFile
带有一些“清单”文件扩展名的事件,但没有找到!
问题:为什么无法访问某些清单文件?