c - 使用 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();
我已经包含了必要的头文件并且没有编译错误或警告。
难道我做错了什么??
解决方案
问题是,您在启动程序后加载库,但如果您使用代码中的函数,则尝试解析未解析符号的运行时链接器需要在将控制权传递给实际程序之前找到库.
所以,你不能这样做。可以不ncurses
直接使用函数,而是定义一堆函数指针并用 手动解析您需要的符号GetProcAddress
,但这很麻烦。例如像这样:
void (*initscr)() = GetProcAddress(hGetProcIDDLL, "initscr");
另一种可能性是,静态ncurses
链接库,因此在运行时不需要它。
推荐阅读
- github - 具有多组织结构 nw 的金枪鱼
- openshift - 如何使用备用后端修补路由
- python-3.x - 我怎样才能使它成为一个恒定的循环?
- javascript - 如何使用按钮和 redux 隐藏/显示单独的表单?
- mysql - nodejs MYSQL中的mysql.format对未转义的输入是否安全?
- c++ - 使用模板处理字符串和wstring
- snmp - 从现有 OID 中自动检测 PySMI 解析的 MIB
- ios - 为 iOS 应用程序创建了一个下一步按钮...单击时出现 SIGABRT 错误
- flask - 两个路由处理程序被调用
- unit-testing - 使用 Vuex 的 Vue.js-electron 应用程序的设置测试