C/C++でやっています。
基本的には MinGW (g++) でやっているのですが、(C/C++側で)IE操作やExcel操作もやってみたいと思い、
VC++でIE,Excel用のそれぞれのDLLを作成しています。
質問は2つほどあります。
Q1.
IE操作用 インターフェースクラス ( たとえば IInternetExplorer ) を定義し、
それを継承して 実際に動くクラス ( たとえば CInternetExplorer ) を定義し、
FactoryMethodパターンを適用して CreateInstance関数 でオブジェクトを生成しています。
C++
1 // VC++ でのDLL作成 2 3 // ここでタイプライブラリの取得(?) 4 // ... 5 6 // インターフェースクラス 7 class IInternetExplorer 8 { 9 public: 10 virtual ~IInternetExplorer(){} 11 12 virtual bool Run( bool bVisible ) = 0; // IE起動 13 virtual bool Open( char *url ) = 0; // 14 ... 15 }; 16 17 // 実際に動くクラス 18 class CInternetExplorer : public IInternetExplorer 19 { 20 public: 21 CInternetExplorer(); 22 ~CInternetExplorer(); 23 24 bool Run( bool bVisible ); // IE起動 25 bool Open( char *url ); // url のところに... 26 ... 27 }; 28 29 IInternetExplorer* CreateInstance( bool bVisible ); 30
(一応、メンバ関数定義ありますが、省略...)
それで、
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文でクラッシュする. その回避方法.
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/30 05:57
2016/06/30 09:07