C++ C++;链接和COM注册问题

C++ C++;链接和COM注册问题,c++,windows,com,linker,C++,Windows,Com,Linker,我已经向我的应用程序(多个项目DLL)-SQLite添加了一个新库,以执行一些内存缓存。只有一个库/项目受此更改影响-Lib1 一个体格良好的人是不会失败的。所有库都已成功构建,并且未报告任何错误,包括两个Com对象 如果我尝试注册com对象,我会收到无法加载DLL的错误消息。检查以确保所有必需的应用程序运行时文件和其他依赖DLL在组件DLL的目录或系统路径中可用。消息但是所有的LIB都在同一个地方。一切都在路上。该项目的副本可以很好地构建和注册(当然,没有对SqlLite进行少量更改)。Dep

我已经向我的应用程序(多个项目DLL)-SQLite添加了一个新库,以执行一些内存缓存。只有一个库/项目受此更改影响-Lib1

一个体格良好的人是不会失败的。所有库都已成功构建,并且未报告任何错误,包括两个Com对象

如果我尝试注册com对象,我会收到无法加载DLL的错误消息。检查以确保所有必需的应用程序运行时文件和其他依赖DLL在组件DLL的目录或系统路径中可用。消息但是所有的LIB都在同一个地方。一切都在路上。该项目的副本可以很好地构建和注册(当然,没有对SqlLite进行少量更改)。Dependency walker没有报告任何问题

奇怪的是,如果我尝试注册com对象的DLL(使用regsvr32),它可以正常工作。另外,我还有另一个库,它依赖于Lib1(而不是SqlLite),也无法加载

有什么想法吗

谢谢,
A'z

使用dependency walker工具找出COM服务器所依赖的其他DLL。然后检查在VisualStudio中设置的可执行路径(工具->选项->项目->目录(我想))。请注意,VS不使用系统路径环境变量-它使用选项页中设置的内容,因此如果依赖项的路径未在此处列出,则注册将失败,即使从命令行使用
regsvr32
,注册也会成功。

您可以使用Process Monitor()设置为筛选进程名regsvr32.exe以查看所有文件和注册表访问

发出regsvr32命令时,请始终使用com dll的完整路径,如果路径(例如c:\windows\system32)中的其他地方有相同的dll,则regsvr32将使用其他dll,而不是当前目录中的dll

另一个技巧是使用“rundll32您的com dll,DllRegisterServer”。在缺少dll的情况下,它将告诉您缺少哪个dll,而不仅仅是说LoadLibrary失败了

编辑
“如果我尝试注册com对象”是什么意思?你是怎么做到的?我这样问是因为你说dll上的regsvr32实际上实现了这些com对象,它工作得很好。

因此,绘图变厚了

实际上,我已经缩小了链接的范围,缩小到了导致链接问题的代码行。 在修改后的库(LIB1)中,我添加了一个新的类A1,它继承了现有的类a。 当我将一个现有的类B从A继承改为现在从A1继承时,问题就出现了。B类在lib3中

我已经验证了,当我更改继承时,问题才会出现

在成功加载和失败加载时,我在regsvr32上使用了文件mon。我挣扎着寻找差异!明天早上我会试试进程监视器,看看它是否有用

仍然迫切需要帮助,
A'z

嗯。。。正如Christian所问的,如果regsvr32.exe成功,您还将如何尝试注册这些对象

rundll32.exe建议也很好。您是否尝试过在调试器中单步执行DllRegisterServer,以准确查看它何时出现故障?如果depends.exe没有透露任何信息,这听起来像是潜在的运行时故障


顺便说一句,当我在谷歌上搜索我看到的确切错误文本时:,但我想你可能已经做了这个搜索,并且发现它没有帮助:)

在问题中,尼尔提到依赖性沃克没有报告任何错误。这个问题不是尼尔提出的,我也没想到它会报告任何问题。您可以使用DependencyWalker找出dependenciesThanks的正确路径,我使用的所有库最终都在同一个文件夹中。该文件夹是路径中的第一个文件夹。正如我提到的,我有同一个项目的两份副本。一个没有代码更改的程序运行得很好。最令人恼火的是,唯一一个真正有变化的库——加载。也许有帮助,但是-GetLastError返回126。a'z您正在运行什么操作系统,使用什么程序编写代码?Windows XP,环境是(drumroll)VS6。谢谢,明天将尝试process monitor,并发布结果!好的,为失败的配置和成功的配置运行进程监视器。没有区别!正如我在第一篇文章中提到的那样,regsvr32完成时没有错误。嗨,我无法解释为什么regsvr32可以工作,而在ComObject注册窗口中却不能。我调试M.S代码越多,我就越不了解是什么导致了这个失败。仔细阅读链接,尽管没有帮助。谢谢