【问题标题】:REGDB_E_CLASSNOTREG from VB.NET to C++REGDB_E_CLASSNOTREG 从 VB.NET 到 C++
【发布时间】:2017-06-09 14:28:52
【问题描述】:

这是我的问题。

我在 Visual Studio 2015 (MyLibrary) 下用 VB.NET 编写了一个类。 我将其编译为 DLL,并选中了 'Make assembly COM-Visible',因此它除了 DLL 文件之外还会生成一个 .tlb 文件。

然后我尝试在 Visual Studio 2013 下使用 COM 机制在 C++ 代码中实例化这个类。 为此,我制作了由 .tlh 生成的文件:

#import "MyLibrary.tlb" raw_interfaces_only

然后我做:

// Initialize COM.
HRESULT hr = CoInitialize(NULL);

// Create the interface pointer.
cMyLibraryPtr l_pclMyLibrary(__uuidof(MyLibrary));

// Use it
l_pclMyLibrary->DoThings();

当我从安装了两个版本的 Visual Studio 的计算机上执行此操作时,它运行良好,无论是在调试模式还是发布模式下。 但是,当我从另一台“安装”我的软件的计算机上启动它时,当我的类的构造函数调用“CreateInstance”时,我会得到 REGDB_E_CLASSNOTREG

我已经检查或尝试了这些方法以使其正常工作:

  1. 一切都在 x86(VB.NET 和 C++)中编译,我在两个 32 位目标上
  2. 我尝试通过调用“regasm.exe MyLibrary.dll”来注册我的库。我在 regedit 中检查了注册是否有效。

我不知道我还能做什么......所以欢迎任何帮助!

谢谢 亚历克斯。

【问题讨论】:

  • 显示您使用的 exact regasm 命令,包括所有指定的选项。

标签: c++ vb.net com


【解决方案1】:

我有更好的运气使用:

regasm /tlb /codebase MyLibrary.dll

注意 /tlb 和 /codebase 参数...

我还想确保您从具有管理员权限的提升命令行运行它。

另外,你需要确定你使用的regasm.exe的版本是

1) 与您构建 DLL 的 .NET 版本相同 2)在你的情况下,它是 regasm.exe 的 32 位版本而不是 64 位版本

另一件事是,如果您要将它们分发到同一个安装目录中,您可以使用独立 COM,这样甚至不需要注册。

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2012-10-15
    • 2019-06-01
    • 1970-01-01
    • 2011-04-19
    • 2015-09-30
    相关资源
    最近更新 更多