2016-11-03 3 views
0

私はいくつかのコンポーネントをモジュール化しようとしているプロジェクトに取り組んでいます。これらの1つはWindowingです。私はメインのEXEに入力を戻そうとしていますが、メイン入力システムクラスのメインメソッドを呼び出すユーザーインターフェイス関数を使ってこれを行います。後者のクラスはあまりにも複雑すぎて、両方のシステムで利用できるヘッダを持つことさえあります(多くのクラスに依存します)。DLLはどのようにしてEXEクラスにアクセスできますか?

とにかく、実際の問題は、入力インターフェイスクラスのどのメソッドにもアクセスできないことです。

class WINDOW_EXPORT_CLASS GameWindow { 
private: 
    InputInterface *input; 
    virtual void SetInputPointer(InputInterface *); 
    ... 
}; 

これは私のDLL/SOファイルにあり、このすべてにアクセスできます。しかし、私は入力のメンバーにアクセスすることはできません。 Bashがシンボルの検索エラーでクラッシュする:

./bin/window.so: undefined symbol: _ZN14InputInterface16SetMouseInWindowEb 

これを解決する方法はありますか?私の入力インタフェースクラスのヘッダは両側に含まれています。クラスにはvoid関数が含まれており、エクスポートされません(私はそれが可能であるかどうかわかりません。エクスポートする必要がある場合は、どうすればいいか教えてください)。

+1

おそらくプラグインインタフェースが必要です。 –

+0

他のユーザーである1201ProgramAlarmは書き込み応答を持っていましたが、私はそれが何であるかは分かりません。InputInterfaceのヘッダーは実行可能ファイルにあり、そのヘッダーは実行可能ファイルとdllの両方で参照されていました。機能仮想化で問題を解決しました。 –

答えて

1

DLL仮想からアクセスするメソッドを作成できます。その後、あなたが1つを呼び出すと、エクスポートされたシンボル名ではなくvtable(EXEに設定されている)で関数が検索されます。

これは、EXEが入力オブジェクトを作成してDLLに渡す必要があります。 DLLが入力オブジェクトを作成する必要がある場合は、EXEからファクタメソッドをエクスポートし、LoadLibraryなどで実行時に動的にファクタメソッドを探し出す必要があります。

+0

確認:各機能を仮想化した、うまくいきました! –

関連する問題