从GetProcAddress获取的函数指针如果使用stdlib则会使程序崩溃

时间:2018-05-02 16:11:50

标签: c++ std loadlibrary

我正在尝试动态加载dll并在运行时从中调用函数。我已经成功获得了GetProcAddress的工作指针,但如果dll中的函数使用stdlib,程序会崩溃。这是加载dll的可执行文件的代码:

#include <iostream>
#include <windows.h>

typedef int (*myFunc_t)(int);

int main(void) {
  using namespace std;
  HINSTANCE dll = LoadLibrary("demo.dll");
  if (!dll) {
    cerr << "Could not load dll 'demo.dll'" << endl;
    return 1;
  }
  myFunc_t myFunc = (myFunc_t) GetProcAddress(dll, "myFunc");
  if (!myFunc) {
    FreeLibrary(dll);
    cerr << "Could not find function 'myFunc'" << endl;
    return 1;
  }
  cout << "Successfully loaded myFunc!" << endl;
  cout << myFunc(3) << endl;
  cout << myFunc(7) << endl;
  cout << myFunc(42) << endl;
  cout << "Successfully called myFunc!" << endl;
  FreeLibrary(dll);
  return 0;
}

以下是实际有效的dll代码:

#include <iostream>

extern "C" {

  __declspec(dllexport) int myFunc(int demo) {
    //std::cout << "myFunc(" << demo << ")" << std::endl;
    return demo * demo;
  }

}

int main(void) {
  return 0;
}

(注意main代码中的dll方法只是为了安抚编译器)

如果我取消注释std::cout行,那么程序会在cout << "Sucessfully loaded myFunc!" << endl;行之后崩溃,但在打印之前会崩溃。我知道必须有办法做我想做的事情;我需要改变它才能发挥作用?

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的那样,结果是编译器对main函数的要求暗示我无意中创建了一个exe,它明确地使用了文件扩展名dll,不是实际的dll(因为我不太了解我正在使用的编译器选项),这在某种程度上搞砸了该程序集的动态加载。