質問: 0; // ... }; // 実際に動くクラス class CInternetExplorer : public IInternetExplorer { public: CInternetExplorer(); ~CInternetExplorer(); bool Run( bool bVisible ); // IE起動 bool Open( char *url ); // url のところに... ... }; IInternetExplorer* CreateInstance( bool bVisible ); ``` (一応、メンバ関数定義ありますが、省略...) それで、 MinGW 側の実行ファイルでは (Windows APIの)動的リンクでリンクしています。 (もちろん、インターフェースクラスも定義した状態で.) CreateInstanceで オブジェクトを生成するところまではうまくいくのですが、 なぜか 実際にオブジェクトを操作 ( Run関数とか ) をするとクラッシュ(?)します。 考えた末、 DLLでFactoryMethodパターンを適用し生成 -> DLLの関数にオブジェクトを渡して間接的に操作... にたどり着きました。 つまり、 DLLでは ■ インターフェースクラス ■ 実装クラス ■ CreateInstance ( FactoryMethodパターン適用で インターフェースクラスオブジェクトを返す ) ■ RunIE関数 ( グローバル関数. 引数の インターフェースクラス を受け取り、代理で動かす. ) ■ OpenIE関数 ( グローバル関数. 引数の インターフェースクラス を受け取り、代理で動かす. ) ... みたいにして、 実行ファイル側はオブジェクトをいじらないでそのまま RunIE関数等に渡して... という感じです。 動くことは動くのですが、 なぜ実行ファイルで そのまま動かそうとするとクラッシュ状態になるのでしょうか。 実体は生成されているはずなのに... 理由がわからない... もっとほかにいい方法があるのでしょうか。 外部ライブラリに頼る方法もありますが、 Windowsだとmakeが使えないようだし、 libxl っていうライブラリ ( Excel操作 ) は 静的リンク しかできないようだし... かといって、MinGWでは そのままではできないようだし... Q2. また、DLLの関数に生成したオブジェクトを渡して間接的に使う方法で、なぜかdelete文が作動しません。 実行ファイル側でdeleteしてもクラッシュ(?)し、DLLの関数に任せる方法にしてDLL側でdeleteしてもクラッシュします。 (この実行ファイルで使っている)メモリは少ないのでしょうけど、COMを使っているので、 タスクマネージャーの"プロセス" に残ります。 ( コマンドプロンプトのコマンド TASKKILL を使って、delete文の代わりに TASKKILLでプロセスを破棄する方法もありますが、 スマートじゃないので。 ) [環境等] 言語: C/C++ ( Windows API 実装あり ) 環境(基本): MinGW (g++) 環境(DLL): VC++ 2010 Express 聞きたいこと1: なぜDLLのオブジェクトを実行ファイルで使おうとすると実行時エラーになるのか. また その回避方法. 聞きたいこと2: (動的リンク時)DLLのクラスオブジェクトをFactoryMethodパターン適用&生成し、DLLの関数にオブジェクトを渡し、間接的に操作する場合、delete文でクラッシュする. その回避方法. 宜しくお願い致します。
回答: > > なぜ実行ファイルで そのまま動かそうとするとクラッシュ状態になるのでしょうか。 > > 実体は生成されているはずなのに... > > > これが何を言いたいのかがわかりません。デバッグでクラッシュしている箇所は見つけられないのでしょうか。 CreateInstance()やRunIE()などは自作メソッドなので、中身を提示していただかないとよくわかりません。 外部DLLを静的リンクせずに使用しているのであれば、WindowsAPIのLoadLibrary()やGetProcAddress()を使用されていると思いますが、そのあたりの結果はどうなっているのでしょうか? > > Q2. > > また、DLLの関数に生成したオブジェクトを渡して間接的に使う方法で、なぜかdelete文が作動しません。 > > 実行ファイル側でdeleteしてもクラッシュ(?)し、DLLの関数に任せる方法にしてDLL側でdeleteしてもクラッシュします。 > > > 別プロセスでもなければ、確保したローカルメモリはどこででも解放できます。 実行ファイル(newした場所と同じ?)でdeleteしても失敗するということは、newで確保したアドレスと同じ物を渡していないか、型が違う(配列など)ものを渡しているのではないでしょうか。