2012-01-18 91 views
1

我们有一个在Vista和Win7上运行良好的DLL一段时间,但在XP上运行时出现错误“调用LoadLibrary()加载它时,找不到指定的程序”在Windows XP上运行应用程序时出现“无法找到指定的程序”错误(例外c0000139)

我试着用配置文件选项运行它通过Dependency Walker中,以全局标志设置为显示卡装载器的唯一貌似有用的信息,我可以把它弄出来是:

LDR: Snapping imports for MyDll.dll from KERNEL32.dll 
LDR: LdrGetProcedureAddress by NAME - RtlGetLastWin32Error 
LDR: exception c0000139 thrown within function LdrpSnapIAT 
Exception record: 0012E490 
Context record: 0012E4A4 
Context->Eip = 7C9673BE 
Context->Ebp = 0012E7C0 
Context->Esp = 0012E770 
LDR: LdrpSnapIAT - caught exception c0000139 snapping thunks (#2) 
LDR: LdrpWalkImportTable - LdrpSnapIAT #2 failed with status c0000139 

我相信,例外c0000139是'未找到入口点'。

我们已经注意确保没有任何对后XP API的直接依赖关系(有几个,但这些都是动态加载的LoadLibrary())。该dll建立了WINVER_WIN32_WINNT设置为0x0501。库的入口点在依赖关系监视器中显示的输出中可见,并且没有明显的缺失依赖关系。相同的应用程序在Vista和Win7中运行得非常好。早期版本的dll在XP上运行良好(由于此组件的性质,很难看出哪些更改会导致事件中断)。

编辑:其他的事情我认为我打折:

  • Visual Studio的运行时间是从工作的dll和一个不都是一样的
安装
  • 清单文件

    还有什么明显的我失踪了吗?

  • +1

    一个完全胡乱猜测:XP机器没有所需的C运行时(CRT)库版本? – 2012-01-18 09:55:50

    +0

    是的,这是我的想法,但我添加了CRT。 – 2012-01-18 10:31:55

    +0

    我今天刚刚有同样的问题...我有一个DLL加载除Windows XP以外的所有类型的窗口。 (1a8.8c4):未知异常 - 代码c0000139(第一次机会) LDR:在函数LdrpSnapIAT中引发的异常c0000139 – Benj 2012-01-18 14:59:08

    回答

    4

    我不知道这是否会帮助你,但今天我用装载机捕捉也有同样的问题。事实证明,我的问题在depends.exe中是可见的,但我不知道dlls被粉红色的意义......我只用依赖诊断出口问题,而不是导入问题。

    我的问题是我使用的是“RegGetValue”,它只在Vista +上可用。不幸的是,如果您在Windows XP上使用仅Vista的API,则没有适当的错误报告。要看这显示出在进口部分,像这样:

    enter image description here

    我注意到,你的问题是与Kernel32.dll中,而不是Advapi.dll因此检查与进口依赖...

    +0

    顺便说一下,装载机捕捉没有告诉我,这是RegGetValue ...它只是精确定位Advapi,所以我有依靠取决于休息... – Benj 2012-01-18 15:25:40

    +1

    谢谢Benj,那正是问题所在!我还没有意识到粉红色图标的重要性,但我会将它记录下来。在我的情况下,它是'Kernel32.dll'。我的DLL调用了Vista中添加的一些功能(例如'InitialiseConditionVariable()')。当kernel32被加载时,这些无法解决,这会导致c0000139异常。 – 2012-01-18 16:32:23

    +0

    太棒了,很高兴它帮助!我有一种感觉,这是同样的问题。 – Benj 2012-01-18 17:02:38

    相关问题