トップ回答者
登録を必要としないCOM コンポーネントをClickOnce 配置について

質問
-
Visual Studio2005にて上記の方法を試したところ以下の2つの問題に直面しました。
DLL 地獄の回避とClickOnceでのCOM コンポーネントの配置というサイトを参考に実装をしています。
質問1
現在対応中のアプリではDHTML Editting Controlをレジストリに書き込まない方法を試しており、2 つの異なるクラス ライブラリプロジェクト(※以降AとBと仮定します。)に同じ COM コンポーネントを使っています。回避方法として試したのは以下の通りです。
① プロジェクトAのCOM
コンポーネントの参照をそのまま残し、COM コンポーネントで使っているクラスの子クラスとして、新クラス(public DHTMLEditSon:DHTMLEdit)を作成します。② プロジェクトBではCOM コンポーネントの参照を削除し、プロジェクトAの参照を追加。従来COM コンポーネントで使用されていたクラスはすべてプロジェクトAの新クラスを利用します。
上記のように設定した場合、プロジェクトAのコンパイルには成功しましたが、プロジェクトBをコンパイルすると以下のエラーが発生しました。
【コンパイルエラー内容】
型’AxDHTMLEDLib.AxDHTMLEdit’が参照されていないアセンブリで定義されています。アセンブリ’AxInterop.AxDHTMLEDLib,Version=1.0.0.0’, Culture=neutral, PublicKeyToken=null’への参照を追加してください。
「COMコンポーネントを 1 つのクラス ライブラリでカプセル化することを推奨しています」(ClickOnce と Reg-Free COM によるアプリケーションの配置の簡略化)を参考にして、プロジェクトAにて「public DHTMLEditSon:DHTMLEdit」という新クラスを作って対応したのですが、結果的にはプロジェクトBをコンパイルするとエラーが発生してしまいました。
該当のエラーが発生したのはカプセル化の方法が間違っていたからでしょうか?
もし仮に本件のカプセル化についてお詳しい方がいらっしゃいましたら、アドバイスをお願い致します。
質問2
現在対応中のアプリのプロジェクトではSWFScout.dllとSWFScoutImgAddon.dllの有料COM コンポーネントを使用しており、それらをレジストリに書き込まずに使用したいと考えております。
Reg-Free Com配置の手順でコンパイル後、SWFScout.dllとSWFScoutImgAddon.dllを登録解除し、アプリケーションをVisual Studio IDE の外部から実行してみると、エラーが発生しました。アプリケーションのログを確認したところ下記のエラーがありました。
【エラー内容】
Error Message : 型 'SWFScout.FlashMovieClass' の COM オブジェクトをインターフェイス型 'SWFScout.IFlashMovie' にキャストできません。IID '{F380B108-C702-431F-AF30-5C426D26A8F8}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。
エラーが発生した箇所のソースはライセンスチェックようなライブラリであり初期化関数の呼び出すところです。
SWFScout.FlashMovie Movie = new SWFScout.FlashMovie();
Movie.InitLibrary("xxx", "yyy");(※xxxとyyyは、コンポーネントのライセンス認証情報です。)
SWF以外の別のコンポーネントでも同じ手順で試してみたところ、Reg-Free-Comの配置が上手くいきました。
そのため、もしかしたらSWF自体が特殊で、それにより何らかの不具合が生じたのではないかと考えております。
本件はライセンスチェックの部分でエラーが発生しているため、それが原因である可能性はありますでしょうか?
また、「COMオブジェクトをインターフェイス型にキャストできません」というエラーは他に何が原因で発生することがあるのでしょうか?
以上2つの問題につきまして、ご存知の方がいらっしゃいましたら、ご教授ください。
回答
-
該当のエラーが発生したのはカプセル化の方法が間違っていたからでしょうか?
どこかに「型’AxDHTMLEDLib.AxDHTMLEdit’」を有する何かが見えているのでしょう、プロジェクト B が使う型に。
参照設定を生じさせないためには、完全にそれが見えない形に”カプセル化”する必要があります。
たとえば、プロジェクト B 側で参照している型が、その見せたくない型から継承しているとかダメです。COM の前にかんたんなクラスライブラリプロジェクトで実験してみるとわかりやすいのではないでしょうか。
そうすれば、どの場合は参照設定が必要になるかが少し見えてくるかと思います。そのため、もしかしたらSWF自体が特殊で、それにより何らかの不具合が生じたのではないかと考えております。
本件はライセンスチェックの部分でエラーが発生しているため、それが原因である可能性はありますでしょうか?
また、「COMオブジェクトをインターフェイス型にキャストできません」というエラーは他に何が原因で発生することがあるのでしょうか?
その COM オブジェクトの QueryInterface が失敗したときです。
それが失敗する原因は、そのオブジェクトによるので、第三者には回答できません。
また、ライセンスの仕組みのせいかどうかも第三者には回答できませんし、メーカーからも回答してもらえない可能性があります。Reg-Free COM はそこまで一般的になっていない印象を受けるので、メーカーに聞いても「サポートしていない」で突っぱねられるかもしれません。
// QueryInterface と言っておきながら、実は別のオブジェクトを生成するパターンなら、そのオブジェクトのクラス ID が見つからないと言うことはあるかもしれませんが、推測に過ぎません。
- 編集済み AzuleanMVP, Moderator 2012年12月18日 14:49
- 回答の候補に設定 佐伯玲 2012年12月25日 5:34
- 回答としてマーク 佐伯玲 2012年12月26日 4:10
すべての返信
-
該当のエラーが発生したのはカプセル化の方法が間違っていたからでしょうか?
どこかに「型’AxDHTMLEDLib.AxDHTMLEdit’」を有する何かが見えているのでしょう、プロジェクト B が使う型に。
参照設定を生じさせないためには、完全にそれが見えない形に”カプセル化”する必要があります。
たとえば、プロジェクト B 側で参照している型が、その見せたくない型から継承しているとかダメです。COM の前にかんたんなクラスライブラリプロジェクトで実験してみるとわかりやすいのではないでしょうか。
そうすれば、どの場合は参照設定が必要になるかが少し見えてくるかと思います。そのため、もしかしたらSWF自体が特殊で、それにより何らかの不具合が生じたのではないかと考えております。
本件はライセンスチェックの部分でエラーが発生しているため、それが原因である可能性はありますでしょうか?
また、「COMオブジェクトをインターフェイス型にキャストできません」というエラーは他に何が原因で発生することがあるのでしょうか?
その COM オブジェクトの QueryInterface が失敗したときです。
それが失敗する原因は、そのオブジェクトによるので、第三者には回答できません。
また、ライセンスの仕組みのせいかどうかも第三者には回答できませんし、メーカーからも回答してもらえない可能性があります。Reg-Free COM はそこまで一般的になっていない印象を受けるので、メーカーに聞いても「サポートしていない」で突っぱねられるかもしれません。
// QueryInterface と言っておきながら、実は別のオブジェクトを生成するパターンなら、そのオブジェクトのクラス ID が見つからないと言うことはあるかもしれませんが、推測に過ぎません。
- 編集済み AzuleanMVP, Moderator 2012年12月18日 14:49
- 回答の候補に設定 佐伯玲 2012年12月25日 5:34
- 回答としてマーク 佐伯玲 2012年12月26日 4:10