Discussion:
ATLを使ったActiveXコントロール作成のガイド
(too old to reply)
asahi
2009-06-25 11:41:01 UTC
Permalink
これからATLを使ったActiveXのライブラリを開発する必要があるのですが、ActiveXを作成する上で参考になるガイダンス類を探しています。

とくに、命名規則やインタフェース定義で考慮すべきポイントについての情報を探しています。

やりたいことは、表示層と、ロジック層を分離し、ロジック層でオブジェクトをホストし、表示層からそれらを呼び出したいのです。(プロセスマーシャリング)

表示層:ActiveXコントロール - 業務層:COMオブジェクト
表示層のActiveXコントロールが業務層の検索メソッドを呼び出し、業務層から検索処理終了のイベントを発火させる。などなど。

ちょっと前ならActiveX関連の書籍が多くあったのですが、今ではほとんど見られなくなってしまい困っております。
これを見たらよいといった情報をお待ちしております。
UETA, Shin-ichi
2009-06-29 02:20:25 UTC
Permalink
こんにちは、植田です。
Post by asahi
これからATLを使ったActiveXのライブラリを開発する必要があるのですが、
ActiveXを作成する上で参考になるガイダンス類を探しています。
ん~、「これさえ読めばOK」的なものはなかなかないと思いますよ。
もう少し的を絞って質問しないと回答も漠然としたものになろうかと
思います。

ActiveX/COMの仕組みそのものは単純ですけど、それを支える
周辺技術や、その上に構築された応用技術がたくさんあるので、
表面的なことを羅列したところで理解は進みませんし、かといって
詳細すぎると分厚い本になってしまいます。

ActiveX/COM技術を俯瞰するならこの本↓がお勧めです。

Understanding ActiveX and OLE
http://ascii.asciimw.jp/books/books/detail/4-7561-1706-6.shtml


私はこの本のおかげでActiveX/COMの理解が深まりました。

# 10年以上も前の本なので、もう絶版になっているかも...。

著者の視点や切り口の違いで、何を重視して解説するかが書籍に
よって大きく異なります。
実装レベルのことならATLの使い方や仕組みに的を絞った書籍を
買い求めた方がよく、最終的にはMSDNライブラリのドキュメントを
読むのがいちばんです。

あとは地道にググって自分のスキルにあった解説をしてくれるサイト
を探すしかないでしょう。

たとえば、命名規則ならハンガリアン記法、インターフェイスの定義
ならタイプライブラリとMIDL、IDispatchインターフェイスとAutomation
といったように、それぞれに大きなテーマがあります。

COMの仕組みにまで踏み込むなら、C++の仮想関数テーブル(vtbl)、
参照カウンタ方式によるオブジェクトのライフサイクル管理、Factory
パターンなど、関連する技術がいろいろあります。
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
asahi
2009-06-29 08:28:00 UTC
Permalink
植田様 返信ありがとうございます。
Post by UETA, Shin-ichi
Post by asahi
これからATLを使ったActiveXのライブラリを開発する必要があるのですが、
ActiveXを作成する上で参考になるガイダンス類を探しています。
ん~、「これさえ読めばOK」的なものはなかなかないと思いますよ。
もう少し的を絞って質問しないと回答も漠然としたものになろうかと
思います。
もう少し範囲を絞るとすると、知りたいのはこんなものです。
・ATLをつかったときのプロセスマーシャリングの実装の仕方
 1.マーシャリングするための必要条件
 2.マーシャリングするために気をつけたほうが良いこと
 3.メンバー定義で気をつけたほうが良いこと
 4.命名規約 (レジストレーションの仕方などを踏まえて)

まさに、インタフェースの定義について知りたいのですが、上記に挙げたような事項を説明しているページや資料を見つけられず困っています。

そもそもマーシャリングを前提としたときに、引数として何が使用できるのか、どのように戻り値を返すべきか、ホストプロセスはインスタンスをどう管理すべきなのかなどなど、わからないことが多すぎて、質問を絞り込めないというのが現実です。
UETA, Shin-ichi
2009-06-29 10:58:56 UTC
Permalink
どうも、植田です。
Post by asahi
もう少し範囲を絞るとすると、知りたいのはこんなものです。
・ATLをつかったときのプロセスマーシャリングの実装の仕方
 1.マーシャリングするための必要条件
 2.マーシャリングするために気をつけたほうが良いこと
 3.メンバー定義で気をつけたほうが良いこと
 4.命名規約 (レジストレーションの仕方などを踏まえて)
「プロセスマーシャリング」という言い回しが不適切なのかも...?

マーシャリングはアパートメントをまたいでオブジェクトにアクセス
する場合に必要となる処理で、典型的にはプロセス間あるいは
マシン間の通信で適用されます。

# パラメータや戻り値などをマーシャリングによって中立的な
# データグラムに変換して転送し、アンマーシャリングによって
# それを元に戻す ― というのが実際の処理です。

表示層のCOMオブジェクト(ActiveXコントロール)と業務層の
COMオブジェクトがどちらもIn-Processサーバー型のCOM
オブジェクトで、同じアパートメントでホストとされているなら、
マーシャリングのことを考える必要はありません。

そうでない場合(たとえば業務層が独立したバックグラウンド
プロセスやサービスとして稼動している場合)であっても、
IDispatchインターフェイスを基底とする、Automation互換の
インターフェイス(dispinterface)の範囲内でインターフェイスを
定義しておけば汎用マーシャラがマーシャリングしてくれるので
余計なものを作らずに済みます。

より効率を求めたり、Automation互換ではないデータ型を扱う
場合にカスタムマーシャリングを実装することになります。
MIDLが自動的に作ってくれるスタブ/プロキシで間に合うなら
それを使ってもいいでしょう。
マーシャリングを完全にコントロールしたい場合はIMarshal
インターフェイスを実装することになりますが、あまり一般的
ではないようです。よほど特殊な事情でもないかぎり、まずは
Automation互換のデータ型だけでインターフェイスを定義
できないかどうか検討したほうが賢明です。

Inter-Object Communication
http://msdn.microsoft.com/en-us/library/ms693719(VS.85).aspx

つまり、マーシャリングのパターンとして次の3つがあり、できる
だけ楽で簡単な方法を選びましょう ― ということです(苦笑)

1. 汎用マーシャラを使った標準マーシャリング
インターフェイスはAutomation互換でなければならない
2. MIDLベースのカスタムマーシャリング
MIDLが生成したスタブ/プロキシを使ったマーシャリング
3. IMarshallインタフェースによるカスタムマーシャリング
すべてを自前で処理するカスタムマーシャリング

命名規則については、結局のところ、バイナリレベルでは
GUID/UUID(CLSIDやIIDなど)やDISPIDを使って識別する
ことになるので、名前そのものに大した意味はなく、一般的
な命名規則と同様、開発者の理解を助けるための約束事
でしかありません。
どんな命名規則であれ、一貫して使うことが肝要です。

.NET Framework General Reference
Naming Guidelines
http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx

.NET Frameworkのドキュメントですけど、ActiveX/COM
にも通用する内容だと思います。
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
asahi
2009-06-29 13:09:01 UTC
Permalink
植田様、返信ありがとうございました。

ご紹介いただいたURLをたどっていったところ、目指していたドキュメントにたどり着くことが出来ました。

Component Automation
Design Considerations for ActiveX Objects
http://msdn.microsoft.com/en-us/library/ms221017.aspx

Standard Objects and Naming Guidelines for Automation
http://msdn.microsoft.com/en-us/library/ms221200.aspx

Naming Guildlinesのほうはちょっと内容が期待はずれでしたが、代わりに以下ドキュメントを見つけたので目的は達成できそうです。

IDispath Data Types and Structures
http://msdn.microsoft.com/en-us/library/ms221600.aspx

ただ、これらを理解するためにはかなり勉強が必要そうです。
#自分が理解できてかつ、展開できるようにするとなると。。。

ひとまず、本件は解決とさせてください。
どうもありがとうございました。

Loading...