从dll调用地址函数

时间:2016-12-22 19:03:36

标签: c++ function dll

晚上好!

我偶然发现了一个非常具体的c / c ++问题,我希望你能引导我朝着正确的方向前进! ;)

应该做些什么: 我想研究一种用于循环融合的运行时优化的方法。 因此,收集一定数量的循环体(lambdas)并在一个循环中执行它们(第一步。稍后,应该进行高级优化)。所以我需要一个方法来在动态加载的.dll中执行可变数量的函数。

我想要的是:

我将灵活数量的lambda函数保存为std :: function。 现在我想在运行时创建一个.dll,它使用这个lambda函数。 所以,我通过调用(void *)(& fn.fn())来接收这个函数的地址。 这是一个文件,这个文件在c ++应用程序中被编译为.dll和importet。 但遗憾的是,通过地址调用函数失败了.. 也许我对绝对错误的气味,我希望,你可以帮助我!

现在代码的相关部分: 简化的输出文件,应编译

    #include <functional>
    #include <iostream>
     extern "C"{
      __declspec(dllexport)  void doLoop() {
          using fn_t = std::function<void(size_t)>;
          // get the address by calling in the host application: (void*)(&fn.fn())
          auto &fn = *((fn_t*)0x00835DE8); 
          fn(1);
     }
   }

主机中使用MinGW的编译

    if (system(("g++ -std=c++11 -DBUILD_DLL -Wall   -c lib" + identifier_ + ".cpp").c_str()) == -1)
            throw std::runtime_error("Error in lib compile.");
    if (system(("g++  -shared -o lib" + identifier_ + ".dll  libtest.o  ").c_str()) == -1)
            throw std::runtime_error("Error in lib link."); 


     HINSTANCE hInst = LoadLibrary(L"libtest.dll");
     if (!hInst){
        std::cerr << "..." << std::endl;
    }
    //"typedef void(__stdcall* FNPTR)();" in the header
    FNPTR fn = (FNPTR)GetProcAddress(hInst, "doLoop");
    if (!fn){
        std::cerr << "..." << std::endl;
    }
    fn(); 

函数调用fn()崩溃了 “0xC0000005:访问冲突执行位置0xCDCDCDCD

非常感谢你!

最好的问候, 阿明

0 个答案:

没有答案