我有一些加载 C++ DLL 的 C# 程序,其中一个函数试图创建一个 COM 对象。该函数返回一个接口值。
extern "C" _declspec(dllexport) ISin * __stdcall GetInterface() {
HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr)) {
std::cout << "CoInitialize -> FAILED";
return 0;
}
ISin * pISin = 0;
hr = CoCreateInstance(CLSID_CoSin, 0, CLSCTX_INPROC_SERVER, IID_ISin, (LPVOID*)&pISin);
if (FAILED(hr)) {
std::cout << "CoCreateInstance -> FAILED"; // <-- Выводит в основной программе
std::cout << hr; // -2147221164
return 0;
}
if (pISin == 0) {
std::cout << "pISin is null";
}
CoUninitialize();
return pISin;
}
无法正确调用 CoCreateInstance 函数:FAILED(hr) 返回 true,仅此而已。
我知道有一个功能CoCreateInstanceEx
,但我不知道如何使用它,也不知道它在这里是否有帮助。此外,问题可能出在 CLSCTX 的选择上。
你的建议?
返回的错误代码
-2147221164
是REGDB_E_CLASSNOTREG
(类未注册)。此代码表示此类 COM 服务器未在系统中注册。如果指定了不正确的服务器类型,则会返回相同的错误,例如,如果服务器是本地 out-of-proc,并且dwClsContext
指定了参数CLSCTX_INPROC_SERVER
而不是正确的CLSCTX_LOCAL_SERVER
.首先,检查服务器类型 - 它是本地 (.exe) 还是进程内 (.dll)。或者,如果服务器类型对您不重要,
dwClsContext
您可以指定inCLSCTX_ALL
(即,任何一个都适合您)。如果
CoCreateInstance
这个错误也与参数一起返回CLSCTX_ALL
,那么服务器根本没有注册。检查它是否存在于系统中,如有必要,使用命令注册它我还要补充一点:你需要在程序的开头和结尾分别调用一次
CoInitialize
。您不需要它,至少在您对 COM 有足够的了解以选择线程模型之前不需要它。CoUninitialize
CoInitializeEx