ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

COM -Component Object Model-コミュの教えて下さい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして
COMについて勉強したいのですが、
良い本があれば教えて下さい(絶版もOKです)。

EXCEL、WORD、IE、OUTLOOKをプログラムで
操作したいと思っているのですが・・・。
.NETは、入り口が分からないもので、
COMから入ってみようと思っています。

よろしくお願いします。

コメント(17)

Microsoft Office 製品が多いようなので、
とりあえず、VBA 勉強したほうがいいんじゃない?
レスありがとうございます。

VBAのどういう機能を使うと、
これらのプログラムを操作できるのでしょうか?
> VBAのどういう機能を使うと、
> これらのプログラムを操作できるのでしょうか?

VBA 自体が Microsoft Office Application を扱うためのものです。
とりあえず、入門書で勉強しましょう。
レスありがとうございます。

私がやりたいのは、EXCEL VBAで、OUTLOOKを操作する方法です。
入門書には、そういうことは書いてないのですが・・・

んー。COMでも.NETでもないような気がしますが・・・

Office アプリケーションをカスタムアプリケーションで利用するようにする製品はありますが、違うようですねあせあせ

操作とはどういう操作なのでしょうか?


(VBAはわからないけれども・・冷や汗、参照設定の利用は違いますか?)
Outlook2007を立ち上げてそこからVB Editorを立ち上げてヘルプを開くとOutlook 2007 開発者用リファレンスというのが出てきます。それを読んでみるといいんじゃないでしょうか。基本はExcel VBAからCreateObject("Outlook.Application")したオブジェクトがOutlookのApplicationオブジェクトと同じものだと思います。
みなさん、レスありがとうございます。

操作というのは通常手で行っているオペレーションのことです。
定型的な操作を自動化したいと思っており、
UWSCというフリーソフトを使うと可能です。

COMを使いこなせると高度なことができるため、
COMとOffice製品のCOMインタフェースを
知りたいと思っています。

COMについて書かれた書籍、ホームページ等をご存知でしたら
教えて頂けませんでしょうか。
基本的な呼び出し方ならもうすでに書かれていますけど、
参照設定して new するとか、CreateObject してやるとか。

とりあえず、Excel VBA ならこんな本があります。

かんたんプログラミング Excel2003 VBA 応用編
http://www.gihyo.co.jp/books/4-7741-2094-4

ただ、Outlook VBA をまともに解説している書籍にはお目に
かかったことはないので、そちらはしっかりと基礎を身につけ
help のみで coding ができるようになる必要がありますね。

それから、Outlook の automation は Outlook の外部から
扱いにくくされているので、Excel VBA から呼び出すのではなく、
Outlook VBA から Excel automation を扱うようにしたほうが
いいでしょう。

Outlook を外部から制御しようとするとかなりの確率で
security dialog が出ちゃいます。
# Version にもよるけどね。
質問です。VisualC#でCOMのdllを作成し、VisualC#の機能で、レジストリに登録して、そのPCではCOMは動作したのですが、これをVisualC#もインストールしていない別のPCに配布して使うにはどうしたらいいのでしょうか?

多分、VisualC#のCOM登録は、プロジェクトのbinフォルダにできたdllファイルを、レジストリに登録していて、dllそのものをシステムフォルダとかにコピーはしてないと思います(検索しても出てこなかったので)。

dllを該当PCのどこかのフォルダにコピーして、手動でレジストリに登録すれば使えるんだと思いますが、やり方がわかりません。ネットで調べたら、なんたらreg32を使うとか見たような気がしますが。

よろしくお願いします。

>>[9]
大雑把な段取りとしては...

作成したDLLが必要とするバージョンの .NET Framework をインストールする(99%のマシンには、自分が必要とする.NET Framework は入っていないと考える必要があります)。

適切なフォルダ(COMはグローバル参照されるので、利用マシン上で必ず一意となり、なおかつそのマシンのすべてのユーザーから参照可能なフォルダに配置する必要があります)にファイルを配置する。

COM登録(regsvr32.exe ではなく、Regasm.exe を利用する)を行う。

となります。

通常はこれら一連の処理を行うためにインストーラを用意してそれを利用者に配布します。


個人的には、COMサーバーを .NET (C#であれ、VBであれ)で提供するのはお勧めしません。
>>[10]
ありがとうございます。
とりあえず、作成したdllと同じバージョンの.NetFramworkフォルダにあるRegAsm.exeを使って、dllの登録と削除は成功したのですが、
いざdllを実行するプログラムを走らせると、CreateObjectでNotSupportedExceptionが出てしまいます。
実は、このdllはProgramFilesにある他のdllを参照設定して動くのですが、
、当然、コピーしたPCにも同じdllは入っています。ただ、dllを作ったOSはDドライブのXPで、コピーしたPCはCドライブのVistaなのですが・・・・。
この辺でなにか参照のズレとか発生してしまうのでしょうか?
RegAsmでの登録時のコマンドは以下のような感じです。

C:\>C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe C:\Windows\system32\コムのdll
NotSupportedException は、呼び出した何かをサポートしていないという例外です。
何をサポートしていないのかは、例外が出ただけではわかりませんが。

.NET は、DLLなどの参照は原則として、自分自身と同じフォルダを対象に行います(サテライトアセンブリなどいくつか例外はありますがその場合はサブディレクトリ)。
そのため、COMのDLLとは別のフォルダにある場合まず間違いなく参照できません。

登録するDLLがシステムディレクトリにある場合、参照するDLLもシステムディレクトリになければなりません。

ですが、現在のWindows(もうじき延長の切れるXPを含む)は、システムディレクトリに非MS製のモジュールをインストールすることを原則禁止しています。

ですので、登録するCOMDLLと、参照するファイルのもろもろはまとめて、Program Files に専用フォルダを用意してそこに配置することをお勧めします。

ちなみに、ビルド環境と実行環境のフォルダ構成が一致している必要はありません。
>>[13]
確かに、NotSupportedExceptionはCOM利用プログラム側のミスでした。


登録するCOMDLLと、参照するファイルのもろもろはまとめて、Program Files に専用フォルダを用意してそこに配置して、RegAsm.exeで登録したのですが、
COMを呼び出すと、「指定されたプログラムIDのオブジェクトインスタンスの作成に失敗しました」と出ます。

VisualStudioでのビルド登録なら、何の問題もなくうまくいくのですが・・・・。


http://tech.nitoyon.com/ja/blog/2008/07/31/c-sharp-com/
と同様に、インターフェースや実装クラスにGUIDを、生成exeを使ってつけていますが、これって必須なんでしょうか?あと、このページだと、RegAsm.exeで
/codebaseとかつけていますが・・・。 /tldとかつけているページもありましたが、この辺のやり方がページによってバラバラで、はっきりしませんね。
>>[14]
RegAsm.exe については、まずは
http://msdn.microsoft.com/ja-jp/library/vstudio/tzat5yw6.aspx
をご参照ください。

ページによってばらばらなのではなく、つける必要性とかそういうあたりで違いがある(またはよくわからないのでとりあえずつけない->動いたのでそのまま)
からです。



で、GUIDですが、GUIDをつけておくと、IIDやCLSIDが固定になります。
どこにつけているか?でそれがIIDとなるのか、CLSIDとなるのかは変わります。

GuidAttribute などにも書かれているので参照してみるとよいでしょう。

こちらも、むやみやたらとつけているわけではなくきちんと意図を持ってつけています。
あと、Guidは、ユニークにしなければなりませんので、サンプルコードと同じ値を使ってはいけません。
>>[15]
ありがとうございます。とりあえず、COMの作り方にならって、インターフェースをつけて、IDをつけて、/codebaseオプションをつけたら登録できました!
僕の見ていたサイトだとインターフェースも/codebaseもつけてなかったんですがね。IDはVisualStudioのGUIDの生成で付けれるようですが、これで重複しないんですかね?配布先で重複したりしないんでしょうか?謎です。
>>[16]

RegAsmももう世に出て10年たっています。
なので、見つけた記事の書かれた時期によっては /codebase がなくても問題なかったなどはあるかもしれません。
#厳密名がないものの場合は、その影響は大きいと考えられる

GUIDですが、GuidGen や UuidGen などのGUID生成ツールや、System.Guid.NewGuid() などを使って生成していれば、原則として重複することはありません。
ちなみに、上記のEXEや、.NET のメソッドは、最終的にすべて UuidCreate というAPIにたどり着きます。


Guidのユニーク性は、MACカードと時間だったかな?を利用してユニークになるように作られているそうです。

GUID 構造体のリファレンスに出ていますが、GUID 自体はMSの実装(単に名前がそうなってるだけ。。。ともいえますが)で、正式には、Universally Unique Identifiers と呼ばれるものです。

どこかに、生成アルゴリズムのユニーク性についての文献があると思いますよ。
ざっとMSDNライブラリ覗いた範囲では見つかりませんでしたけどw

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

COM -Component Object Model- 更新情報

COM -Component Object Model-のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング