Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将参数从c+中的DLL传递给函数+; 我已经设法在C++中从DLL调用函数,但是我想把一个参数传递给它。< /P>_C++_Opengl_Dll_Sdl - Fatal编程技术网

将参数从c+中的DLL传递给函数+; 我已经设法在C++中从DLL调用函数,但是我想把一个参数传递给它。< /P>

将参数从c+中的DLL传递给函数+; 我已经设法在C++中从DLL调用函数,但是我想把一个参数传递给它。< /P>,c++,opengl,dll,sdl,C++,Opengl,Dll,Sdl,我当前正在使用SDL,我想将SDL事件“event”传递给源代码中的函数。示例如下: // DLL typedef void (*Events)(SDL_Event *event); static __declspec(dllexport) void HandleEvents(Events events) { events(&d2Main::event); } // Application int main() { d2Main::HandleEvents(&H

我当前正在使用SDL,我想将SDL事件“event”传递给源代码中的函数。示例如下:

// DLL
typedef void (*Events)(SDL_Event *event);
static __declspec(dllexport) void HandleEvents(Events events)
{
    events(&d2Main::event);
}

// Application
int main()
{
    d2Main::HandleEvents(&HandleEvents);
}

void HandleEvents(SDL_Event *events)
{
     if(events.type == SDL_QUIT)
          // Do stuff
}
d2Main是一个类。
这可能吗?

使用nm实用程序(GNU二进制实用程序)查看dll文件中的符号表,然后以调用常规函数的相同方式调用它,方法是使用extern“C”{your function}声明包装要调用的函数。您的函数应该由链接器链接,因此您还应该添加-L./-ldllfile作为g++或gcc的开关。

我假设d2Main::event是静态SDL\u事件对象。是的,这是可能的。只要应用程序和DLL看到的结构SDL_事件的定义是相同的(包括结构内部元素之间的填充和打包-出于成员对齐的原因)

跨模块工作时需要记住的一些事情是

  • 确保使用相同的定义编译结构
  • 最好使用同一编译器的同一版本。因为例如VS 8和VS 9都有自己的C/C++运行时,并且使用各自的堆。因此,使用VS 8从一个模块分配的内存不能从使用VS 9编译的模块中删除。此问题通常表现为失败,如“当我将内存分配给作为对dll导出函数的引用传入的std::string时,我的dll崩溃”
  • 确保不要混合为发布和调试配置构建的模块(相同的原因-发布和调试配置中的堆不同)