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

Posted

技术标签:

【中文标题】执行 CoCreateInstance 时出现 COM 错误 0x8007002(找不到文件)【英文标题】:COM error 0x8007002 (file not found) while executing CoCreateInstance 【发布时间】:2013-11-04 12:46:14 【问题描述】:

我有 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# 程序集的 guid 之前,一切正常。现在 CoCreateInstance 返回 0x80070002 错误并将 linkVariable 值设置为 0。我在这里看到两个可能的原因:我的程序集注册方式不正确,第一次全部工作意外或在 guid 更改后出现问题(但在 .tlh 文件中,guid 是实际的)。

【问题讨论】:

【参考方案1】:

通过在 regasm.exe 构建后命令调用中添加 /codebase 参数解决了该问题。 0x80070002 错误提示缺少 MyLib.dll 的文件路径。

【讨论】:

【参考方案2】:

如果您在 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

【讨论】:

我刚刚创建了一个新项目,那里有一个简单的类,并尝试在新的 c++ 本机项目中使用它,但 CoCreateInstance 返回相同的错误。 是否可以使用 regasm 取消注册没有强名称且不在缓存中的程序集? 是的,您不需要将 DLL 放在 GAC 中。如果程序集不是强名称,它会尝试在 exe 路径中找到它 由于缺少 /codebase 参数而产生错误,但从当前开始,我将在预构建事件中取消注册调试时的所有程序集。

以上是关于执行 CoCreateInstance 时出现 COM 错误 0x8007002(找不到文件)的主要内容,如果未能解决你的问题,请参考以下文章

编辑可执行文件代码时出现分段错误

执行httpclient时出现奇怪的错误

exe C时出现分段错误错误

执行 RPC 时出现 GWT 序列化问题

从 C 调用汇编函数时出现分段错误错误

即使找到接口,CoCreateInstance 也会返回 E_NOINTERFACE