CreateInstance返回“找不到指定的模块”。

时间:2011-07-30 00:52:20

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

我一直在尝试使用Windows 2000的程序来处理Windows 2003。到目前为止,为了让程序在Windows 2003上运行,我必须做的一切都与错误的配置有关。现在,这段代码:

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

正在回归:

0x8007007E

或换句话说:

The specified module could not be found.

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

我使用Procmon试图找出程序找不到的内容,但是Procmon没有显示任何可能表明程序找不到内容的内容。

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

IClassFactory::CreateInstance failed. The specified module could not be found. severity: SEVERITY_ERROR, facility: FACILITY_WIN32 ($8007007E http://i52.tinypic.com/344bno0.png

如果查看图像的左侧,尝试创建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必须作为服务运行。我在分析Dependency Walker时尝试运行OleView,并尝试创建PFAdapterEnvPFCompMng的实例,以尝试找出我收到Module not found消息框的原因。不幸的是,Dependency Walker没有显示任何遗漏。

UPDATE2:

也许我错过了Procmon日志中的内容,所以我通过在调用CreateInstance之前和调用之后立即捕获事件来创建新日志。也许别人可以看一看并告诉我,如果我错过了它?我根本找不到PFMQListen.exe无法找到的任何迹象......

这是指向带有Procmon文件,.csv文件和.xml文件的压缩文件夹的链接。

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

UPDATE3:

因此,我设法让Dependency Walker在个人资料模式下运行,以创建PFAdapterEnv的实例。 Dependency Walker未找到任何遗漏的.dll

因此,Procmon没有显示任何内容,Dependency Walker也没有显示任何内容。我正在使用ollydbg逐步处理程序集级别的代码,我注意到错误是在函数NdrClientCall2中创建的。我不知道这是否意味着什么。

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

UPDATE4:

我尝试使用/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

加载

谢谢, Krzys

1 个答案:

答案 0 :(得分:0)

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