我已经做了几个小时了,现在开始感到沮丧。
我创建了一个.NET 4.0的COM DLL,在VC++ 6中制作的旧版应用程序想要能够访问它。它对COM可见,我已经成功创建了TLB和SNK文件,并将其移动到具有遗留C++代码的机器上,#import了TLB,一切都编译得很好。
运行以下内容:
RegAsm ProtracFunctions.dll /codebase
gacutil /i ProtracFunctions.dll
它们都是成功的。
当我试图启动我的应用程序时,只要我一点击CoCreateInstance,就会收到“类未注册”的消息。
我在RegEdit中注意到我的DLL似乎已经注册了。这时我进行了一些研究,下载了ProcMon,并意识到它正在查看不同的位置。 CLSID略有不同,如果我尝试修改ProtracFunctions.reg文件(使用ProcMon捕获的GUID),RegAsm会给我,它确实会影响ProcMon(至少更多的"SUCCESS"消息而不是"NAME NOT FOUND"消息),但似乎我错过了大量的注册表位置,例如键"TreatAs"、"InprocServerX86"等。
如果有人可以告诉我:
A)我一开始做错了什么
或者
B)当您“注册”COM DLL时添加了哪些注册表值的列表,这样我就可以进去手动执行它(我意识到这并不理想)。
感谢您!
我的代码:
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。
此外,当我运行我的应用程序,并选择触发上述代码的测试菜单项时,第一次会出现“类未注册”的错误,如果之后再次点击,我会看到:“不支持此类接口”……非常奇怪。