c++ - 加载 DLL 函数的更好方法?

标签 c++ c windows dll

我觉得有比在 typedef 中拥有数百个签名然后通过 GetProcAddress 加载指针更好的方法。据我所知,加载 DLL 函数时它是最简单的,但也很麻烦。

有没有更简单的方法来加载 DLL 函数?具体是大量的Winapi和Tool Help库函数?我知道您可以只“包含一个 .lib”,但我觉得那样会导致不必要的膨胀;我也无法访问源代码(尽管 Jason C 提到可以从 .dll 转到 .lib)。

我正在寻找为此编写一个库。我觉得主要障碍是处理具有不同签名的函数;或者这正是为什么每个人都使用 typedef 而不是“一些奇特的循环”来加载他们的 DLL 函数的原因?

最佳答案

您的函数必须以某种方式声明,因此您需要函数签名。但是,如果您觉得自己在重复函数签名,则可以使用 decltype(&func_name) 来消除重复(给定一个具有相同目标签名的函数 func_name)。您可以将其包装在宏中以使其更可口。

另一种常见的方法是将所有函数指针放入一个大结构(或一堆特定于任务的结构),然后加载一个指向该结构的指针(例如,通过加载一个返回该结构指针的函数) .这看起来像下面这样:

通用 header

struct func_table {
    void (*f1)(int);
    int (*f2)(void);
};

动态链接库

static struct func_table table = {
    &f1_Implementation,
    &f2_Implementation,
};

DLLEXPORT struct func_table *getFuncTable(void) {
    return &table;
}

使用 DLL 的程序

static struct func_table *funcs;

void loadFuncTable() {
    struct func_table (*getFuncTable)(void) = GetProcAddress(..., "getFuncTable");
    funcs = getFuncTable();
}

/* call funcs->f1(n) and funcs->f2() */

关于c++ - 加载 DLL 函数的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18029089/

相关文章:

c - 为什么我的 C Yacc/lex 计算器无法正确解析?

C:我应该在哪里释放我的指针?

c++ - math.h 的问题

c++ - 将 SIGINT 指向某个用户定义的处理程序一段时间后,如何将其重置为默认值?

c++ - C/C++ 动态链接如何在不同平台上工作?

iphone - 是否有任何 Windows 模拟器可用于测试 iPhone 应用程序?

python - Tkinter Cxfreeze 错误

windows - 如何从命令行中删除系统驱动器中的所有文件夹

c++ - 在 g++ 中使用版本脚本导出 c++ 构造函数

c++ - 如何根据 STL 列表中的元素数量分配内存?