Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “CoCreateInstance返回”;“未注册的类别”;_C#_C++_Dll_Managed - Fatal编程技术网

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”消息吗?)