REGDB_E_CLASSNOTREG from VB.NET to C++

REGDB_E_CLASSNOTREG from VB.NET to C++

本文关键字:NET to C++ VB from CLASSNOTREG REGDB      更新时间:2023-10-16

这是我的问题。

我在Visual Studio 2015下用VB.NET编写了一个类(MyLibrary)。我将其编译为DLL,并选中"使程序集COM可见",因此除了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. Everything是在x86(VB.NET和C++)中编译的,我有两个32位的目标
  2. 我试图通过调用"regasm.exe MyLibrary.dll"来注册我的库。我在regedit中检查了注册是否有效

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

谢谢亚历克斯。

我在使用时运气更好

regasm /tlb /codebase MyLibrary.dll

请注意/tlb和/codebase参数。。。

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

此外,您需要确保您使用的regasm.exe版本是

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

另一件事是,如果你要在同一个安装目录中分发这些,你可以使用隔离COM,这样就不需要注册了。