【问题标题】:Pass a parameter to a function from a DLL in c++将参数从 C++ 中的 DLL 传递给函数
【发布时间】:2012-12-02 11:07:36
【问题描述】:

我已经设法从 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 是一个类。 这可能吗?

【问题讨论】:

    标签: c++ opengl dll sdl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我想 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 中的堆不同)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        相关资源
        最近更新 更多