未访问加载了LoadLibrary()的dll,并显示错误“找不到dll”

时间:2019-12-17 11:05:51

标签: c windows dll mingw

我是编程方面的初学者。这是我为Windows编写的一个C程序的摘录,试图使用通过mingw32编译的NCurses库。

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();

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

我做错什么了吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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