C# “CoCreateInstance返回”;“未注册的类别”;
我已经这样做了好几个小时了,现在开始感到不安了(C# “CoCreateInstance返回”;“未注册的类别”;,c#,c++,dll,managed,C#,C++,Dll,Managed,我已经这样做了好几个小时了,现在开始感到不安了( 我在.NET 4中创建了一个COM DLL,我希望能够用VC++ 6中的遗留应用程序访问它。它对COM可见,我已经成功地创建了TLB和SNK文件,用传统的C++代码将它移到机器上,导入了TLB,所有的东西都编译得很好。 运行以下命令: RegAsm ProtracFunctions.dll/codebase gacutil/i ProtracFunctions.dll 他们都很成功 当我启动我的应用程序时,只要我点击CoCreateInstanc
我在.NET 4中创建了一个COM DLL,我希望能够用VC++ 6中的遗留应用程序访问它。它对COM可见,我已经成功地创建了TLB和SNK文件,用传统的C++代码将它移到机器上,导入了TLB,所有的东西都编译得很好。 运行以下命令:
RegAsm ProtracFunctions.dll/codebase gacutil/i ProtracFunctions.dll 他们都很成功 当我启动我的应用程序时,只要我点击CoCreateInstance,就会收到消息“Class not registered” 我在RegEdit中注意到,我的DLL似乎已注册。当时我做了一些研究,下载了ProcMon,并意识到它位于不同的位置。CLSID略有不同,如果我尝试修改ProtracFunctions.reg文件(使用ProcMon拾取的GUID)RegAsm给了我,它确实对ProcMon产生了影响(至少“成功”消息比“找不到名称”消息多),但我似乎遗漏了大量注册表位置,如“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
}
CoInitialize(空);
CComQIPtr-spTestCom;
HRESULT hRes=spTestCom.CoCreateInstance(CLSID_ProtracDCS,0,CLSCTX_ALL);
如果(成功(hRes))
{
printf(“创建实例”);
无符号字符;
无符号字符编码;
安全阵列*pSA;
spTestCom->DockConnect(3、19200和Ret);
spTestCom->GetTagReads(1,&ErrCode,&pSA);
spTestCom->PowerOffReader(1,&Ret);
spTestCom->DockDisconnect();
Release();
}
其他的
{
_通信错误(hRes);
LPCTSTR errorText=error.ErrorMessage();
AfxMessageBox(errorText);
//错误超出范围时自动清理
}
补充说明:
开发机器运行的是winxp32位,带有遗留应用程序的“机器”实际上是dev计算机上的一个虚拟机,也运行XP
另外,当我运行我的应用程序,并选择触发上述代码的测试菜单项时,当我第一次收到错误“未注册类”时,如果我再次单击它,我会看到:“不支持这样的接口”。。。很奇怪 MSDN中的这一点表示,如果程序集位于GAC中,则不应使用/codebase选项。我认为您需要在程序集中嵌入清单。 请查看此URL 您还可以使其工作,而无需使用此代码注册程序集(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);
}
{
德沃德·库奇;
ACTCTX ACTCTX={sizeof(ACTCTX)};
actctx.lpSource=L“您的程序集完整路径”;
actctx.lpResourceName=MAKEINTRESOURCE(1);//对于DLL可能是2
actctx.dwFlags=actctx\u FLAG\u RESOURCE\u NAME\u VALID;
HANDLE hacctx=CreateActCtx(&actctx);
BOOL fOK=ActivateActCtx(HACTCTCTX和cookie);
如果(!霍)
返回E_失败;
CComPtr spCSharpTest;
HRESULT hr=spCSharpTest.CoCreateInstance(uuuidof(CSharpComInterface::CoClass));
如果(hr!=S_正常)
{
您是否可以在64位操作系统上运行此操作?如果是这样,那么当您注册在.NET 4中创建的COM程序集时,它将位于System32中,但VC++6将在SysWOW64中查找它,注册表也是如此。请尝试以x86形式构建,并使用位于SysWOW64文件夹中的regsvr32.exe进行注册。您是否在64位计算机上?不幸的是,maybe将全面帮助您。32位。您是否为该类指定了Guid属性?例如:[Guid(“00001111-2222-3333-4444-555566667777”)、ComVisible(true)]公共类protracSyes,我的C#类看起来像:[Guid(“DA8FA26B-D07F-40D0-ACB2-40B6665F1A11”)、ComVisible(true)、ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(IDockingStation))]公共类停靠站:IDockingStation我在将/codebase开关添加到GAC后尝试了它,发现它仍然不起作用(97%确定按照这个顺序,但如果我错了,它会导致“class not registered”消息吗?)