什么可能阻止DLL加载LoadLibrary?

时间:2009-05-08 22:37:06

标签: visual-c++ dll loadlibrary jdedwards

我有一个JD Edwards业务功能,它是用Microsoft Visual C ++编写的C模块。我正在使用LoadLibrary访问第三方DLL。在一个独立的测试程序中,代码运行得很好。当我在JDE中运行它时,LoadLibrary返回NULL并且GetLastError返回126,这意味着The specified module could not be found根据MSDN。我已经尝试放入DLL的完整路径,是的,我记得要加倍路径中的\字符。没有区别。

我已经检查过以确保没有依赖项会阻止DLL加载; DUMPBIN / DEPENDENTS返回以下内容:

WSOCK32.dll
USER32.dll
GDI32.dll
WINSPOOL.DRV
ADVAPI32.dll
KERNEL32.dll

这些看起来像标准的Windows DLL,所以我很茫然。

6 个答案:

答案 0 :(得分:5)

缺少依赖?您是否已使用Dependency Walker检查是否找到了所有引用的库?

答案 1 :(得分:3)

如果在LoadLibrary调用期间附加调试器,它可能会向调试输出发出错误信息。除了此处的其他建议外,如果清单中有错误,则会出现此问题。

我很确定它对你来说是一个依赖问题。尝试ProcMon的事情,并尝试在Vista上运行,看看是否能解决问题。您可以获得测试VPC图像here

答案 2 :(得分:1)

我曾经遇到过同样的噩梦。我无法诊断任何东西,我发现重置dll搜索列表顺序路径(这里的关键字可能是'list',而不是'order')修复了这个问题。

SetDllDirectory会(NULL);

解释是中间的第三方DLL可能正在弄乱它,而不恢复其原始状态。这可以解释为什么只有你的测试应用程序正常工作。

答案 3 :(得分:0)

您可以尝试在ProcMon运行时进行测试,并在启用文件监控时查看是否有任何错误。

答案 4 :(得分:0)

另外,可以使用配置文件选项运行Dependency walker。 在这种情况下,exe必须在依赖walker中加载。 Afetrwards菜单 可以使用“配置文件”。

然后启动应用程序并填充dll树。这也将显示 延迟加载dll丢失和其他东西。

答案 5 :(得分:0)

如果您没有通过检查依赖关系找到答案,我建议您专注于由于体系结构而可能出现的问题。

您提到您正在使用独立的测试环境,但是当您在常规环境中尝试它时,它不起作用。业务功能设置是否在服务器中运行?

自从我上次使用JDE以来已经有一段时间了。我记得有一次我在C中写了一个BSFN来调用几个同步的UBE,它在我的本地机器上工作正常,在我在服务器上测试时没有用。有一些关于服务器无法找到DLL(即使我提供了一个路径)和一些必需的设置。另外,在我的情况下,有一个区别是关键的:在我的机器上,BSFN将等待UBE的完成并捕获状态,在服务器上它不会,它也与对象的设置有关

同样,如果您没有找到任何有用的信息,请尝试在www.jdelist.com上寻求帮助。