COM“;“类未注册”;如果使用其他dll。如何调试此错误?

COM“;“类未注册”;如果使用其他dll。如何调试此错误?,com,activex,labview,Com,Activex,Labview,情况是这样的。我运行Labview并通过ActiveX托盘调用我的COM对象方法。它工作了,我用调试器遍历我的代码 但当我开始使用(取消注释)侧dll中的代码时,我在Labview中看到“类未注册”错误。我的附加dll及其依赖项位于单独的目录中。所以我尝试将PATH环境变量设置为这个目录,然后运行Labview。但它仍然不起作用 所以问题是如何调试这种情况?我查看了事件记录器,但没有发现任何相关内容 我在C++中创建了自己的合成应用程序,它也调用了与LabVIEW相同的方法。它可以工作。问题出在

情况是这样的。我运行Labview并通过ActiveX托盘调用我的COM对象方法。它工作了,我用调试器遍历我的代码

但当我开始使用(取消注释)侧dll中的代码时,我在Labview中看到“类未注册”错误。我的附加dll及其依赖项位于单独的目录中。所以我尝试将PATH环境变量设置为这个目录,然后运行Labview。但它仍然不起作用

所以问题是如何调试这种情况?我查看了事件记录器,但没有发现任何相关内容


我在C++中创建了自己的合成应用程序,它也调用了与LabVIEW相同的方法。它可以工作。

问题出在硬定义的基dll地址中。Labview使用了此地址,COM DLL无法使用该空间


我认为报告不正确(“类未注册”),因为类已注册,但无法加载相应的dll。

问题在于硬定义的基本dll地址。Labview使用了此地址,COM DLL无法使用该空间


我认为报告不正确(“类未注册”),因为类已注册,但无法加载相应的dll。

使用SysInternals的进程监视器。您将看到Labview读取注册表以定位组件。期望它找不到注册表项,这就是产生“类未注册”的原因。与您从测试程序中获得的相同跟踪进行比较。未正确注册组件或试图使用64位进程中的32位组件是常见原因。请使用进程监视器查看它在哪里查找依赖项。正确注册的COM组件在内部加载有
LoadLibraryEx()
函数,该函数具有完善的搜索顺序。@HansPassant,谢谢您的建议。我比较了ProcMon日志,发现Labview找到了正确的dll,加载它,读取它(在几个偏移中)并关闭它。“未注册类”错误发生后。@sharptooth,你给了我一个主意!我添加到加载相应库的代码的第一个变体中。起初,我在我的dll上尝试了LoadLibrary函数,它返回NULL。之后,我尝试使用LoadLibraryEx函数。它可以正确地使用这些标志:LOAD\u LIBRARY\u SEARCH\u DEFAULT\u DIRS LOAD\u LIBRARY\u SEARCH\u DLL\u LOAD\u DIR。这个问题仍然存在。问题是如何让COM查找依赖项?(似乎设置路径不起作用)。Process Monitor将向您显示正在发生的事情,然后您可以尝试去做一些事情。请使用SysInternals的Process Monitor。您将看到Labview读取注册表以定位组件。期望它找不到注册表项,这就是产生“类未注册”的原因。与您从测试程序中获得的相同跟踪进行比较。未正确注册组件或试图使用64位进程中的32位组件是常见原因。请使用进程监视器查看它在哪里查找依赖项。正确注册的COM组件在内部加载有
LoadLibraryEx()
函数,该函数具有完善的搜索顺序。@HansPassant,谢谢您的建议。我比较了ProcMon日志,发现Labview找到了正确的dll,加载它,读取它(在几个偏移中)并关闭它。“未注册类”错误发生后。@sharptooth,你给了我一个主意!我添加到加载相应库的代码的第一个变体中。起初,我在我的dll上尝试了LoadLibrary函数,它返回NULL。之后,我尝试使用LoadLibraryEx函数。它可以正确地使用这些标志:LOAD\u LIBRARY\u SEARCH\u DEFAULT\u DIRS LOAD\u LIBRARY\u SEARCH\u DLL\u LOAD\u DIR。这个问题仍然存在。问题是如何让COM查找依赖项?(似乎设置路径不起作用)。进程监视器将向您显示正在发生的事情,然后您可以尝试到达某个位置。