【问题标题】:CreateInstance Returns "The specified module could not be found."CreateInstance 返回“找不到指定的模块。”
【发布时间】:2011-10-16 08:38:20
【问题描述】:

我一直在尝试让一个在Windows 2000 上运行的程序在Windows 2003 上运行。到目前为止,为了让程序在Windows 2003 上运行,我所做的一切都与不正确的配置有关。现在,这段代码:

chr = pAdapterEnvPtr.CreateInstance(__uuidof(PFADAPTERMNGLib::PFAdapterEnv));

正在返回:

0x8007007E

或者换句话说:

The specified module could not be found.

我有两个其他程序和另一个 .dll,我可以成功创建这些类的实例。但这似乎失败了。

我使用Procmon 试图找出程序找不到什么,但Procmon 没有显示任何可能表明程序找不到的东西。

OleView 中,如果我尝试创建类的实例,我会看到以下图像:

如果您查看图像的左侧,尝试创建 PFComgMng 的实例会给我同样的错误。 (PFAdapterEnvPFCompMng 使用相同的过程,PFAdapterMng.exe。)但是,PFMQMonitorPFSendPFTrace 都可以正常工作。 (使用PFMQListen.exePFSend.dllPFTraceService.exe。)

我要注意的另一件事是以下代码:

hr = pPFCompMng.CreateInstance(__uuidof(PFADAPTERMNGLib::PFCompMng));

当它被PFAdapterMng.exe 调用时,它工作得非常好。所以看起来PFAdapterMng.exe 可以成功找到模块并创建实例,但是任何其他尝试在PFAdapterMng.exe 中创建任何类实例的进程都找不到模块,从而导致此错误。

由于Procmon 对这个特定案例没有帮助,有谁知道我可以做些什么来弄清楚是什么让其他进程无法找到模块?

更新:

我无法通过分析运行Dependency Walker,因为PFAdapterMng.exePFTraceService.exe 必须作为服务运行。我尝试在分析OleView 时运行Dependency Walker,并尝试创建PFAdapterEnvPFCompMng 的实例,以尝试找出我收到Module not found 消息框的原因。不幸的是,Dependency Walker 并没有表明缺少任何东西。

更新2:

也许我错过了Procmon 日志中的某些内容,因此我通过在接听CreateInstance 之前和之后立即捕获事件创建了一个新日志。也许其他人可以看看并告诉我我是否错过了它?我根本找不到任何迹象表明PFMQListen.exe 找不到东西..

这是一个压缩文件夹的链接,其中包含一个Procmon 文件、一个.csv 文件和一个.xml 文件。

http://www.mediafire.com/?07jq8zj7emmpsvd

更新3:

所以,我设法让Dependency Walker 在配置文件模式下运行以创建PFAdapterEnv 的实例。 Dependency Walker 没有找到任何丢失的.dll

所以,Procmon 没有显示任何内容,Dependency Walker 也没有。我正在使用ollydbg 在汇编级别逐步执行代码,我注意到错误是在函数NdrClientCall2 中创建的。我不知道这是否意味着什么。

关于我还可以尝试什么的任何想法?人们是否需要更多信息来帮助我解决这个问题?如果有,请询问。

更新4:

我尝试使用/RegServer 注册应用程序,并且成功了。我之前尝试过使用/RegServer,我只是使用/UnregServer 注销了所有内容。这一次,我还删除了Component Services中我需要的组件,因为我想在另一个身份下运行PFAdapterMng

因此,在/RegServer 上运行并双击应用程序时,似乎一切正常。但是,我希望一切都在不同的配置下运行。

如何配置一切以使应用程序按如下方式运行:

PFAdapterMng.exe - 注册为/Service 并通过services.msc 以另一个身份运行 PFTraceServer.exe - 注册为/Service 并通过services.msc 以另一个身份运行

PFMQListen.exe - 注册为/RegServer 将由PFAdapterMng 启动 PFMQSend.dll - 在Regsvr32 注册并由PFAdapterMng 加载

谢谢, 克日斯

【问题讨论】:

  • ProcMon 肯定会帮助您找到丢失的 DLL,您会看到程序正在搜索它。大海捞针确实需要一些努力。
  • PFMQListen.exe 是调用CreateInstance 并收到错误的进程,但Procmon 没有显示任何表明PFMQListen.exe 缺少某些内容的内容。我将使用 Procmon 日志更新我的问题,因此也许其他人可能会发现我缺少的东西。

标签: c++ com windows-server-2003 com+ createinstance


【解决方案1】:

我的猜测是它与可执行文件的某些DLL依赖项的搜索路径有关。 您可以在每个模块上尝试“Dependency Walker”以查看是否所有 DLL 都可用:http://www.dependencywalker.com/ 并根据需要更新搜索 PATH。

【讨论】:

  • 是的,我在PFAdapterMng.exePFMQListen.exePFMQSend.dllPFTraceService.exe 上试过这个,唯一缺少的是wer.dllieshims.dll,我认为这是正常的。除了这两个图书馆,一切都找到了。我想分析我的程序,但我不能,因为PFAdapterMng.exePFTraceService.exe 必须作为服务运行,而PFMQListen.exePFAdapterMng.exe 启动。
  • 您是否尝试过使用参数“-Service”运行 .exe?这应该是“可分析的”。
  • 在过去的 COM 时代,注册 COM 进程外服务器的常用方法是使用“/RegServer”参数(试试看!)。 “/Service”用于告诉可执行文件以“服务器模式”运行,即没有 GUI。自然,您的程序可能会以不同的方式使用它(注意“-”而不是“/”)。但从注册表设置我会说这是正确的。如果程序无法启动,这可能是您的问题的原因。最后,一些 COM 服务器也是 Windows 服务(但不是全部)并且必须这样运行。 '/RegServer' 标志应该可以解决问题。
  • 当您使用 /RegServer 时,程序会将自己注册为服务器/服务,然后退出。当您使用 /Service 时,该程序作为服务工作。当它由 services.msc 启动时,它应该使用 /Service 标志。但是,如果您的 /RegServer 不起作用,也许这就是问题所在。查看日志,奇怪的是它尝试“InprocServer32”键而不是“LocalServer32”或“LocalService”,就像您在 CreateInstance 调用中指定 CLSCTX_INPROC_SERVER 而不是 CLSCTX_LOCAL_SERVER...
  • 哦,我的错! /RegServer 将程序注册为本地服务器(创建 COM 对象的程序在需要时运行),而 /Service 将程序注册为系统服务。除此之外,它们的行为应该相似。你试过两者都用吗?并在没有选项的情况下启动 EXE?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2011-01-05
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多