c# - CoCreateInstance 返回 "Class not registered"

标签 c# c++ dll managed

我已经处理这个问题好几个小时了,它开始变得令人沮丧。 :(

我有一个在 .NET 4.0 中创建的 COM DLL,我希望能够使用 VC++ 6 中创建的遗留应用程序访问它。它对 COM 可见,我已经成功创建了 TLB 和 SNK 文件,将其移动使用遗留 C++ 代码,#imported TLB,一切编译正常。

运行以下命令:

RegAsm ProtracFunctions.dll/代码库

gacutil/i ProtracFunctions.dll

他们都成功了。

当我启动我的应用程序时,只要我点击 CoCreateInstance,就会收到消息“类未注册”。

我在 RegEdit 中注意到我的 DLL 似乎已注册。那时我做了一些研究,下载了 ProcMon,并意识到它在寻找不同的位置。 CLSID 略有不同,如果我尝试修改 RegAsm 给我的 ProtracFunctions.reg 文件(以使用 ProcMon 获取的 GUID),它确实会对 ProcMon 产生影响(“SUCCESS”消息多于“NAME” 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。

此外,当我运行我的应用程序并选择触发上述代码的测试菜单项时,我第一次收到错误“类未注册”,如果之后再次单击它,我会看到:“不支持这样的接口(interface)”……很奇怪。

最佳答案

我认为您需要在程序集中嵌入一个 list 。 看到这个网址。 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);
}

关于c# - CoCreateInstance 返回 "Class not registered",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776969/

相关文章:

c# - 连接到多个 SQL Server

c# - 如何使用 Winforms c# 获取用户在列表框中选择项目的顺序

c++ - gdb如何附加到多线程进程?

c++ - 在 C++ 中使用 exit()

将linux的.so文件转换为windows的.dll文件

c# - 是否可以使用 C# 代码注入(inject) dll 并覆盖返回值?

c# - 从 web api 2 获取值时出现 Json 解析错误

c# - Visual Studio 2015 单元测试不一致

c++ - 如何从 Qt 中的大文件异步加载数据?

delphi - 将 Delphi 字符串作为参数发送给 DLL