晚上好!
我偶然发现了一个非常具体的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
非常感谢你!
最好的问候, 阿明