如何为DLL函数编写(通用)自替换存根函数?

时间:2014-01-08 18:07:37

标签: c stub idioms dlopen idiomatic

我有一些功能,比如我从DLL获取int foo(int x)(使用dlsym())。所以,目前我的代码看起来像这样:

void foo(int x) {
    void (*foo)(int x);
    foo = dlsym(dll_handle, "foo");
    int y = foo(x);
    printf("y is %d", y);
}

我希望这个代码可以用于(像这样的代码):

void bar(int x) {
    int y = foo(x);
    printf("y is %d", y);
}

因此foo()是一个调用dll函数的存根(但不必每次都搜索DLL)。

  1. 实现单一功能的最佳方法是什么?
  2. 对于许多函数的情况,我如何避免编写一堆复制粘贴存根?考虑到签名,宏解决方案可能很棘手。也许基于C ++ 11的variadic-arg基于模板的东西?
  3. 我对以下答案的解决方案有一个基本的想法,但我不太确定,我想在这里采用“最佳实践”方法。

2 个答案:

答案 0 :(得分:1)

你已经在问题中回答了自己。一个小的改进可能是检查dll的“更新”,如果有的话。

int foo(int x) {
     static void (*dll_foo)(int x) = NULL;
     static void *foo_dll_handle = NULL;
     if (dll_foo == NULL || foo_dll_handle != dll_handle) {
          dll_foo = dlsym(dll_handle, "foo");
          foo_dll_handle = dll_handle;
     }
     return dll_foo(x);
}

答案 1 :(得分:0)

对于单一功能的情况,我认为这样的事情应该是正确的:

int foo(int x) {
     static void (*dll_foo)(int x) = NULL;
     if (dll_foo == NULL) {
          dll_foo = dlsym(dll_handle, "foo");
     }
     return dll_foo(x);
}