2011-12-09 9 views
0

私はGCCコンパイルされたGUIアプリケーションとMSVC dllの間でクラスを渡したいですか?GCCクラスをMSVC dllに渡すには?

私はGUIのアプリは、プラグインDLLを

例伝えたい:これは擬似コードである私は明確な波平考える

(編集私は、この文句を言わない仕事を知っていると私は何を求めたことはどのようです。。。それを動作させると、本当に私が持っているクラスに関連することisintする:D)

class eventbase{ }//virutal copy constructor [edit:cloner .o0] 
class eventtype1{} // copy constructor [edit:cloner .o0] 
class eventtype2{} // copy constructor [edit:cloner .o0] 

および/ GUI/DLLへ...

から、これらのイベントを渡し、私は恐れて(うまくcertian A午前ctually)これは動作しませんので、私は回避策を求めます。プラグインに渡すイベントをどのように構築しますか?どのように管理していますか?

+0

私はそれがdllでCreateEventType1(params)を公開することによって行うことができると思います。しかしそれはGUI-> DLLです。それでも他の方法で行う方法はまだ考えられていません。 – n00b

+0

¤まず、「仮想コピーコンストラクタ」はありません。また、表示するコードはC++ではないか意味がありません。つまり、g ++とVisual C++の間のクラスを使用するには、バイナリレベルの標準、いわゆる "ABI"が必要です.Windows COMではABIです。つまり、あなたは効果的にCOMクラスについて話しています。イベントが必要なので、COMイベントのドキュメントをチェックしてください。もっと簡単な方法は、すべて同じコンパイラ**を使うことです。乾杯と、 –

+0

@ Alf P. Steinbach http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Constructorと私は決して私の人生でCOMを使用することはありません。同じコンパイラIDを使用するのではなく、プッシュプルイベントにtcpipソケットを使用し、コードの半分を書き直すより:D – n00b

答えて

2

問題はリンケージとC++マングリングです。 GCCとMSVCはDLL内で同じ名前のシンボルを生成しません。私が知っている唯一の方法は、関数と構造のCリンケージを使用して、アプリケーションとプラグインDLLの間のインターフェイスを設定することです。次のようなものがあります。

extern "C" 
{ 
    struct pluginClass 
    { 
     int pluginVersion; 
     void (*plugin_func)(); 
    }; 

    pluginClass * myPluginStartup(); 
    void myPluginShutdown(pluginClass * returnToHeap); 
} 

残念ながら、残念ながら、これはSTLコレクションやその他の複雑なクラスを渡すことはできません。私はあなたがこれよりも良い答えを見つけることを願っています。私はそれのために私の目を開いたままにします。

+0

これは私が欲しかった一般的なものですので、私は答えとして受け入れて移動します:)私はまた、dllに "free api result"関数が必要だと付け加えます。メモリ管理がコンパイラによって異なるので、ちょうど 'delete apires;'を書くことはできません – n00b

+0

ああ、ありがとう...シャットダウンはポインタを戻すことになっていたが、私は自動操縦に行ったと思う。正しく編集するように編集します。 – Greyson

関連する問題