【问题标题】:C LoadLibrary in a loop循环中的 C LoadLibrary
【发布时间】:2020-12-04 21:41:20
【问题描述】:

我尝试遍历一个目录并从几个 dll 文件中加载函数。每个 dll 文件只导出一个与 dll 同名的函数。问题是,它只加载第一个文件。

DIR *d;
struct dirent *dir;
d = opendir(".");
if(d) {
    while((dir = readdir(d)) != NULL) {
        // split filename into 'name', 'ext' and 'fullname'
        // '.', '..' and all unliked files are sorted out correctly
        HINSTANCE ext_dll = LoadLibrary(fullname);
        if(NULL != ext_dll) {
            MYPROC ext_func = (MYPROC) GetProcAddress(ext_dll, name);
        }
        ext_dll = NULL;
    }
}

但是,当我只写两次时,它就可以工作。

HINSTANCE ext_dll = LoadLibrary("ext1.dll");
if(NULL != ext_dll) {
    MYPROC ext_func = (MYPROC) GetProcAddress(ext_dll, "ext1");     
}
ext_dll = LoadLibrary("ext2.dll");
if(NULL != ext_dll) {
    MYPROC ext_func = (MYPROC) GetProcAddress(ext_dll, "ext2");    
}

我的代码有问题还是 LoadLibrary 不应该这样使用?

谢谢

【问题讨论】:

  • 你对目录做了什么,比如...
  • 当我打印正确的名称时,我会将所有这些都整理出来。我编辑问题。
  • 这看起来像是 Windows 代码 (LoadLibrary 等) 和 Linux 代码 (readdir) 的混合体。这是怎么回事?
  • 好吧,如果这不是实际代码,而是它的替代品,那么您能展示实际代码吗? LoadLibrary 并没有感觉到你在循环中使用了它
  • @NoOb 这与信念或证明无关。关于stackoverflow.com/help/minimal-reproducible-example

标签: c loadlibrary


【解决方案1】:

OP 的linked code(虽然不是发布的)包括以下内容。

    d = opendir(".");
    setvoidfunc = (MYSETVOIDPROC) GetProcAddress(dll, "setVoidCallBack");
    if (d) {
        while ((dir = readdir(d)) != NULL) {
            char *tok = strtok(dir->d_name, ".");
            if(NULL == tok)
                continue;                

strtok 调用(可能)修改了dir->d_name 缓冲区,这违反了readdir 的开放组要求。

应用程序不得修改 readdir() 的返回值所指向的结构也不得修改结构内指针所指向的任何存储区域。

由于违规,在第一次修改 dir->d_name 之后发生的所有事情都未由标准和实现相关的定义定义。

【讨论】:

  • 这么愚蠢的错误 =( 谢谢你,现在可以了!
  • 我考虑重写整个问题,因为我认为现在大多数找到这篇文章的人(像我一样)除了加载库之外还有另一个问题。这样做可以吗?
  • @NoOb another problem 然后你应该发布一个不同的问题,也许编辑这个问题以添加指向另一个问题的链接,解释它们如何/为什么相关。不鼓励更改现有问题,尤其是得到回答之后。
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多