CoCreateInstance返回“未注册的类”
我已经呆了好几个小时了,现在开始感到不安。 :(
我有一个在.NET 4.0中创建的COM DLL,我希望能够使用在VC ++ 6中创建的旧应用程序访问它。它对COM可见,我已经成功创建了TLB和SNK文件,将它移到了机器与传统C ++代码,#imported TLB,一切都编译好。
如下:
RegAsm ProtracFunctions.dll / codebase
gacutil /我ProtracFunctions.dll
他们都是成功的。
当我启动我的应用程序时,只要我点击CoCreateInstance,我就会收到消息“Class not registered”。
我在RegEdit中注意到我的DLL似乎已经被注册了。 那是当我做了一些研究时,下载了ProcMon,并意识到它在不同的位置。 CLSID稍有不同,如果我尝试修改RegAsm给我的ProtracFunctions.reg文件(以使用ProcMon正在拾取的GUID),并且它对ProcMon产生影响(比“NAME”更多的“SUCCESS”消息NOT FOUND“消息),但我似乎错过了很多注册表位置。 如关键的“TreatAs”,“InprocServerX86”等。
如果有人能告诉我:
A)我首先做错了什么
要么
B)当你“注册”一个COM DLL时,确切地添加了什么注册表值的列表,以便我可以进去并自己手动完成。 (不理想,我意识到)。
TIA!
我的代码:
CoInitialize(NULL);
CComQIPtr <ProtracFunctions::IDockingStation> spTestCom;
HRESULT hRes = spTestCom.CoCreateInstance(CLSID_ProtracDCS, 0, CLSCTX_ALL);
if (SUCCEEDED (hRes))
{
printf("Created the instance");
unsigned char Ret;
unsigned char ErrCode;
SAFEARRAY *pSA;
spTestCom->DockConnect(3, 19200, &Ret);
spTestCom->GetTagReads(1, &ErrCode, &pSA);
spTestCom->PowerOffReader(1, &Ret);
spTestCom->DockDisconnect();
spTestCom.Release ();
}
else
{
_com_error error(hRes);
LPCTSTR errorText = error.ErrorMessage();
AfxMessageBox(errorText);
//automatic cleanup when error goes out of scope
}
补充说明:
该开发机器运行的是Win XP 32位,并且带有遗留应用程序的“机器”实际上是开发计算机上的虚拟机,也运行XP。
此外,当我运行我的应用程序,并选择启动上述代码的测试菜单项时,第一次出现错误“Class not registered”,如果再次单击它,我会看到:“没有这样的接口支持“......很奇怪。
我认为你需要在你的程序集中嵌入一个清单。 看到这个URL。 http://blogs.msdn.com/b/cheller/archive/2006/08/24/718757.aspx
您也可以使其工作,而无需使用此代码注册程序集(Regasm.exe)。
{
DWORD cookie;
ACTCTX actctx = {sizeof(actctx)};
actctx.lpSource = L"YOUR ASSEMBLY FULL PATH";
actctx.lpResourceName = MAKEINTRESOURCE(1); //MAYBE 2 FOR DLL
actctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID;
HANDLE hActCtx = CreateActCtx(&actctx);
BOOL fOK = ActivateActCtx(hActCtx, &cookie);
if (!fOK)
return E_FAIL;
CComPtr<CSharpComInterface::ITestCSharpInterface> spCSharpTest;
HRESULT hr = spCSharpTest.CoCreateInstance(__uuidof(CSharpComInterface::CoClass));
if (hr != S_OK)
{
cout << "Failed to create instance CSharpComInterface::CoClass" <<endl;
}
else
{
cout << "Load Successfully : CSharpComInterface::CoClass" << endl;
spCSharpTest->TestMethod();
}
DeactivateActCtx(0, cookie);
ReleaseActCtx(hActCtx);
}
在MSDN Regasm.exe上的这个条目说,如果你的程序集在GAC中,你不应该使用/ codebase选项。
链接地址: http://www.djcxy.com/p/58419.html