首页 > 解决方案 > 使用 LoadLibrary() 加载的 dll 未被访问,显示错误“找不到 dll”

问题描述

我是编程的初学者。这是我为 Windows 编写的 C 程序的片段,尝试使用 NCurses 库,用 mingw32 编译。

char NPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH, NPath);
char *dllDirectory = malloc(strlen(NPath) + strlen("\\dlls") + 1);
strcpy(dllDirectory, NPath);
strcat(dllDirectory, "\\dlls");
SetDllDirectoryA(dllDirectory);
HINSTANCE hGetProcIDDLL = LoadLibrary("libncursesw6.dll");
if (!hGetProcIDDLL) {
    printf("libncursesw6.dll could not be loaded!");
    return -1;
} else {
    printf("loaded libncursesw6.dll\n");
}

我试图从可执行文件的同一文件夹中的dlls子文件夹加载 libncursesw6.dll。上面的代码完美运行并显示,加载了 dll。

但是当我尝试使用库函数时,我收到一个错误框,告诉我找不到 libncursesw6.dll。如果将 dll 与可执行文件一起放置(这是我试图避免的),则该程序可以正常工作。

在上一个片段之后添加以下行时,我收到运行时错误。

initscr();
addstr("Hello World");
refresh();
getch();
endwin();

我已经包含了必要的头文件并且没有编译错误或警告。

难道我做错了什么??

标签: cwindowsdllmingw

解决方案


问题是,您在启动程序后加载库,但如果您使用代码中的函数,则尝试解析未解析符号的运行时链接器需要在将控制权传递给实际程序之前找到库.

所以,你不能这样做。可以不ncurses直接使用函数,而是定义一堆函数指针并用 手动解析您需要的符号GetProcAddress,但这很麻烦。例如像这样:

void (*initscr)() = GetProcAddress(hGetProcIDDLL, "initscr");

另一种可能性是,静态ncurses链接库,因此在运行时不需要它。


推荐阅读