gpt4 book ai didi

C++ 应用程序找不到 com dll,因为编译器生成的 .tlh 文件具有不正确的 guid

转载 作者:行者123 更新时间:2023-11-30 01:58:26 26 4
gpt4 key购买 nike

我有一个在 C++ 项目中使用的 com dll。我没有注册 dll,但它在同一个解决方案中。我的应用程序不断中断,我发现它在这里中断

hr = CoCreateInstance(rclsid, pOuter, dwClsContext, __uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown));

因为我没有带有该 guid (rclsid) 的 com 类。我做了更多挖掘,发现它从临时目录中的 .tlh 文件获取 guid,但 guid 与我的代码不同。

.tlh文件

    struct __declspec(uuid("b10a18c8-7109-3f48-94d9-e48b526fc928"))
DocMapEntry;
// [ default ] interface _DocMapEntry
// interface _Object
// interface IDocMapEntry

c#代码(com可见dll)

    [ComVisible(true)]
[Guid("E98676B9-1965-4248-A9B6-74EC5EE5385A")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IDocMapEntry
{
int Offset { get; set; }
int PageOffset { get; set; }
int PageNumber { get; set; }
}

我尝试将值更改为正确的值,但它不断更改并且 visual studio 要求我重新加载。

当我使用 com 资源管理器查看类(class)时,我得到一个不同的 clsid,当我尝试注销它时,它成功完成,但项目仍然存在,文件位置是 mscoree。

我的 C++ 应用程序使用 .tlh 文件中的 guid,但找不到该文件。

public class DocMapEntry : IDocMapEntry
{
...
}

我的问题是。

我需要注册我的 com dll 才能工作吗?我怎样才能为类(class)设置 guid?为什么它会创建一个带有错误 guid 的临时 .tlh 文件? (选修的)为什么我不能更改此文件? (可选)

谢谢。

最佳答案

 public interface IDocMapEntry

COM 强烈区分 CLSID 和 IID。 IID,即接口(interface)标识符,标识由 COM 对象实现的接口(interface)。我们可以看到,您使用 [Guid] 属性指定了它。您将它作为 CoCreateInstance() 的第 4 个参数传递,您现在在其中传递 IUnknown 的 IID。

您需要的是 CLSID,类标识符。我们无法在您的代码段中看到它,它是实现您的 IDocMapEntry 的任何 的代码段。有一些奇怪的是它被命名为 DocMapEntry。以及您没有给它 [Guid] 的额外可能性,因此 CLR 会自动为您生成一个。请注意,当您修改类时,它会改变,这是 CoCreateObject() 失败的一个可能原因。

忘记使用 Regasm.exe/codebase 注册 .NET 程序集是另一个原因,您在问题中已经说明了这一点。这是必需的,否则 COM 将无法找到 DLL 并导致调用失败,错误代码为 0x80040154,“类未注册”。将它放在同一个解决方案中是不够的,COM 搜索规则与 .NET 使用的规则完全不同。

另请注意,您正在公开类的内部结构,通过在类上应用 [ClassInterface(ClassInterfaceType.None)] 属性来避免这种情况。

关于C++ 应用程序找不到 com dll,因为编译器生成的 .tlh 文件具有不正确的 guid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17431828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com