2

C++ で DLL から関数を呼び出すことができましたが、それにパラメーターを渡したいと思います。

現在 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 はクラスです。これは可能ですか?

4

2 に答える 2

0

d2Main::event は静的な SDL_Event オブジェクトだと思います。はい、可能です。アプリケーションと DLL から見た構造体 SDL_Event の定義が同じである限り (構造体内の要素間のパディングとパッキングを含む - メンバーの整列のため)。

モジュールの境界を越えて作業する場合に覚えておくべきことは、次のとおりです。

  1. 構造体が同じ定義を使用してコンパイルされていることを確認する
  2. 同じコンパイラの同じバージョンを使用することをお勧めします。たとえば、VS 8 と VS 9 には独自の C/C++ ランタイムが付属しており、独自のヒープを使用しています。したがって、VS 8 を使用して 1 つのモジュールから割り当てられたメモリは、VS 9 を使用してコンパイルされたモジュールから削除することはできません。多くの場合、この問題は、「dll のエクスポートへの参照として渡された std::string にメモリを割り当てると、dll がクラッシュする」などの失敗として現れます。関数"
  3. リリース構成とデバッグ構成用にビルドされたモジュールを混在させないようにしてください (同じ理由 - リリース CRT とデバッグ CRT ではヒープが異なります)。
于 2012-12-14T13:35:34.427 に答える
0

nm ユーティリティ (GNU バイナリ ユーティリティ) を使用して dll ファイル内のシンボル テーブルを調べ、extern "C" { your function} 宣言を使用して呼び出したい関数をラップすることにより、通常の関数を呼び出すのと同じ方法で呼び出します。関数はリンカーによってリンクされる必要があるため、g++ または gcc へのスイッチとして -L ./ -ldllfile も追加する必要があります。

于 2012-12-14T13:20:04.043 に答える