执行CoCreateInstance时出现COM错误0x8007002(找不到文件)

时间:2013-11-04 12:46:15

标签: c# c++ com

我有C#程序集,有几个Com-visible接口和类。此程序集依赖于两个没有强名称的程序集,无法以任何其他方式对其进行签名或修改。因此,要注册程序集并创建tlb文件以便在本机c ++库中使用,我使用这些构建后命令

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" MyLib.dll /regfile /asmpath:"..\depencies\;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0;c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5"
regedit /s MyLib.reg
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\tlbexp" MyLib.dll /asmpath:"../depencies" /out:MyLib.tlb

在.h文件的本机库中,我包含这样的tlb文件:

#import "../Build/MyLib.tlb" no_namespace named_guids 
extern ILinkVariableManager *LinkVariables();

在cpp文件中我实现了调用CoCreateInstance的方法:

ILinkVariableManager *linkVariables = NULL;

ILinkVariableManager *LinkVariables(){
    if(linkVariables!=NULL)
        return linkVariables ;
    HRESULT result2 = CoCreateInstance(CLSID_LinkVariableManager2,
               NULL, CLSCTX_INPROC_SERVER,
               IID_ILinkVariableManager,  reinterpret_cast<void**>(&linkVariables));

    return linkVariables;
}

一切正常,直到我向类和接口添加了一些方法,并为所有接口和c#assembly更改了guid。现在CoCreateInstance返回0x80070002错误并将linkVariable值设置为0.我在这里看到两个可能的原因:我的程序集注册方式不正确并且第一次意外地工作或guids更改后出现问题(但是.tlh文件guid是实际的)。 / p>

2 个答案:

答案 0 :(得分:1)

通过在regasm.exe post-build命令调用中添加/ codebase参数来解决问题。 0x80070002错误信号表示缺少文件路径到MyLib.dll。

答案 1 :(得分:0)

如果在C#中添加更多类型或更改类的GUID,则应取消注册C#DLL,然后使用/ tlb选项再次注册,并使用tlb编译C ++ DLL。

取消注册:C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /u mydll.dll

重新登录:C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe/tlb mydll.dll