トップページ⇒tech
986コメント350KB

COM の世界を斬る!

■ このスレッドは過去ログ倉庫に格納されています
0001IUnknownNGNG
ATL や MFC でラッピングされていない素顔の COM について語り合いましょう。
0002デフォルトの名無しさんNGNG
QueryInterfaceは同一のインターフェイスに対して複数回行った場合も
やはりその回数だけ参照カウンタはインクリメントするものですか?

0003デフォルトの名無しさんNGNG
そのための参照カウンタでしょ
0004デフォルトの名無しさんNGNG
どなたかコントロールのエンベッドを開発ツールのGUI上で貼り付けではなく
IOleObject, IDataObject, IPersistStorage などを使ってコードで書いた
ことがある人いますか?実際のところどのように実現するのか気になるので
知っている人がいたら教えてほしいです。参考サイトや参考書籍でも構いません。
よろしくお願いします。

0005>4NGNG
書いたことあるけど、面倒なので素直に本読んどけ。
00064NGNG
>5
すみませんが、参考書籍名など教えていただけないでしょうか。
自分ではそれなりに探したのですが店頭にある書籍には
出ていないもので、タイトルがわかれば注文するつもりです。

0007VB使いNGNG
ショートカットの作成ってオートメーション使ってできないの???
00085>6NGNG
OLE2なんとかって本と、あと色々。
とりあえず図書館逝っときなさい。
0009デフォルトNGNG
アウトプロセスサーバでインターフェイスの解放を忘れるとメモリリークに
なるのはわかるんだけどインプロセスサーバだったらクライアントの終了時
に解放されるような気がする。間違ってるかなぁ。

0010デフォルトの名無しさんNGNG
VBScriptで使うNewにはどう意味があるのでしょうか?
実行時バインディングしかできないんなら意味がないように
思えるんだけど。
0011デフォルトの名無しさんNGNG
>>7
FAQだな
(1) wshon.ocx の WshShortcut オブジェクトを使う
(2) shell32.dll の ShellLinkObject オブジェクトを使う
(3) IShellLink のタイプライブラリを参照設定してカスタムインターフェイスを使う
0012VB使いNGNG
>11
コード紹介してくれませんか???
0013デフォルトの名無しさんNGNG
FAQなんだから自分で調べなさいって。じゃないと厨房って言われちゃうぞ。
0014デフォルトの名無しさんNGNG
ここの過去ログ検索してみなさい。

http://www.users.gr.jp/ml/archive/vb/
0015初心者NGNG
CoUninitialize()の呼び出しを忘れてクライアントを終了すると
具体的にどういった不具合が発生しますか?
0016恥ずかしながらいままで知らなかったNGNG
.model tiny
org 100h
のcomじゃないのね。。。<com
0017デフォルトの名無しさんNGNG
warata
0018デフォルトの名無しさんNGNG
私のようなロースキルのプログラマにはCOMはむつかしすぎます・・・
私にできるのは CComPtr を使って COMオブジェクトを利用することぐらい。

下のような話を読んでもイベントを捕まえる方法がさっぱり理解できません(泣
http://www.s34.co.jp/cpptechdoc/misc/comevent/#intro

こんな難しいモンを将来標準にされると辛すぎます。っつーのが私の感想です。
0019デフォルトの名無しさんNGNG
MFCやATLも使わずにコンポーネントを使えるぐらい理解している奴なんて
そういるもんじゃない。まあ難しいことはわからなくても使えるようにす
るためのもんだしな。この手の掲示板ではさすがにレベルが高すぎるんじゃないか?
おれも良くわかんねーし、つーか俺が馬鹿なだけか???
0020デフォルトの名無しさんNGNG
この板人少ないね。ぽつり。
0021デフォルトの名無しさんNGNG
#沈んだすれをサルベージ。

COM初期化
CoInitialize(NULL);
って、普通はこまめには呼ばないって聞いたんですけど、
どういう時に呼べばいいのでしょ。
ご存知のかた教えてください。
(こむちょー初心者質問でスマソ)
0022デフォルトの名無しさんNGNG
>>21
プログラムの一番最初
0023デフォルトの名無しさんNGNG
>>21

良く使われてるテクとは思うが,俺は

class CComPermission
{
public:
CComPermission( void ){ ::CoInitialize( NULL ); }
~CComPermission( void ){ ::CoUninitialize(); }
};

みたいなクラス作って WinMain() のローカル変数として置いてる.
余談だが同じ要領で ::timeBeginPeriod() と ::timeEndPeriod()
も組にしてる.
0024デフォルトの名無しさんNGNG
CoInitializeEx(NULL, COINIT_MULTITHREADED);
とすると IShellLinkが使えないんだけど、
どうしようもないの?
コレでやらないとIWMWriterが使えないのよね。
0025デフォルトの名無しさんNGNG
アホい質問かもしれませんが、
COMって結局のところはC言語のAPIのように呼び出しているのですよね?
C++はあくまでラッパーですよね?
0026デフォルトの名無しさんNGNG
>>25
どう答えて良いかわからないけど、
COMに言語の違いは関係ない。
COMオブジェクトからみれば、クライアントの記述言語が
Cだろうが、C++だろうが、Pythonだろうが、Rubyだろうが差異はない。
COMに対する理解が大きく間違っている(or 足りない)と思われる。
002726NGNG
マジアホいね。
002827NGNG
↑スマソ。26じゃない。間違えた。
0029阿呆井NGNG
>25
君の発言には痺れたぜ。君のラッパから音が出ることはないだろう。
003025NGNG
弁明するけど、そりゃ、抽象的な概念って事は分かってるよ。
DCOMが基本的にOS透過だって事くらいは知ってる。
要はDLLの関数として直接Cから呼べるのかな、と思って聞いたの。
でも、確かに意味のない質問でした。-_-
0031デフォルトの名無しさんNGNG
>>15
スレッド、プロセスの終了前に呼び出しを忘れると、リソースの回収が遅れます。

>>21
そのメソッドは古いメソッドなので、CoInitializeExを使用してください。
実際には、CoInitializeはCoInitializeExをCOINT_APARTMENTTHREADEDを指定して
呼び出しています。

このメソッドは、スレッドに新しいアパートを割り当てるときに呼びます。
プロセス規模のMTAに入らない場合、つまり、STAの場合、各スレッドごとに
このメソッドを呼ぶ必要があります。

従って、CoInitializeはMTAではなくSTAへ飛び込むので、各スレッドごとに呼び出す
必要があります。
0032デフォルトの名無しさんNGNG
>>30
呼べない。
Cからだろうと、C++からだろうと、オブジェクトを生成して、vtableへのポインタを
とらないと、メソッドは呼べない。
0033けNGNG
>>7
あ、俺スクリプト作って持ってる。
趣味でPerlだけど(w
えい、コピペ。

use strict;
use OLE;

# -------------------- OLEオブジェクトの取得
my $Shell = OLE::new( 'Shell.Application', 'Quit' ); # Shell Automation Service

# -------------------- 設定値
my $Viewer = "EXPLORER.EXE"; # ファイラ
my $Arguments = "/e,/n,"; # ファイラのオプション

# -------------------- 対象フォルダ
my $Path = $Shell->NameSpace($ARGV[0])->Items->Item()->Path;
$Arguments = $Arguments . "\"$Path\"";

# -------------------- 作成先フォルダ
my $ShortcutPlace;
if (defined($ENV{'SHORTCUTFOLDER'})) {
$ShortcutPlace = $ENV{'SHORTCUTFOLDER'}; # ショートカットを作成するフォルダ
# ("C:\\Temp"などの形式でも可)
} else {
my $ssfSTARTMENU = 11; # SpecialFolder : スタートメニュー
$ShortcutPlace = $ssfSTARTMENU; # ショートカットを作成するフォルダ
}
my $Items = $Shell->NameSpace($ShortcutPlace)->Items;
$ShortcutPlace = $Items->Item()->Path;

# -------------------- ショートカット名
my $ShortcutName = $Path; # 対象フォルダ
$ShortcutName =~ s/[\\]*$//; # 後ろの\の除去
$ShortcutName =~ s/[^\\]*[\\]//g; # フォルダのパスの除去
$ShortcutName = "$ShortcutName.lnk";
my $ShortcutFileName = $ShortcutPlace . "\\" . $ShortcutName;

# -------------------- ショートカット作成
my $ShellLinkObject;
if (-e $ShortcutFileName) {
$ShellLinkObject = $Items->Item($ShortcutName)->GetLink;
print "Shortcut File:\n\"$ShortcutFileName\"\n\n";
print "Path\t\t : \"$ShellLinkObject->{'Path'}\"\n\t\t-> \"$Viewer\"\n\n";
print "Arguments\t : \"$ShellLinkObject->{'Arguments'}\"\n\t\t-> \"" . $Arguments . "\"\n\n";
print "Description\t : \"$ShellLinkObject->{'Description'}\"\n\t\t-> \"" . $Path . "\"\n\n";
print "WorkingDirectory : \"$ShellLinkObject->{'WorkingDirectory'}\"\n\t\t-> \"" . $Path . "\"\n\n";
print "OVERWRITE ? [yn] ";
my $Yn;
chop($Yn = <STDIN>);
if ($Yn ne "y") {
$ShellLinkObject->Release;
$Items->Release;
$Shell->Release;
exit;
}
} else {
# 何らかのファイルが無いとGetLinkが失敗
open(LF,">" . $ShortcutFileName);
close(LF);
$ShellLinkObject = $Items->Item($ShortcutName)->GetLink;
}

# -------------------- 設定
$ShellLinkObject->SetIconLocation( $Viewer, 0 );
$ShellLinkObject->{'Path'} = $Viewer;
$ShellLinkObject->{'Arguments'} = $Arguments;
$ShellLinkObject->{'Description'} = $Path;
$ShellLinkObject->{'WorkingDirectory'} = $Path;

# -------------------- セーブ
$ShellLinkObject->Save;
$Shell->RefreshMenu(); # 不要?

# -------------------- OLEオブジェクトの解放
$ShellLinkObject->Release;
$Items->Release;
$Shell->Release;
exit;


ついでに添削して。(w
0034デフォルトの名無しさんNGNG
>>30
根本的な部分を理解していないですね。

COMはCOMに対応している言語から呼び出すことができますが、それは、
OSのCOMサポートを通しているからです。WindowではDLLの機構をOSが
利用してCOMを構築しているので、DLLファイルにCOMオブジェクトが
格納されていますが、COM==DLLというわけではありません。

ですから、DLLから呼び出せるという時点でナンセンスです。EXEのCOM
だってあるじゃないですか。このくらいは、COMの初心者用の本で必ず
最初の数ページで説明されているので、そこを読むことをお勧めします。
0035けNGNG
あ、処理系は
http://www.activeware.com/
ね。
003629NGNG
すまん。俺はCOM,DCOMは理解し、DLLやEXE(こっちはアウトプロセス)
を仕事で作ったりしているが、CORBAはさっぱりだ。

JAVA屋から見れば俺もアホだね。謝るよ。
0037デフォルトの名無しさんNGNG
Microsoftは、COM,COM+,DCOM,ActiveX,DLL,OCX,FMC,ATL,Serviceとか
いろんな言葉を次々にだしてくるから困る。
そのうえに説明が複雑怪奇、もっと簡単に説明してくれないのかな。
MSDNでCOMを検索しても、適当なものを見つけれない。
たぶん、物凄く新しいアイデアで製品を作ってるぞという、ハッタリ
をかましてるのだとおもう。
COMに開発言語からの独立とかいうあるけど、大抵の開発言語が他の
開発言語とリンクするための情報を、すぐに探しだせる状態で公開し
てたので、そんなに騒ぐことではなかったのだが、最近は、それを
見つけるのも苦労する。
ところでCOMの初心者用の本てどんなのありますか。
googleではCOMを検索してくれない困ったもんだ。
0038デフォルトの名無しさん NGNG
豊田孝
0039トリッキーの1NGNG
COMの本ってマジで無いですよね。
Essential COMの第1章は概念理解にとても便利です。
ATL プログラミング(だっけ?)でVisual C++のコンパイラサポートを覚えました。
Inside COMもいい本ですが、初心者には辛いでしょう。
こんな所でどうでしょうか?

便乗質問。
CORBAについていい本(もしくはサイト)ありませんか?
0040デフォルトの名無しさんNGNG
>>34
だれも「DLLから呼び出せるか」なんて聞いてません。
そのCOMの仲介をするコードがDLL中に入っているのか?
と聞いているのです。

でももうこの質問はどうでもいいです。
0041デフォルトの名無しさんNGNG
idispatchをcで実装したサンプルキボ=ン
0042デフォルトの名無しさんNGNG
ほうほう、「COMの仲介をするコード」ですか。
TypeLibのことを言ってるのかな?

いずれにしても、
>>30
根本的な部分を理解していないですね。
0043デフォルトの名無しさんNGNG
>39
書籍はこの辺でどうよ。
http://www.amazon.co.jp/exec/obidos/search-handle-form/249-5193886-0877137
004443NGNG
エラーになっちまうので、以下で
「CORBA」で検索。
http://www.amazon.co.jp/
0045デフォルトの名無しさんNGNG
「インサイドCOM+」は全然インサイドじゃない・・・
0046デフォルトの名無しさんNGNG
COMってなんですか…。
0047デフォルトの名無しさんNGNG
>>46
レッツゴ−以下のサイト。
http://www.microsoft.com/japan/developer/thisweek/combasics/combasics1.asp
0048デフォルトの名無しさんNGNG
age
0049デフォルトの名無しさんNGNG
厨房質問でスマン
delphiやVBで読み込めるタイプライブラリってなんなの?
タイプライブラリ自体がなんなのか、、、
本来は何のために存在しているのか
0050デフォルトの名無しさんNGNG
>>49
バイナリレベルでクラスを流用するため。ヘッダファイルみたいなもん。

Iriaのタイプライブラリを使えば、小さなVBプログラムからでも
Iriaの強力なダウンロード機能を使える。

バイナリレベルで互換性があれば、個々のコンポーネントは
C++でとことんチューニングして、あとで、C#あたりでくっつける
ってことが簡単にできる。
COM無しでは、ソースがないとできないけど(.objとヘッダでできるかも)
COMなら、コンポーネントが収められたファイル(.exe、.dllなど)が
あれば、コンポーネントの流用ができる。
0051デフォルトの名無しさんNGNG
タイプライブラリって、COMのメソッドを呼び出す時の、引数の型など
の情報が入っていて、OSが利用するものと思えば良いですか?
0052デフォルトの名無しさんNGNG
ぐいd
0053デフォルトの名無しさんNGNG
プロパティ、メソッド、イベント、名前付き定数など、
クラスの詳細な記述が含まれたリソースである
0054デフォルトの名無しさんNGNG
タイプライブラリ自体は何で作るんですか?
C?
0055デフォルトの名無しさんNGNG
IDL(インターフェイス記述言語)でインターフェイスを記述して、
拡張子.idlのファイルを作り、IDLコンパイラ(MIDL)でコンパイル
するとできます。Cの宣言だけでは情報が足りないのです。
0056けNGNG
>>54
すでにあるCOMオブジェクトから抽出するのは、MSのフリーウェアの
OLEViewが便利。
0057uuidNGNG
ActiveX コントロールではない貼り付け可能なオブジェクトを
VBでコンテナ(フォーム)に貼り付ける方法はありますでしょうか?
CLSID を直接指定してHTMLのOBJECTタグでは表示されるが
VBのコントロールの追加には出てこないコンポーネントのことです。
0058uuidNGNG
ODL と mktyplib
IDL と midl
どういった点で差異がありますでしょうか?
005924NGNG
誰か答えて〜(TロT
0060デフォルトの名無しさん NGNG
うーよかったぜ、今日のNHKアーカイブス
0061デフォルトの名無しさんNGNG
age
0062デフォルトの名無しさんNGNG
すんません
ATLのウイザードで最初に作られる.idlファイルを
真似て作ったものなのですがタイプライブラリが出来ません。
どうしたらよいのでしょうか。

VC&MIDL使用
MIDLの設定でMkTyplib互換のチェックをはずした状態(エラーになるので)

以下IDLファイル内容です。

import "oaidl.idl";
[
object,
uuid(適当なUUID),
helpstring("HogeHogeInterface"),
pointer_default(unique)
]
interface IHogeHoget : IClassFactory
{

};

[
uuid(適当なUUID),
helpstring("HogeHogeTyupLib")
]
library HogeHogeLib
{
importlib ("stdole32.tlb");
[
uuid(適当なUUID),
helpstring("HogeHogeClass")
]
coclass HogeHoge
{
[default] interface IHogeHoge;
};
};
006362NGNG
上記の件解決いたしました。
お騒がせしてすみません。
0064デフォルトの名無しさんNGNG
COM = レジストリ + タイプライブラリ + DLL ?
0065デフォルトの名無しさんNGNG
お伺いします。

_COM_SMARTPTR_TYPEDEF(ISMCcom , __uuidof(ISMCcom));
こんなスマートポインタを使って

CoInitialize(NULL);
ISMCcomPtr pSmc;
hResult = pSmc.CreateInstance("SMC.SMCcom");

で呼び出すわけです。が、CreateInstance("SMC.SMCcom");
の’SMC’の部分、どこで決定する文字列なんでしょうか?
ライブラリ名はSMCLibなんですが・・・。
0066デフォルトの名無しさんNGNG
>>65
レジストリのProgID見れ
0067デフォルトの名無しさんNGNG
>>66
やっとわかりました。Thanks.立て続けの質問で恐縮なのですが
これってレジストリエディタを使わなければ判明しない文字列ですか?
で、ProgIDの"SQLOLEDB"と"SQLOLEDB.1"って何の意味があって
.1が末尾に付与されてるですか?(無論どちらでも動作はします。)
0068デフォルトの名無しさんNGNG
>>64
当たらずとも遠からずだが、実際にはもうちょっと複雑。深入りしたければ、
Essential COM と Inside OLE 読みなよ。
0069デフォルトの名無しさんNGNG
>>67
OLEViewでもおっけー。

末尾の数字は、バージョン番号だね。
0070中級ぐらい?NGNG
よくさあ、何かというと「Inside OLE 読みなよ」とか言うのはいいんだけど
売ってんのみかけたことねえぞ!神田探しまくったけどないし。
君らはいつどこで手に入れた?それとも図書館?会社?学校?
気になるよー!
0071デフォルトの名無しさんNGNG
Inside OLE マイクロソフトプレスシリーズ
Kraig Brockschmidt (著), エー・ピー・ラボ (翻訳), 長尾 高弘 (翻訳)
単行本 - 1183 p / 改訂新 版 (1996/12/01)
アスキー ; ISBN: 4756116183 ; サイズ(cm): 26
0072デフォルトの名無しさんNGNG
>>67
.1(バージョン番号)がつかないのは version independent ProgID。
最新版を使いたいときは、これで参照する。
互換性がないかも〜、とかの理由でバージョン番号まで指定したい
ときには、バージョン付の ProgID を使う。

こうして、異なるバージョンの COM オブジェクトが単一のシステム
上で共存できる。
0073デフォルトの名無しさんNGNG
>>70
先月、秋葉の書泉ブックタワーで売ってるのを見かけたぞ。
0074中級ぐらいですNGNG
>73
Inside COM じゃなくて?
んじゃ、飛行機乗って行ってみっかな。
交通費が往復6万ぐらいしそうだ。
0075デフォルトの名無しさんNGNG
>74
イヒヒ!おれ今日かっちゃた!
0076デフォルトの名無しさんNGNG
通販でも買えるのでは? >Inside OLE
0077デフォルトの名無しさんNGNG
>通販でも
amazonでも品切れなのに......。
0078デフォルトの名無しさんNGNG
再版してくんねーかな?それともCOMの知識なんてもう必要ないっつー
メッセージなのか?ワラ
0079デフォルトの名無しさんNGNG
いくらするんですか?その本。
0080名無しさんNGNG
>"com" は一般すぎる言葉のため、 検索には使用されていません。
氏ね。
0081デフォルトの名無しさんNGNG
InsideOLE
関東近辺での発見情報求む
0082このスレ初書き込みの人NGNG
Inside OLE
先週秋葉原の書泉ブックタワーは売り切れだったので
そのままLaox(?)の一階にある本屋に行ったら売ってたよ。

・・・
・・・
・・・
・・・
・・・・・・・・・・漏れが買ったから在庫あるか知らないけど。(^^;)
0083デフォルトの名無しさんNGNG
hage
0084デフォルトの名無しさんNGNG
>>82
くれ
0085デフォルトの名無しさんNGNG
>>84
良いよ
008682NGNG
>>85
コラッ!!
0087デフォルトの名無しさんNGNG
.NETでCOMやってた人が失望してたけど、
あんなのWindows上でしかやれないじゃん。
全てをCOMでやる時代は終わったけど、
まだまたCOMコンポーネントは作る必要が
あるね。
008881NGNG
>82
いくらでした?
008982NGNG
12,427 円です。
値段は高いけど1000ページ以上(電話帳並)あるし妥当な価格だと思う。
0090デフォルトの名無しさんNGNG
ちきしょーちきしょおおおう。
0091デフォルトの名無しさんNGNG
コピペして!
じゃなくてコピーして!!!
009281NGNG
正直このスレに参加している人で何人が
持っているんでしょうね。
COMを勉強したい私にとってはうらやましい限りです。
0093名無しさん@お腹いっぱいNGNG
漏ってる人は今ごろDOTNETなんてやってんだろうなぁ・・・
漏れにくれ!
0094デフォルトの名無しさんNGNG
>>91
仮に一頁をコピーするのに20円かかるとすると
1184*20=23680円かかるんですけど。
0095名無しさん@お腹いっぱいNGNG
>94
してして、広げて待ってるから〜♪
009681NGNG
DocFile ViewerってOLE/COM Viewerみたいにフリーで
配布しているところないですか?

>>94
仮に一頁をコピーするのに10秒かかるとすると
(ページめくってセットする時間含む)
1184*10/60=約200分かかるんですけど。
こっちのほうがやばくない?
0097デフォルトの名無しさんNGNG
>おーる
昨日秋葉原Laox逝って来た。
InsideOLEあった。見本まであった。
買おうとおもーたけど、金なかった・・・涙
教会に行く。でもあそこまだまだ沢山ありそうなので、
遠くて行けそうもない人も問い合わせてみる価値ありそう。
店頭に一冊しかなかったけどまだまだあるよ多分。
LaoxがInsideOLEを隠してるの間違いなし(ワラ
今日青いシャツでInside・・・買ってるのがいたらそれ俺だから
よろしくv(゚9゚)
0098デフォルトの名無しさんNGNG
>>92
おれんとこは3年くらい前に買ったな〜。

1年くらい前は MSDN に収録されてたね〜。英語だけど。
009998NGNG
>>92
COM そのものを勉強したいなら Inside COM とか
Inside DCOM あたりがよいのでは?

Inside OLE にも COM そのものの解説は載ってるけど、
ActiveXドキュメント、オートメーション、ActiveXコントロールといった
OLE 固有の技術にかなりのページを割いているので、ちょい無駄かも。
010098NGNG
なんどもスマソ。

今見てきたら、US の MSDN ライブラリのサイトでは
Inside OLE(英語)がまだ公開されてるみたい。
 http://msdn.microsoft.com/library/default.asp
0101 NGNG
妙に連帯感を感じるのは俺だけか?
■ このスレッドは過去ログ倉庫に格納されています