C语言中的LoadLibrary

时间:2019-06-06 16:57:39

标签: c loadlibrary

我有一个使用LCC编译器在Matlab中生成的DLL,我想从该DLL中调用一个函数。 DLL的名称是fcn_acDklGenerator,函数的名称也是fcn_acDklGenerator,因此,我编写了以下代码,但加载库失败。

char* libName = "\\fcn_acDklGenerator.dll";
TCHAR libFullPath[MAX_PATH + 1] = { 0 };
GetCurrentDirectory(MAX_PATH, libFullPath);
strcat_s(libFullPath, sizeof libFullPath, libName);
HMODULE matlab = LoadLibrary(libFullPath);

当我检查了libFullPath值时,LoadLibrary的输出为NULL,并且我确定DLL位于该路径中。

2 个答案:

答案 0 :(得分:0)

可能有很多原因,并且有很多技术可以对其进行跟踪,因此,这是一个社区Wiki答案,希望可以帮助许多面临DLL加载问题的人:

导致LoadLibrary失败:

  • .dll文件找不到,不可读或不可执行。 (由于变化的搜索路径规则,文件系统重定向,已在进程中加载​​的同名另一个DLL,SxS缓存,ACL,互斥共享,被标记为删除,受到恶意软件保护工具的干扰等,这可能会变得复杂。)< / p>

  • 该DLL是64位的,您正尝试将其加载到32位进程中,反之亦然。

  • 该DLL(直接或间接)依赖于另一个无法加载的DLL。 (换句话说,可能需要递归应用此列表。)

  • 该DLL没有可用的合理地址范围(极不可能)。

  • DllMain(或其他名称的等效功能)使用了错误的调用约定。

  • DLLMain返回错误。

  • DllMain创建一个死锁。尽管这通常会导致挂起,但可以想象,在某些情况下,加载程序可能会检测到它并只是使加载失败。

用于诊断特定实例的技术:

  • 对LoadLibrary的调用失败后立即检查GetLastError通常有助于缩小可能性。

  • 根据过程的SetErrorMode设置,您还可以从出现的对话框中收集一些信息。

  • 在像Visual Studio这样的调试器中逐步执行LoadLibrary调用可以在调试输出窗口中提供提示,因为您可能会看到正在加载的其他DLL以及所请求的DLL。

  • 您还可以使用Sysinternals的PROCMON之类的工具查看实际正在搜索的路径,打开文件失败的尝试遇到的是哪种I / O错误等。

  • 您可以将琐碎的DllMain暂时替换为复杂的DllMain,以确定复杂的DllMain是否是导致故障的原因。

dumpbin和DependencyWalker之类的工具可以回答有关位数,是否导出了DllMain以及需要哪些其他DLL的问题。

答案 1 :(得分:-1)

在调用LoadLibrary位置检查代码之前:
if ( GetFileAttributes(libFullPath) == 0xFFFFFFFF ) { //Something went wrong //print error code for GetLatError() }

调用LoadLibrary位置检查代码后:
if ( matlab == NULL ) { //Something went wrong //print error code for GetLatError() }