- ベストアンサー
ATLについて
ATLを理解するため ATLをつかった簡単なサンプルプログラムを探しているのですが 参考になるサイトや良い書籍があればアドバイスお願い致します。 「com化しておくと便利」とか聞くのですが いまいちピンときません。 DLLとは何が違うのでしょうか? com,ATL,ActiveXについて、関連があると思うのですが その関連についても分かり易くご教授頂ければ幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>ATLで使うものはレジストリに登録する必要があるのですよね? はい、あります。 >com(ATL)の場合のEXEとDLLの違いってなんでしょうか?(3種類あるみたいですが) ATLだからというのは関係ないのでおいておきます。 COMの場合、インプロセスサーバ、アウトプロセスサーバという言い方をよくします。 インプロセス、つまり呼び出し元と同一プロセス空間で動作するCOMサーバです。 #呼び出し元をクライアント、呼び出されるCOMコンポーネントのことをサーバと呼びます。 これにあたるのが、ActiveX DLL、ActiveXコントロールのような、DLLとして動作するものです。 逆にアウトプロセスサーバは、呼び出す元とは異なるプロセスとして動作するCOMサーバです。つまり、ActiveXEXEや、ActiveXDocumentsサーバということになります。 #ちなみに、DCOMでネットワーク越しに使用可能なCOMサーバはActiveXEXEのみです。 具体例をあげますと、ActiveXDLLは、ADOやDAO、ActiveXコントロールはVBでよく使われるスプレッドシート、ActiveXEXEとActiveXDocumentsサーバは、ExcelやWord という感じです。 >EXEの場合、レジストリ登録が必要なく返値が得られない.. >でしょうか。 EXEも登録する必要があります。 DLLの場合は、Regsvr32.exeで登録するのが一般的ですが、EXEの場合は自己登録といって、/RegsterServer(だったかな?)といったオプションをつけて起動することで登録するのが一般的です。 #少なくともMFC、ATL、VBで作成されたアウトプロセスサーバはこのパラメータを受け付けます。 >このreturn S_OKは >[out,retval] VARIANT *pVal で指定した >pValを返しているのでしょうか? >しかしこのretvalがよくわかりません。 >MSDNでみるとretval:メンバの戻り値を受け取るパラメータを指定します。 >となっているのですが。 S_OKは、HRESULTの方になります。 COMのメソッド、プロパティは、戻り値はvoidまたはHRESULTというのが決まりとなっており、HRESULTの場合は成功失敗とその付加情報を返すだけとなっています。 利用する側は、C++ですとFAILEDマクロ、SUCCEEDマクロで成否を判断します。(付加情報があるため単純な比較だとだめなため) ただ、これだと使い勝手が悪く不便なので、retvalという属性をつけることで、戻り値として扱う値だよという指示をつけてあげます。 VBですと、HRESULTの戻り値がトラップ可能なエラーで、retvalで返される値がメソッドの戻り値というように、読み替えられて扱われます。 VC++で、#importを使ってCOMを使用する場合も、VBと同様な使用方法(retvalを戻り値として扱う)も可能です。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
うーん、サイトはどこもいまいちですねぇ。 ウィザードの使い方くらいは書いてありますが、本格的なところはあんまり・・・ ATL プログラミング なんてキーワードでgoogleといくつかは出てきますが、 どこもそれなり。 本ですとこちらが良いかと。 http://www.amazon.co.jp/exec/obidos/ASIN/4797306890/250-8739957-3629021 http://www.seshop.com/detail.asp?pid=35 私は上のほうのを持っています。もう絶版ですね。 最近は.NETに押されぎみでCOM関連はあまりいい書籍は見当たりませんね。 >「com化しておくと便利」とか聞くのですが いまいちピンときません。 COMの一番のメリットは、どの言語で作成したCOMオブジェクトも、使う側は作成言語を意識せずに使用可能ということですね。 ASPやVBScript等のスクリプトからも使用可能です。 これは、コンポーネントからの機能の公開の仕方、機能の利用方法がバイナリレベルで厳格に決められているからです。 >DLLとは何が違うのでしょうか? 通常のDLLの場合、公開されるのは関数単位ですが、COMの場合はオブジェクト単位になります。 また、COMの場合、DLLである必要がありません。 EXEでもかまいません。 さらに、コンポーネントが別のPCにおかれていても使用することができます。(これがDCOMになります) >com,ATL,ActiveXについて、関連があると思うのですが >その関連についても分かり易くご教授頂ければ幸いです。 COMという言葉自体は、メカニズムそのものをさします。 ActiveXやオートメーションと呼ばれる機能の基本技術です。 ATLはCOMコンポーネントを作るための、テンプレートを使用したC++のフレームワークです。 ActiveXは、COMを使用した技術の総称です。 ActiveXコントロール、ActiveX DLL、ActiveX EXE等があります。
お礼
taka_tetsu様ご回答ありがとうございます。 >ActiveXコントロール、ActiveX DLL、ActiveX EXE等があります。 確認したいのですが、 ATLで使うものはレジストリに登録する必要があるのですよね? com(ATL)の場合のEXEとDLLの違いってなんでしょうか?(3種類あるみたいですが) EXEの場合、レジストリ登録が必要なく返値が得られない.. でしょうか。 http://www.erde.co.jp/~katsu/com/02.html をみているのですが このreturn S_OKは [out,retval] VARIANT *pVal で指定した pValを返しているのでしょうか? しかしこのretvalがよくわかりません。 MSDNでみるとretval:メンバの戻り値を受け取るパラメータを指定します。 となっているのですが。 質問が多岐に渡りますが、もしよければご回答お願いします。
お礼
丁寧にご説明頂き有難うございます。 大変参考になりました。