2

我已经设法从 C++ 中的 DLL 调用一个函数,但我想向它传递一个参数。

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

// 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 是一个类。这可能吗?

4

2 回答 2

0

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

跨模块边界工作时要记住的一些事情是,

  1. 确保使用相同的定义编译结构
  2. 最好使用相同编译器的相同版本。因为例如 VS 8 和 VS 9 带有它们自己的 C/C++ 运行时,并且使用它们自己的单独堆。因此,无法从使用 VS 9 编译的模块中删除使用 VS 8 从一个模块分配的内存。通常,此问题表现为“当我将内存分配给作为我的 dll 导出引用传入的 std::string 时,我的 dll 崩溃”功能”
  3. 确保不要混合为发布和调试配置构建的模块(同样的原因 - 发布和调试 CRT 中的堆不同)。
于 2012-12-14T13:35:34.427 回答
0

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

于 2012-12-14T13:20:04.043 回答