2009-06-24 20 views
0

現在、私が作ったシンプルなシステムでCOM DLLを使用しようとしています。すべてが正常にコンパイルされますが、実行時にCoCreateInstaceがS_OKを返していますが、何とか私のオブジェクトポインタがNULLを返しています。COMオブジェクトのインスタンス化エラー

このインターフェイスポインタは、クラスヘッダーに作成されます。最も奇妙なことは、メソッドスタックに同じポインタ型をインスタンス化すると正しいオブジェクトが生成されますが、後で__hookを呼び出すとBASE comクラスを作成しようとするとアクセス違反が発生することです。

役に立つかもしれないいくつかの他の側面

:CoInitalizeExでプログラムを実行しようとしました

  • はCOINIT_MULTITHREADEDとCOINIT_APARTMENTTHREADED

  • プロジェクトとして始まったが、それにCOM DLLを使用するDLLです

  • 新しいスレッドを開始せずに同じ方法を試しましたが、エラーは継続します。

  • 私はテストプログラム(スレッドなし、実行可能)を作成しました。オブジェクトは正常に作成され、正しくフックされました。だから私の推測それは何かに関連するDLL自体または関連するスレッドです。

PS:ボーナスの質問として、GoogleがCOMに関連して好都合なものを返さないのはなぜですか? :)

答えて

2

COMオブジェクトのIUnknown :: QueryInterface実装のバグのように思えます - 出力ポインタを設定せずにS_OKを返します。

インプロセスサーバー用のCoCreateInstanceは基本的に次のとおりです。

  • は、クラスファクトリ
  • コールのIClassFactoryを取得するために、メモリ
  • コールいるDllGetClassObjectにDLLをロード:: A割り当てクラスファクトリからのCreateInstance新しいオブジェクト
  • 新しいオブジェクトのIUnknown :: QueryInterfaceを呼び出して、目的のインターフェイスを取得します。

任意のステップでNULLを返してもS_OKは、最後のQIコールを除いてクラッシュするはずです。

+0

この方法では、私が作ったサンプルアプリケーションも失敗してしまうので、私はそうは思わない。 –

0

問題が見つかりました:module属性が静的ライブラリで定義されていて、COMオブジェクトが狂っていました。それをDLLソースに移動すると問題が解決しました。