1 :
IUnknown :
2001/02/11(日) 01:42 ATL や MFC でラッピングされていない素顔の COM について語り合いましょう。
2 :
デフォルトの名無しさん :2001/02/11(日) 01:47
QueryInterfaceは同一のインターフェイスに対して複数回行った場合も やはりその回数だけ参照カウンタはインクリメントするものですか?
3 :
デフォルトの名無しさん :2001/02/11(日) 02:07
そのための参照カウンタでしょ
4 :
デフォルトの名無しさん :2001/02/11(日) 02:55
どなたかコントロールのエンベッドを開発ツールのGUI上で貼り付けではなく IOleObject, IDataObject, IPersistStorage などを使ってコードで書いた ことがある人いますか?実際のところどのように実現するのか気になるので 知っている人がいたら教えてほしいです。参考サイトや参考書籍でも構いません。 よろしくお願いします。
5 :
>4 :2001/02/11(日) 02:59
書いたことあるけど、面倒なので素直に本読んどけ。
>5 すみませんが、参考書籍名など教えていただけないでしょうか。 自分ではそれなりに探したのですが店頭にある書籍には 出ていないもので、タイトルがわかれば注文するつもりです。
7 :
VB使い :2001/02/11(日) 03:41
ショートカットの作成ってオートメーション使ってできないの???
8 :
5>6 :2001/02/11(日) 03:57
OLE2なんとかって本と、あと色々。 とりあえず図書館逝っときなさい。
アウトプロセスサーバでインターフェイスの解放を忘れるとメモリリークに なるのはわかるんだけどインプロセスサーバだったらクライアントの終了時 に解放されるような気がする。間違ってるかなぁ。
10 :
デフォルトの名無しさん :2001/02/11(日) 11:03
VBScriptで使うNewにはどう意味があるのでしょうか? 実行時バインディングしかできないんなら意味がないように 思えるんだけど。
11 :
デフォルトの名無しさん :2001/02/12(月) 23:06
>>7 FAQだな
(1) wshon.ocx の WshShortcut オブジェクトを使う
(2) shell32.dll の ShellLinkObject オブジェクトを使う
(3) IShellLink のタイプライブラリを参照設定してカスタムインターフェイスを使う
12 :
VB使い :2001/02/13(火) 00:22
>11 コード紹介してくれませんか???
FAQなんだから自分で調べなさいって。じゃないと厨房って言われちゃうぞ。
ここの過去ログ検索してみなさい。 http://www.users.gr.jp/ml/archive/vb/
15 :
初心者 :2001/02/13(火) 01:40
CoUninitialize()の呼び出しを忘れてクライアントを終了すると 具体的にどういった不具合が発生しますか?
16 :
恥ずかしながらいままで知らなかった :2001/02/13(火) 02:13
.model tiny org 100h のcomじゃないのね。。。<com
warata
18 :
デフォルトの名無しさん :2001/02/13(火) 11:47
19 :
デフォルトの名無しさん :2001/02/13(火) 19:07
MFCやATLも使わずにコンポーネントを使えるぐらい理解している奴なんて そういるもんじゃない。まあ難しいことはわからなくても使えるようにす るためのもんだしな。この手の掲示板ではさすがにレベルが高すぎるんじゃないか? おれも良くわかんねーし、つーか俺が馬鹿なだけか???
この板人少ないね。ぽつり。
21 :
デフォルトの名無しさん :2001/05/01(火) 09:30
#沈んだすれをサルベージ。 COM初期化 CoInitialize(NULL); って、普通はこまめには呼ばないって聞いたんですけど、 どういう時に呼べばいいのでしょ。 ご存知のかた教えてください。 (こむちょー初心者質問でスマソ)
22 :
デフォルトの名無しさん :2001/05/01(火) 09:54
>>21 良く使われてるテクとは思うが,俺は
class CComPermission
{
public:
CComPermission( void ){ ::CoInitialize( NULL ); }
~CComPermission( void ){ ::CoUninitialize(); }
};
みたいなクラス作って WinMain() のローカル変数として置いてる.
余談だが同じ要領で ::timeBeginPeriod() と ::timeEndPeriod()
も組にしてる.
24 :
デフォルトの名無しさん :2001/05/03(木) 18:43
CoInitializeEx(NULL, COINIT_MULTITHREADED); とすると IShellLinkが使えないんだけど、 どうしようもないの? コレでやらないとIWMWriterが使えないのよね。
25 :
デフォルトの名無しさん :2001/05/04(金) 01:09
アホい質問かもしれませんが、 COMって結局のところはC言語のAPIのように呼び出しているのですよね? C++はあくまでラッパーですよね?
26 :
デフォルトの名無しさん :2001/05/04(金) 01:29
>>25 どう答えて良いかわからないけど、
COMに言語の違いは関係ない。
COMオブジェクトからみれば、クライアントの記述言語が
Cだろうが、C++だろうが、Pythonだろうが、Rubyだろうが差異はない。
COMに対する理解が大きく間違っている(or 足りない)と思われる。
27 :
26 :2001/05/04(金) 01:32
マジアホいね。
28 :
27 :2001/05/04(金) 01:33
↑スマソ。26じゃない。間違えた。
29 :
阿呆井 :2001/05/04(金) 01:45
>25 君の発言には痺れたぜ。君のラッパから音が出ることはないだろう。
30 :
25 :2001/05/04(金) 01:51
弁明するけど、そりゃ、抽象的な概念って事は分かってるよ。 DCOMが基本的にOS透過だって事くらいは知ってる。 要はDLLの関数として直接Cから呼べるのかな、と思って聞いたの。 でも、確かに意味のない質問でした。-_-
31 :
デフォルトの名無しさん :2001/05/04(金) 02:07
>>15 スレッド、プロセスの終了前に呼び出しを忘れると、リソースの回収が遅れます。
>>21 そのメソッドは古いメソッドなので、CoInitializeExを使用してください。
実際には、CoInitializeはCoInitializeExをCOINT_APARTMENTTHREADEDを指定して
呼び出しています。
このメソッドは、スレッドに新しいアパートを割り当てるときに呼びます。
プロセス規模のMTAに入らない場合、つまり、STAの場合、各スレッドごとに
このメソッドを呼ぶ必要があります。
従って、CoInitializeはMTAではなくSTAへ飛び込むので、各スレッドごとに呼び出す
必要があります。
32 :
デフォルトの名無しさん :2001/05/04(金) 02:10
>>30 呼べない。
Cからだろうと、C++からだろうと、オブジェクトを生成して、vtableへのポインタを
とらないと、メソッドは呼べない。
33 :
け :2001/05/04(金) 02:26
>>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
34 :
デフォルトの名無しさん :2001/05/04(金) 02:28
>>30 根本的な部分を理解していないですね。
COMはCOMに対応している言語から呼び出すことができますが、それは、
OSのCOMサポートを通しているからです。WindowではDLLの機構をOSが
利用してCOMを構築しているので、DLLファイルにCOMオブジェクトが
格納されていますが、COM==DLLというわけではありません。
ですから、DLLから呼び出せるという時点でナンセンスです。EXEのCOM
だってあるじゃないですか。このくらいは、COMの初心者用の本で必ず
最初の数ページで説明されているので、そこを読むことをお勧めします。
35 :
け :2001/05/04(金) 02:38
36 :
29 :2001/05/04(金) 03:32
すまん。俺はCOM,DCOMは理解し、DLLやEXE(こっちはアウトプロセス) を仕事で作ったりしているが、CORBAはさっぱりだ。 JAVA屋から見れば俺もアホだね。謝るよ。
37 :
デフォルトの名無しさん :2001/05/04(金) 09:58
Microsoftは、COM,COM+,DCOM,ActiveX,DLL,OCX,FMC,ATL,Serviceとか いろんな言葉を次々にだしてくるから困る。 そのうえに説明が複雑怪奇、もっと簡単に説明してくれないのかな。 MSDNでCOMを検索しても、適当なものを見つけれない。 たぶん、物凄く新しいアイデアで製品を作ってるぞという、ハッタリ をかましてるのだとおもう。 COMに開発言語からの独立とかいうあるけど、大抵の開発言語が他の 開発言語とリンクするための情報を、すぐに探しだせる状態で公開し てたので、そんなに騒ぐことではなかったのだが、最近は、それを 見つけるのも苦労する。 ところでCOMの初心者用の本てどんなのありますか。 googleではCOMを検索してくれない困ったもんだ。
38 :
デフォルトの名無しさん :2001/05/04(金) 19:31
豊田孝
39 :
トリッキーの1 :2001/05/04(金) 20:05
COMの本ってマジで無いですよね。 Essential COMの第1章は概念理解にとても便利です。 ATL プログラミング(だっけ?)でVisual C++のコンパイラサポートを覚えました。 Inside COMもいい本ですが、初心者には辛いでしょう。 こんな所でどうでしょうか? 便乗質問。 CORBAについていい本(もしくはサイト)ありませんか?
40 :
デフォルトの名無しさん :2001/05/05(土) 00:19
>>34 だれも「DLLから呼び出せるか」なんて聞いてません。
そのCOMの仲介をするコードがDLL中に入っているのか?
と聞いているのです。
でももうこの質問はどうでもいいです。
41 :
デフォルトの名無しさん :2001/05/05(土) 02:39
idispatchをcで実装したサンプルキボ=ン
42 :
デフォルトの名無しさん :2001/05/05(土) 03:03
ほうほう、「COMの仲介をするコード」ですか。
TypeLibのことを言ってるのかな?
いずれにしても、
>>30 根本的な部分を理解していないですね。
43 :
デフォルトの名無しさん :2001/05/05(土) 03:08
44 :
43 :2001/05/05(土) 03:09
45 :
デフォルトの名無しさん :2001/05/05(土) 19:17
「インサイドCOM+」は全然インサイドじゃない・・・
46 :
デフォルトの名無しさん :2001/05/05(土) 19:50
COMってなんですか…。
47 :
デフォルトの名無しさん :2001/05/05(土) 19:54
48 :
デフォルトの名無しさん :2001/05/07(月) 04:16
age
49 :
デフォルトの名無しさん :2001/05/07(月) 04:30
厨房質問でスマン delphiやVBで読み込めるタイプライブラリってなんなの? タイプライブラリ自体がなんなのか、、、 本来は何のために存在しているのか
50 :
デフォルトの名無しさん :2001/05/07(月) 10:10
>>49 バイナリレベルでクラスを流用するため。ヘッダファイルみたいなもん。
Iriaのタイプライブラリを使えば、小さなVBプログラムからでも
Iriaの強力なダウンロード機能を使える。
バイナリレベルで互換性があれば、個々のコンポーネントは
C++でとことんチューニングして、あとで、C#あたりでくっつける
ってことが簡単にできる。
COM無しでは、ソースがないとできないけど(.objとヘッダでできるかも)
COMなら、コンポーネントが収められたファイル(.exe、.dllなど)が
あれば、コンポーネントの流用ができる。
51 :
デフォルトの名無しさん :2001/05/07(月) 11:32
タイプライブラリって、COMのメソッドを呼び出す時の、引数の型など の情報が入っていて、OSが利用するものと思えば良いですか?
52 :
デフォルトの名無しさん :2001/05/07(月) 11:43
ぐいd
53 :
デフォルトの名無しさん :2001/05/07(月) 13:23
プロパティ、メソッド、イベント、名前付き定数など、 クラスの詳細な記述が含まれたリソースである
タイプライブラリ自体は何で作るんですか? C?
55 :
デフォルトの名無しさん :2001/05/07(月) 13:57
IDL(インターフェイス記述言語)でインターフェイスを記述して、 拡張子.idlのファイルを作り、IDLコンパイラ(MIDL)でコンパイル するとできます。Cの宣言だけでは情報が足りないのです。
56 :
け :2001/05/07(月) 23:27
>>54 すでにあるCOMオブジェクトから抽出するのは、MSのフリーウェアの
OLEViewが便利。
57 :
uuid :2001/05/13(日) 01:10
ActiveX コントロールではない貼り付け可能なオブジェクトを VBでコンテナ(フォーム)に貼り付ける方法はありますでしょうか? CLSID を直接指定してHTMLのOBJECTタグでは表示されるが VBのコントロールの追加には出てこないコンポーネントのことです。
58 :
uuid :2001/05/13(日) 01:12
ODL と mktyplib IDL と midl どういった点で差異がありますでしょうか?
59 :
24 :2001/05/14(月) 01:23
誰か答えて〜(TロT
60 :
デフォルトの名無しさん :2001/05/14(月) 02:20
うーよかったぜ、今日のNHKアーカイブス
61 :
デフォルトの名無しさん :2001/05/14(月) 22:00
age
62 :
デフォルトの名無しさん :2001/05/21(月) 22:36
すんません 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; }; };
63 :
62 :2001/05/22(火) 01:48
上記の件解決いたしました。 お騒がせしてすみません。
64 :
デフォルトの名無しさん :2001/05/24(木) 01:44
COM = レジストリ + タイプライブラリ + DLL ?
65 :
デフォルトの名無しさん :2001/05/24(木) 01:52
お伺いします。 _COM_SMARTPTR_TYPEDEF(ISMCcom , __uuidof(ISMCcom)); こんなスマートポインタを使って CoInitialize(NULL); ISMCcomPtr pSmc; hResult = pSmc.CreateInstance("SMC.SMCcom"); で呼び出すわけです。が、CreateInstance("SMC.SMCcom"); の’SMC’の部分、どこで決定する文字列なんでしょうか? ライブラリ名はSMCLibなんですが・・・。
66 :
デフォルトの名無しさん :2001/05/24(木) 02:17
67 :
デフォルトの名無しさん :2001/05/24(木) 02:41
>>66 やっとわかりました。Thanks.立て続けの質問で恐縮なのですが
これってレジストリエディタを使わなければ判明しない文字列ですか?
で、ProgIDの"SQLOLEDB"と"SQLOLEDB.1"って何の意味があって
.1が末尾に付与されてるですか?(無論どちらでも動作はします。)
68 :
デフォルトの名無しさん :2001/05/24(木) 02:49
>>64 当たらずとも遠からずだが、実際にはもうちょっと複雑。深入りしたければ、
Essential COM と Inside OLE 読みなよ。
69 :
デフォルトの名無しさん :2001/05/24(木) 12:17
>>67 OLEViewでもおっけー。
末尾の数字は、バージョン番号だね。
70 :
中級ぐらい? :2001/06/05(火) 21:17
よくさあ、何かというと「Inside OLE 読みなよ」とか言うのはいいんだけど 売ってんのみかけたことねえぞ!神田探しまくったけどないし。 君らはいつどこで手に入れた?それとも図書館?会社?学校? 気になるよー!
71 :
デフォルトの名無しさん :2001/06/05(火) 23:16
Inside OLE マイクロソフトプレスシリーズ Kraig Brockschmidt (著), エー・ピー・ラボ (翻訳), 長尾 高弘 (翻訳) 単行本 - 1183 p / 改訂新 版 (1996/12/01) アスキー ; ISBN: 4756116183 ; サイズ(cm): 26
72 :
デフォルトの名無しさん :2001/06/06(水) 00:21
>>67 .1(バージョン番号)がつかないのは version independent ProgID。
最新版を使いたいときは、これで参照する。
互換性がないかも〜、とかの理由でバージョン番号まで指定したい
ときには、バージョン付の ProgID を使う。
こうして、異なるバージョンの COM オブジェクトが単一のシステム
上で共存できる。
>>70 先月、秋葉の書泉ブックタワーで売ってるのを見かけたぞ。
>73 Inside COM じゃなくて? んじゃ、飛行機乗って行ってみっかな。 交通費が往復6万ぐらいしそうだ。
>74 イヒヒ!おれ今日かっちゃた!
通販でも買えるのでは? >Inside OLE
>通販でも amazonでも品切れなのに......。
再版してくんねーかな?それともCOMの知識なんてもう必要ないっつー メッセージなのか?ワラ
79 :
デフォルトの名無しさん :2001/06/11(月) 22:55
いくらするんですか?その本。
>"com" は一般すぎる言葉のため、 検索には使用されていません。 氏ね。
InsideOLE 関東近辺での発見情報求む
Inside OLE 先週秋葉原の書泉ブックタワーは売り切れだったので そのままLaox(?)の一階にある本屋に行ったら売ってたよ。 ・・・ ・・・ ・・・ ・・・ ・・・・・・・・・・漏れが買ったから在庫あるか知らないけど。(^^;)
83 :
デフォルトの名無しさん :2001/06/12(火) 20:31
hage
84 :
デフォルトの名無しさん :2001/06/12(火) 21:26
86 :
82 :2001/06/12(火) 23:30
87 :
デフォルトの名無しさん :2001/06/12(火) 23:32
.NETでCOMやってた人が失望してたけど、 あんなのWindows上でしかやれないじゃん。 全てをCOMでやる時代は終わったけど、 まだまたCOMコンポーネントは作る必要が あるね。
88 :
81 :2001/06/12(火) 23:52
>82 いくらでした?
89 :
82 :2001/06/13(水) 00:24
12,427 円です。 値段は高いけど1000ページ以上(電話帳並)あるし妥当な価格だと思う。
ちきしょーちきしょおおおう。
91 :
デフォルトの名無しさん :2001/06/13(水) 01:12
コピペして! じゃなくてコピーして!!!
92 :
81 :2001/06/13(水) 09:49
正直このスレに参加している人で何人が 持っているんでしょうね。 COMを勉強したい私にとってはうらやましい限りです。
93 :
名無しさん@お腹いっぱい :2001/06/14(木) 00:23
漏ってる人は今ごろDOTNETなんてやってんだろうなぁ・・・ 漏れにくれ!
94 :
デフォルトの名無しさん :2001/06/14(木) 00:36
>>91 仮に一頁をコピーするのに20円かかるとすると
1184*20=23680円かかるんですけど。
95 :
名無しさん@お腹いっぱい :2001/06/14(木) 01:09
>94 してして、広げて待ってるから〜♪
96 :
81 :2001/06/14(木) 10:15
DocFile ViewerってOLE/COM Viewerみたいにフリーで
配布しているところないですか?
>>94 仮に一頁をコピーするのに10秒かかるとすると
(ページめくってセットする時間含む)
1184*10/60=約200分かかるんですけど。
こっちのほうがやばくない?
>おーる 昨日秋葉原Laox逝って来た。 InsideOLEあった。見本まであった。 買おうとおもーたけど、金なかった・・・涙 教会に行く。でもあそこまだまだ沢山ありそうなので、 遠くて行けそうもない人も問い合わせてみる価値ありそう。 店頭に一冊しかなかったけどまだまだあるよ多分。 LaoxがInsideOLEを隠してるの間違いなし(ワラ 今日青いシャツでInside・・・買ってるのがいたらそれ俺だから よろしくv(゚9゚)
>>92 おれんとこは3年くらい前に買ったな〜。
1年くらい前は MSDN に収録されてたね〜。英語だけど。
99 :
98 :2001/06/15(金) 08:04
>>92 COM そのものを勉強したいなら Inside COM とか
Inside DCOM あたりがよいのでは?
Inside OLE にも COM そのものの解説は載ってるけど、
ActiveXドキュメント、オートメーション、ActiveXコントロールといった
OLE 固有の技術にかなりのページを割いているので、ちょい無駄かも。
100 :
98 :2001/06/15(金) 08:21
101 :
:2001/06/15(金) 11:08
妙に連帯感を感じるのは俺だけか?
102 :
デフォルトの名無しさん :2001/06/15(金) 17:11
DCOMってなんですか?
103 :
デフォルトの名無しさん :2001/06/15(金) 17:18
DCOM = 'COM+' - MTS
104 :
デフォルトの名無しさん :2001/06/15(金) 18:43
MTSってなんですか?
105 :
82 :2001/06/15(金) 19:11
>>97 秋葉原Laoxはまだまだ隠し持ってる説高いですね。
だって自分が買ったの、初版(InsideOLE2 -> InsideOLEの初版ね)でしたから・・・
大昔に大量に仕入れて大量に在庫抱えてるのかな(^^;)
見本置いてるなんてやっぱ大量に持ってるんだよ、絶対。
107 :
197 :2001/07/05(木) 21:07
COM初心者です。 MFCオートメーションでイベントをクライアント側に返したい 時はどうすれば良いのでしょうか。よろしくお願いします。
>>107 OLEオートメーションのこと?
イベント?をクライアント側に返したい?
もうちょっと説明しないとわかんないなあ。
109 :
デフォルトの名無しさん :2001/07/06(金) 09:39
CConnectionPointか?
110 :
デフォルトの名無しさん :2001/07/06(金) 21:16
>>107 自分で書きます。
適当に OCX でイベントを持つものを一個作って、Fire したときの動作を
デバッガで追っかければ、どんなことしなきゃいけないのかだいたいわかると
思います。
111 :
107 :2001/07/06(金) 23:19
ご返答ありがとうございます。 勉強します。 しかしATLはこの機能を包んで提供してますが、MFCはないですね。 なんででしょう?
112 :
デフォルトの名無しさん :2001/07/06(金) 23:45
EVENT_MAPとかなかったっけ? >MFC
113 :
むずい :2001/07/11(水) 21:25
ATLってむずかしい。コネクタブルオブジェクトとそのクライアントを つくってんだけど、もーうんざり。 COMに詳しい人、どうやってマスターしたんですか? 経験談、苦労話、アドバイス等お願いします。
114 :
デフォルトの名無しさん :2001/07/11(水) 23:45
>>113 IConnectionPointContainer
IConnectionPoint
あたりの事?
気狂いそうだ。 氏氏氏氏氏氏氏氏氏氏氏氏氏。げろげろ。
117 :
むずい :2001/07/12(木) 00:36
118 :
デフォルトの名無しさん :2001/07/12(木) 01:15
クライアント側はそんな難しい話しではない。 1.オブジェクトにIConnectionPointContainerをQueryInterfaceする。 2.IConnectionPointContainer::FindConnectionPoint(自分が持っている通知インタフェースのIIDまたはDIID, &IConnectionPointへのポインタ) 3.IConnectionPoint::Advise(自分が持っている通知インタフェース) これで、通知されるようになります。
119 :
初心者A :2001/07/15(日) 03:14
CoCreateInstance() でインスタンスを作成して指定インターフェイスを取得するとき CoCreateInstanceの引数にIID_IUnknownを指定してこのポインタから 指定インターフェイスを QueryInterface()するのと CoCreateInstance() の引数に 直接指定インターフェイスを指定するのでは異なりますか? 大抵の参考書では前者のようにIUnknown経由になるようですが直接指定した方が 早いとかそういうのありません?
120 :
デフォルトの名無しさん :2001/07/15(日) 18:56
そりゃ、DCOMだったらラウンドトリップが1回減るから、絶対お得。 だからこそ、CoCreateInstanceExでは一気に複数のインターフェイスを取れるようにしてあるんだ。 つーわけで、たいていの参考書はバカ。
121 :
デフォルトの名無しさん :2001/07/15(日) 18:57
しかし、そんなアホウな参考書ってどこにある?
MSDNのサンプルからしてそうじゃん
123 :
デフォルトの名無しさん :2001/07/16(月) 22:21
そりゃ単に、用途を絞ってないサンプルのためのサンプルなんじゃないか? 最初から、例えばIPersistentStreamInit欲しいとかわかってたら、IUnknown使う必要なし。
124 :
:2001/07/18(水) 18:33
LPOLESTR と OLECHAR* は全く同一のデータ型ですか? (32bitアプリだとどちらもUnicodeへのポインタ) そうだとしたら何故複数あるのでしょう。使い分けでもあるのでしょうか?
125 :
デフォルトの名無しさん :2001/07/19(木) 00:12
使い分け。 OLECHAR wch; // *付けんな OPOLESTR pwsz; // ポインタだよ 元は、16BitOLEと32BitOLEのソース共用のための定義。 別に、LPWSTRつかおうが、wchar_t*つかおうが、ドーデも良い。
126 :
デフォルトの名無しさん :2001/07/19(木) 00:13
>OPOLESTR Oracle 用文字列じゃなくて、LPOLESTRの書き間違いだ。
127 :
素人 :2001/07/19(木) 11:11
疑問!! SAFEARRAYCREATEで作成したSAFEARRAYって、SafwArrayDestroyで開放しなくても メモリーリーク起こさないん?
128 :
:2001/07/19(木) 12:15
開放してください(-_-;)
129 :
素人 :2001/07/19(木) 12:46
しないとだめか・・・ OS勝手に開放とかしてくれないんですか? 感謝
130 :
age :2001/07/19(木) 14:18
age
131 :
age :2001/07/19(木) 15:41
b
age
133 :
:2001/07/19(木) 18:59
>OS勝手に開放とかしてくれないんですか? クライアント自体が終了すればメモリは解放されると思いますけど。 COMにはガーベッジコレクタみたいなものはありませんね。 ちょっと補足 SafeArrayDestroyは自身の破棄だけでなく配列内に確保されている オブジェクトのReleaseもすべて行います(もちろんBSTRの解放も)。 必要に応じてSafeArrayDestroyData、SafeArrayDestroyDescriptor を使い分けるのもよいでしょう。前者は要素データの解放のみ、 後者はデスクリプタの破棄のみ行います。 SafeArrayDestroy = SafaArrayDestroyData + SafeArrayDestroyDescriptor といったところでしょうか。
134 :
素入 :2001/07/19(木) 22:51
IDispatch::Invoke()のパラメータで DISPATCH_PROPERTYPUTREFが良くわからないのですが これはプロパティの設定時にオブジェクトの参照を代入するときに指定するのですか? このときのバリアントはVTがVT_DISPATCHでいいですか? それともVT_DISPATCH | VT_BYREFも必要ですか? あるバリアントのプロパティでオブジェクトの参照を代入するときに DISPATCH_PROPERTYPUTではインプロセスサーバは渡せたのですが アウトプロセスサーバだとバリアントの内部形式変換が発生して VT_BSTRで渡されてしまいました。だからアウトプロセスサーバの オブジェクトの参照を渡すときには特殊な方法が必要なのかなと思って・・・
135 :
デフォルトの名無しさん :2001/07/20(金) 00:31
実行時バインディングの言語 ->late-bound language 最初スペルミスかと思ったら英語ではレイトバウンドというのね どこからバインディングになったんでしょうね 知っている人がいたら教えてね
>>135 英語でもlate-bindingはlate-bindingだ。
late-binding == 実行時バインドする
late-bound == 実行時バインドされる
137 :
デフォルトの名無しさん :2001/07/20(金) 09:56
VariantCopyInd使うべきなのにVariantCopy使ってて死にました…… でも闇雲にVariantCopyInd使ってると、メモリーリークする?
>136 辞書見ました。 私が英語に無知なだけでした。 御免。
>VariantCopyInd使うべきなのにVariantCopy使ってて死にました…… それはあるでしょうね。IDispatch::Invokeの実装内の引数処理とか VT_BYREF立ててはいけない場合もあるから。 >でも闇雲にVariantCopyInd使ってると、メモリーリークする? そんなことはないと思いますよ。VT_BYREFの処理方法が違うだけで どちらも元のバリアントを解放(VariantClearと同処理)して新たに作るだけだからね。 オブジェクトの参照もクリア時にデクリメントされコピー生成時にインクリメントされます。
140 :
137 :2001/07/21(土) 18:56
>139 さんきゅ。 気にしてんのは、VT_BYREFなオブジェクト渡したほうの意図が読めないからなんだ。 BSTR bstr; Variant v; v.pbstr = &bstr; v.vt = VT_BYREF|VT_BSTR; foo->call(v); // foo は、v保存するならVariantCopyじゃなくてInd呼べ SysFreeString(bstr); てな感じなら、リークするはずないわけだけど、なんで呼び出し側はわざわざ VT_BYREF立てて来てんだ? てのが呼ばれるこっちには理解できないからなわけ。 (もちろん、上のcallってのが[in,out]なら理解できるわけだけど、しょせん [in]variantなわけだから)
すいません、COMがうまく斬れないのですが、私の斬鉄剣に 何か問題でもあるのでしょうか?
142 :
デフォルトの名無しさん :2001/07/23(月) 23:40
OleRunとは何をやっているのか。
143 :
デフォルトの名無しさん :2001/08/03(金) 02:41
age
144 :
デフォルトの名無しさん :2001/08/04(土) 14:10
厨房な質問ですが, COMの利点はどんな言語からでも使えることだと思いますが, Windows以外のプラットフォームでも実行(利用?)できるのでしょうか?
>>144 >Windows以外のプラットフォームでも実行
以前はそんな話もあったけど事実上無かったことになってるはず。
バイナリレベルでインターフェイスを統一するのは難しいし、肝心のマイクロ
ソフト自身もCOMのめんどくささにさじを投げて、インプリメントが楽そうな
SOAPで通信する.NETに方針転換したんでないかな。
146 :
デフォルトの名無しさん :2001/08/13(月) 12:14
AddRef や Release で参照カウントが増減しないオブジェクトは オブジェクト側で参照カウントをロックしていてクライアントからは 明示的に解放することが出来ないという理解も可能ですか?
>>146 クライアントがReleaseによって行っているのは、オブジェクトの解放ではなく、
いまそのクライアントが持ってる "参照の解放" ではないかな。
あと、参照数は取得できなかったと思うけど。
>>144 COMそのものの仕組みは単純なんだけど、まともに利用しようとするなら、
その周辺まで用意する必要があります。これがまた大変。
モジラには、XPCOMという名前で採用されてます。これですべてではないですが、
Windows以外での最も大きなCOM(+周辺)の実装だと思います。
プロセスやネットやをまたごうとすると、COMではきついです。
結局 .NET ではCOMは表にでてこなくなってしまいました。
無くなったわけではないですけど。むしろ覆い隠したというべきか・・・
>モジラには、XPCOMという名前で採用されてます。これですべてではないですが、 Windows以外での最も大きなCOM(+周辺)の実装だと思います。 Bristol TechnologyがMSからソースライセンスを受けて各社Unixに COMを移植していたと思うんですが。 >プロセスやネットやをまたごうとすると、COMではきついです。 プロセス間通信は別に問題ないのではないですか? DCOMは確かに付け焼刃的印象がありますが、元々(L)RPCで通信を 行っていたのでCOM->DCOMの拡張はそれほど苦労していないのでは ないかと思います。 >結局 .NET ではCOMは表にでてこなくなってしまいました。 >無くなったわけではないですけど。むしろ覆い隠したというべきか・・・ COMやCORBAのようなレイヤが「見えなく」なるのは正しい方向だと 思います。
>AddRef や Release で参照カウントが増減しないオブジェクトは オブジェクト側で参照カウントをロックしていてクライアントからは 明示的に解放することが出来ないという理解も可能ですか? どのタイミングで実際の解放を行うかはオブジェクトが決定する ので、クライアントから明示的に解放できない場合もあるし、 ExcelのApplicationオブジェクトのように、Release以外の方法で 解放する場合もあるでしょう。
151 :
デフォルトの名無しさん :2001/08/13(月) 14:48
教えてくらはら。 もじらの XPCOM って普通の COM と同じようにコンポーネント (やインターフェース)の指定に GUID やレジストリ使ってるん でしょか? でも Win 以外の OS にもインプリメントしてん だよね。ひょっとして COM を格納したファイルパスを直接指定 してる? それと .NET でも「もはや GUID は使わない」とか言ってるよう だけど、GUID 無しでどうやって COM を決定するんだろう。 代わりに Java のパッケージみたく URL ライクな指定になって るんですかね?
152 :
デフォルトの名無しさん :2001/08/13(月) 15:21
>>151 GUIDは使ってるがレジストリは使ってない。Windows以外にはレジストリ
がないから、レジストリ相当のファイルをひとつ用意して代用してます。
そのファイルの操作にregxpcomってコマンド(など)を使う。
ドトネトは知らないのでパス。
>>152 どうもありがとうございます。
レジストリ使わないのはポイント高いっすね > XPCOM
XPCOM 使ってなんか作ってみようという気になるかも。
154 :
152 :2001/08/13(月) 16:13
>>151 レジストリと同程度にこわれやすいよ(笑
>>154 むぎゅ。
てことはやはりテキストファイルじゃないのね。
でもま、こわれても影響範囲が狭いから安心感が違うかも。
COM の開発してるとテスト用のエントリでいつの間にかレジストリが
ゴミ溜めと化すのが鬱になるんだけど、それがないだけでも好感持てる。
156 :
デフォルトの名無しさん :2001/08/13(月) 17:41
メソッドの引数にVT_DISPATCHのVARIANTを指定しているのですが インプロセスサーバの場合は問題なく渡せるのですが アウトプロセスサーバだとVT_EMPTYになってしまいます。 何か変換処理が必要なのでしょうか? マーシャリング絡みだとは思うのですが、何をどうすればよいか よくわからないんです。
157 :
デフォルトの名無しさん :2001/08/13(月) 20:21
多分、タイプライブラリをリソースに突っ込んで標準マーシャラが 見つけられるようにすりゃいいんじゃないの?
158 :
デフォルトの名無しさん :2001/08/14(火) 11:07
利用するオブジェクトは動的に作成したものであり メソッドは IDispatchEx::InvokeEx() を使って呼び出します。 オブジェクトは二つのメソッドを持っており、あるプロパティを 操作する対になっています (propget, propput)。 プロパティは VT_DISPATCH の VARIANT です。 簡単に言うとオブジェクトの参照を設定/取得するプロパティです。 このときにクライアントからオブジェクトへプロパティをセット しようとするとサーバ形態により失敗してしまいます。 渡そうとしているインターフェイスポインタは IDispatch で CoCreateInstance() しています。故にオブジェクトのデフォルトインターフェイスです。 このオブジェクトの実装サーバがアウトプロセスの場合、 正常に渡すことが出来ません。インプロセスサーバだと問題なく ポインタを渡せるのでマーシャリング絡みかなと思ったしだいです。 DispEx.h なんかを眺めていたら IDispatchEx_InvokeEx_Proxy や IDispatchEx_InvokeEx_Stub なるものも出てきて InvokeEx の使い方が 間違っているのかなと思ったり。
159 :
デフォルトの名無しさん :2001/08/14(火) 22:29
COMってなんですか?
161 :
デフォルトの名無しさん :2001/08/15(水) 01:50
普通の窓プログラムが組めなかった時、COMでおせ口作ったなぁ(遠い目)。
162 :
145 :2001/08/15(水) 19:23
>>148 >結局 .NET ではCOMは表にでてこなくなってしまいました。
>無くなったわけではないですけど。むしろ覆い隠したというべきか・・・
COMが表に出なくなったと言うより.NETではCOMのサポートはおまけ的扱いで、
COMラッパを通してしか使えないんだからCLR環境から見れば単なるライブラリ
でしか無いでしょ?
そんで、RPC(広義)が全部SOAP経由になったらCOMの出る幕は無くなるんでな
いの?
そもそもCLRや下位のCLIにはCOMの存在は前提条件でなかったはず。
Windows環境ではたまたまベースレイヤがCOMだというだけで。
つーか、.NET、COMに依存しすぎ!
164 :
デフォルトの名無しさん :2001/08/15(水) 22:47
そりゃーいままでこんだけCOMってたのに、いきなり全部とっぱらうのは無理でしょう。 既存のシステムに部分的導入をしてもらうためには、COMサポートは必須かと。 そのへんをハキチガエないのがMSっぽいところかな。Sunと違って(藁)
自分のアプリからIEを利用したいんですけど EventSinkってどう実装すれば良いんでしょうか? 「新しいウィンドウを開く」のイベントを処理したいんですけど。 MSDN見ながら適当にやって、クライアント領域に IEを貼り付けることは出来ました。 あと、MFCとかは使わないでC++でやってます。 このスレに既出のInsideOLEとかは本屋で探したけどありませんでした。
166 :
デフォルトの名無しさん :2001/08/17(金) 18:09
age
167 :
デフォルトの名無しさん :2001/08/18(土) 04:22
age
168 :
デフォルトの名無しさん :2001/08/18(土) 05:14
1、イベントシンク(IDispatch派生)をつくる 2、IEのコネクションポイント(DIID_WebBrowserEvent2?) にそれをくっつける(Advise) 3、IEがInvokeとか読んでくる。 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■■■■ ■■■■■■ ■ ■■■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■■■■ ■ ■ ■ ■ ■ ■ ■ ■■■■■ ■ ■ ■ ■ ■ ■ ■ ■ ■
169 :
デフォルトの名無しさん :2001/08/18(土) 12:20
170 :
デフォルトの名無しさん :2001/08/18(土) 13:53
文句ならゲイツに言え
171 :
デフォルトの名無しさん :2001/08/18(土) 23:06
age
172 :
デフォルトの名無しさん :2001/08/20(月) 02:57
age
173 :
デフォルトの名無しさん :2001/08/22(水) 12:51
関東近辺でのInsideOLEの情報求む。
>>173 だーかーらー、秋葉のLaoxだって。
おれなんていつも立ち読みしてすましてるw金ないもんで、、
175 :
デフォルトの名無しさん :01/08/26 14:02
ところでInsideCOM+の続編はいつ出るんだ?
.NETのせいで出版計画も頓挫したとか言わないで、
ちゃんと書き上げてくれ〜!
それともタイミングをXP以降に伸ばしたとかかな?
とにかく楽しみに待ってるよ。>Eddon
>>173 InsideOLEにはInsideCOM+に書いてないこととか載ってるのかな?
>173 行ったんだけど見つからなかったんだよ! COM関連は右の入り口から入って直ぐあたりだよね?
昨日秋葉原Laoxに別件で行ったけどありましたよー InsideOLE 見本と売り物と二つ。 プログラム言語のコーナー(?)の一番手前あたりの最上段です。
178 :
デフォルトの名無しさん :01/09/07 11:34
age
179 :
コム爺さん :01/09/11 01:47
LPOLESTR に割り当てられたメモリは IMalloc::Alloc() や CoTaskMemAlloc() で確保されたものなのでしょうか? (確保するべきものなのでしょうか?)
180 :
コム婆さん :01/09/11 03:38
>>179 BSTR SysAllocString(OLECHAR FAR* sz);
BSTR SysAllocStringByteLen(char FAR* psz, unsigned int len);
BSTR SysAllocStringLen(OLECHAR FAR* pch, unsigned int cch);
のいずれか。
純粋に割り当てという事であればSysAllocStringByteLen(NULL, len)か
SysAllocStringLen(NULL, cch) lenとcchは違うからね。
普通は、SysAllocString("HogeHoge"L)だろ。
実態はタスクメモリアロケータかもしれんが、BSTR先頭の手前に確保したサイズが
入っていて、BSTR操作の際にサイズチェックが行えると思った。
181 :
デフォルトの名無しさん :01/09/11 03:52
COMって難しいね。 エクスプローラーとかで右クリックした時に表示される コンテキストメニューにメニューを追加するだけでも 未だに分からんもん
それは 「膨大なライブラリから、適切なAPIを見つけだし、利用する」 「適切なサンプルをみつける」 が難しい、ということでは? 別に、COMだから難しいわけではないかと
183 :
デフォルトの名無しさん :01/09/11 17:20
正体不明のインターフェイスのポインタを取得した場合に、 そのインターフェイスが持つメソッドやら引数やらを知る方法はありませんか? レジストリにも登録されておらず、Webにも書籍でもドキュメントが見当たらず、 IDispatchもITypeLibもQueryInterfaceできない、素のポインタを渡された場合です。
QueryInterfaceが無いなら、COMちがうやん。 逆汗しろYO!
>>184 >>183 は
"IDispatch ITypeLib" "が" "QueryInterface出来ない" という意味でわないかと。
つまりQueryInterface自体は使えるのでわないかと。
タイプライブラリが無いならどーしよーも無いような気がします。
タイプライブラリはdllやexe本体に含まれる場合が多いですが、
タイプライブラリだけ別に置く場合もあります。
もう一度レジストリを追って見るのが吉。
それでもだめならやっぱり逆汗しかないかも・・・?
186 :
コム爺さん :01/09/11 22:26
BSTRの話ではなく LPOLESTR についてお聞きしたいです。 BSTRがどのようなデータ構造をしているかは勿論知っていますが COM API の中には関数側で LPOLESTR を確保して 呼び出し側で CoTaskMemFree() で解放するようにと要求するものが あります。 CoTaskMemFree() は IMalloc::Free() をラップしている 関数と思われるので 179 のように訊いた次第です。
187 :
IUnknown :01/09/11 22:59
>183 まず疑問。正体不明のインターフェイスが何故レジストリに登録されていないか わかるのでしょうか?登録されていないとわかるためにはインターフェイスIDを知らな ければなりません。何か勘違いしているのかな? IDispatch が実装されていなければディスパッチインターフェイスでもデュアルインター フェイスでもないですからカスタムインターフェイス。ということはタイプライブラリは まず無いでしょうね(ちなみに普通はいきなり QueryInterface で ITypeLib は取得でき ませんよ。これらが実装されるオブジェクトは元のオブジェクトとは別物だからです。 専用のAPIを使うかIDispatch経由で取得しましょう)。 正直言って何の資料もなしにカスタムインターフェイスの仕様を知るのはほぼ不可能です。 オブジェクトは全てのインターフェイスを公開する必要はありませんし開発者だけが知り うる隠しインターフェイスも結構あったりします。 では何も出来ないかというとそうでもありません。あまり期待してもらっては困るのですが 次に示す方法でオブジェクトの機能をある程度調べることが出来ます。 私は何らかのメソッドが返す未知のインターフェイスポインタを取得した場合には オブジェクトがどのようなインターフェイスを公開しているか確認します。 まずレジストリの Interface キーにアクセスしてサブキーを列挙します。サブキー名は IIDですからこれをIID構造体に変換して全て QueryInterface させます。インターフェイス 名はサブキーの値のデータになっていますから簡単に取得できるでしょう。 実装されていればポインタが返りますからインターフェイス名をチェックしておきましょう。 あと Release することを忘れずに。 これで少なくともどのようなインターフェイスが公開されているかを知ることが出来ます。 実装されているインターフェイス名に標準的なインターフェイス以外を発見したら しめたものです。このインターフェイス名を手掛りに色々と調べれば何かわかるかもしれません。 COM / OLE のごく一般的なインターフェイスしか公開されていなければちょっと手は出ませんね。
丁寧なレスありがとうございます。
>>184 ,185
>"IDispatch ITypeLib" "が" "QueryInterface出来ない" という意味でわないかと。
そういう事です。読みにくい文章で申し訳ありませんでした。
>>187 >まず疑問。正体不明のインターフェイスが何故レジストリに登録されていないか
>わかるのでしょうか?
今回の件では、コンテナとサーバの関係にあるふたつのCOMオブジェクトのサーバ側を実装すると、
コンテナ側からその不明なインターフェイスがQueryInterfaceされてくる次第です。
それで、IIDだけはわかる、という状態です。
教えてくださった手順ですが、実は
>>183 の投稿の直前にまったくこの通りのことをしていました。
HKCR\Interface 内を探してみても、このIIDが見つからないので名前も不明でして、
手掛かりが得られなかったんです。
コンテナ側オブジェクト自体はMS製の既知のもの、というか早い話がエクスプローラなのですが、
そこからこそっと問題のインターフェイスがQueryInterfaceされている状態です。
COMSPYで調べてみると、至るところで出てくるんですが。なんで非公開なんだ??
vfptrあたりのメモリをダンプしてみて、メソッドが二つ存在するという程度までは調べがついたのですが、
これ以上は逆汗しない限りムリですかね、やっぱり。
リバースエンジニアリングにならない程度にがんばります(藁
189 :
使ってみました :01/09/15 15:54
COMSpy で質問。 あれってアプリケーションオブジェクトはフック出来ないんですか? (Excel とかIEとか)リストに出てきません。 インプロセスサーバおんりーなのかなあ
190 :
IUnknown :01/09/17 22:56
>189 サイトに書かれていることをちゃんと読みましたか? 「COMSPY currently only works for inproc (DLL, OCX) servers」 将来的には変更するそうですが、もう2年も経ってますからねえ。 私も前からアウトプロセスサーバもスパイして欲しいと思ってた口です。
191 :
デフォルトの名無しさん :01/09/18 15:51
SysAllocString で作成した BSTR を SysFreeString せずにほうっておいた 場合、いつその領域は開放されるのでしょうか? たとえば、以下のようなコードあって、Obj 内で SysAllocString していると すると、ptr が初期化されるときに開放されるのでしょうか? それとも CoUninitialize のときに開放されるのでしょうか? for ( … ) { try { IObjPtr ptr( __uuidof( Obj ) ); …… } catch ( … ) { } } CoUninitialize(); また、そういったことはどうすれば調べられるでしょうか?
>190 わかりました。英語が弱いって言い訳にならないよね。 ところで別の質問です SHGetMalloc と CoGetMalloc ってどう違うんですか?
193 :
デフォルトの名無しさん :01/09/19 05:45
COMについて語ってるHP探してます。 Yahoo!で検索かけても出てこないです。
C言語のみでCOMをつかおうと言う感じのサイトがあったと思うのですが、 どこだか忘れてしまいました。 どなたか知りませんか?
195 :
デフォルトの名無しさん :01/09/19 09:00
196 :
デフォルトの名無しさん :01/09/19 09:15
YO!チェケラ!!
198 :
デフォルトの名無しさん :01/09/19 10:31
>>198 ありがとうございます。案外身近なところに・・・あるんだ。
200 :
デフォルトの名無しさん :01/09/20 22:36
「COMって何?」ってレベルからの入門本紹介してくださーい 言語はC++で。
Essential COM アスキー・アジソンウェズレーシリーズ ISBN:4-7561-3066-6
202 :
デフォルトの名無しさん :01/10/04 23:39
age
MFCCOMは最低。 この前参照カウンタ勝手に増やしてメモリリーク おこしやがった。
ROPE.DLLマンセー
違うスレに書いちゃったけど こっちのほうが適切っぽいんで質問させてください。 COM初心者なんですけど STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut) { .... } を作ろうとするとREFCLSIDが定義されてないって怒られる。 どのファイルをインクルードすればいいのか教えてくださいまし。
COMの機能って、クライアントにVBを選ばなかったら 殆どいらないものばかりのような気がするのですが、 気のせいでしょうか?
209 :
デフォルトの名無しさん :01/10/17 22:20
>>207 IDispatchとかは全くいらないな。
210 :
デフォルトの名無しさん :01/10/17 23:04
逆に、かつてMTSと呼ばれていた機能(今はCOM+ Component Service)にはVBから使えないものがあるな。MTA(Freeスレッド)、NTA、オブジェクトプーリング、JITAなんてそうじゃないか? あと、共有プロパティマネージャはVBから使えるのかな?
>>209 細かい事ですが、それはCOMの規約ではなくオートメーションの規約になります。
212 :
デフォルトの名無しさん :01/10/18 20:45
COMでいうところのコンポーネントって、実体は何? DLLやEXEのようなバイナリファイルを1つのコンポーネントとして数えるの? (HogeLib.dll=1コンポーネント?) それともこういった中にある、実装クラス(コクラス)とそれを取り囲む インターフェイスを1セットでコンポーネントというの? (HogeLib.HogeHoge=1コンポーネント?) よくわからなくなってきた。
コンポーネントとはバイナリファイルという理解で取り敢えず いいと思います(スクリプトコンポーネントといった特殊なものも ありますが)。コンポーネントは一つまたは複数のオブジェクト (つまりCOMクラスにあたりますね)を実装しています。。 またクライアントとの通信という観点から見るとサーバという 言葉が使われ、コンポーネントを実行形態から分類した 表現になります。
ありがとうざごいます>213 「HogeLib.dll=1コンポーネント」「1コンポーネントにn個のCOMオブジェクト」 でいいんですね?(とりあえず) で、ついでにさらに質問なんですが、CClassFactoryというのは、コンポーネント 単位で1つだけ実装されているものなんでしょうか?それともCOMオブジェクト単位 で1つずつ実装しているものなんですか? OLEViewで自作COMの中を見てみると、IUnknownやIDispatchやISupportErrorInfo はいるのに、IClassFactoryはどこにも見当たらないので・・・。
IClassFactoryはオブジェクトのインスタンスを生成するための 特殊なインターフェイスです。他のインターフェイスから IUnknown::QueryInterface で取得する事はできません。 そのため OLEViewer でも見れないのです。ちなみに OLEViewでは オブジェクトが実装するインターフェイス名の取得はレジストリの Interfaceキーをスキャンして QueryInterface を呼び出している だけです。 オブジェクトのインスタンスは CoGetClassObject で IClassFactory を取得して IClassFactory::CreateInstance を 呼び出すと得られます。より一般的な CoCreateInstance はこの 処理をラップした関数です。ということで IClassFactory は オブジェクト単位で実装する事になります。 細かい事はこれらの語句をキーワードにMSDNなどを眺めてみると いいと思いますよ。
IUnknownさん、どうもありがとうございます。 なるへそ。OLEViewは全部見れるワケではないと。 どうりでATLでCOM+コンポーネントを作った時に実装しているハズのIObjectControlが OLEViewに表示されなかったはずだ。 それにしてもCOMは深い。今後レガシー技術になって廃れていってしまうのはもったいねーな。 .NETがCOM+レベルにまで成熟するのなんていったい何年後なんだろーな? そういえばMSが「COMはMicrosoftの魂です。」なんて発言をしたのは、何年前の話だったっけか?
217 :
デフォルトの名無しさん :01/10/23 18:20
いやー皆さん凄い知識ですねー。 先日、業務で使うことになりましたが、サッパリです。 VBでサーバーとクライアント機能を実現したいと思っているのですが、 レジストリに登録する項目はタイプライブラリとサーバーのパスなんでしょうか?
218 :
デフォルトの名無しさん :01/10/23 21:48
COMはregsvr32というツールを使えば、それだけで勝手にレジストリ登録されます。自分で手入力でCOMの情報をレジストリに登録する必要はありませんし、やってはいけません。
219 :
デフォルトの名無しさん :01/10/25 12:00
>218 ありがとうございます。 早速、参考にしてやってみたいと思います。
220 :
デフォルトの名無しさん :01/10/25 18:06
>218 ありがとうございます。*.regファイルで登録ってのはダメなんでしょうか? *.regを実行させて登録しているのですが、 それはregsvr32.exeの引数としてファイル名を指定して実行したのと同じこと ではないのですか? 現状ではregファイルの内容で悩んでおります。CだとUIDとか必要なのに、 VBだと何が必要なのかと。
221 :
デフォルトの名無しさん :01/10/25 18:10
219書き込まれてま死た・・クッキーですか。鬱氏。
>>220 regsvr32.exeが何やってるかっつーと
対象のCOMが持っている登録機能を呼び出しているだけなのです。
DLL(インプロセスサーバ)ならエクスポートされた
DllRegisterServer(アンインストールにはDllUnregisterServer)を、
EXE(アウトプロセスサーバ)なら・・・忘れた、確かコマンドライン引数を渡している
のです。
この自己登録機能によってCOMは自分で適切なレジストリ設定を行うのです。
逆にいうと外からはそのCOMがどんな設定を必要としているのか分からないので
勝手にレジストリを書き込むのはまずいのです。
(大変キケンをともなうので素人にはオススメできない byごるご)
つーわけで
regsvr32.exeがやっているのと同じ事を実行してやりましょう。
エクスポートされた関数を呼んだりコマンドライン引数をつけてexeを実行したりしてやってください。
注意:
COMの自己登録機能は必須ではありません。(普通はつけるけど)
自己登録を実装するのはCOM作成者なのです。
・・・・って知りたい内容と合ってるかな?
でわ
ちなみに、COM+といわれるCOMの進化版では、regsvr32だけではダメです。MSIを実行しなきゃいけません。 COM+の情報がレジストリだけでなくCOM+RegDBというものにも書き込まれるからです。
COM登録ってrgsに自己登録書くだけじゃ駄目なんかいな?
初めて書き込みます。masaです。教えてください。 COMをW2K-ServerのCOM+に登録しましたが、クライアントのNT4上から インスタンスを作成することができず、使えません。W2K-Proをクライアントに した場合はOKです。多分COM+上のセキュリティの問題なのかなあ?
226 :
デフォルトの名無しさん :01/11/02 09:52
>>224 それは ATL がラッピングしていることなんで、
>>1 のように ATL に
ラッピングされてない COMについて語るのであれば、ダメです。
227 :
デフォルトの名無しさん :01/11/02 10:14
>225 たしかNT4と2Kではセキュリティモデルが違うとかなんとかで うまく行かないはず。 2K側のセキュリティモデルをNT4互換にすればいいのかな??? そもそもCOM+ってNT4で対応してたっけ?
papaです。初めてのカキコです。 現在、VBにてActiveXのEXEを作ってマス。 引数として構造体があるのですが、コレがなかなか上手く渡りません。 固定長、可変長の文字列だとメモリを粉砕してるらしくって落ちたり落ちなかったり・・・ どなたかこの辺詳しい人おられませんか?
>228 COMインターフェースで期待している型と COMの実装言語(受け取る相手はCなのかいな?)での型と VBで渡したい型の間でバイト並びが違うと当然ダメだわねえ。 とりあえずそれぞれ何の型なのか教えて味噌。
レスありがとうございます。 えっとですね。やりたい事はVBのEXE同士の構造体値渡しなんです。 ActiveXを使っての。 CとVBのBSTRとString、 long同士のように並びについても何とか分かってます。(ホントか?) 渡す引数がちゃんと対応してないとダメって事ですよね? COMでVBのEXE同士を結びつけるのって普通しないのかなぁ・・・。 知恵をお貸しいただけるとありがたいです。
231 :
227(泥酔) :01/11/07 21:47
受け側も送り側もIDL(タイプライブラリ)での型宣言は同じになってる?
225>227
http://www.zdnet.co.jp/help/howto/win/win2000/0007special/complus_vb/chap4/12.htm が今のバイブルになっているのですが、プロトコルがDCOMのはずなのでdcomcnfgに登録されているはず
だ!って書いてあるのですが登録されてません。msiファイルをインストールすると
VB上からは参照設定できます。しかしプログラムを動かすとActiveXコンポーネントを作成できません。の
エラーが出てインスタンスが作成できない状態です。win98+dcom98でも結果は同じでした。
ちなみにWinNT4(sp6a)+VB6(sp5)がクライアント環境です。ServerはWin2kServer(sp2)+VB6(sp5)です。
いろいろなhp等々見ているのですがこの辺に関してはほとんど情報がない状態です。
(自分が探しきってないだけかも...)
よろしくお願いします。
233 :
227(二日酔い) :01/11/08 12:43
>232 どんなエラー? エラーコードをエラーメッセージに整形する関数があるので もうちっと詳しいエラーメッセージを調べて見れ
234 :
デフォルトの名無しさん :01/11/08 12:45
COMってなんですか?要するにライブラリですか?
>233 早速の返事ありがとうございます。 エラーの内容ですが、 実行時エラー'429' ActiveXコンポーネントはオブジェクトを作成できません。 です。 COMの中身ですが Public Function TestClass() As String TestClass = "Test" End Fucntion といった簡単な内容です。 クライアントは Private Sub Command1_Click() Dim cls As TestCLS.TestClass1 Set cls = New TestClass1 Text1.Text = cls.TestClass Set cls = Nothing End Sub で、Newの行(実際にインスタンスを作成する)で上記エラーが発生します。 ちなみにその状態でNT4ServerのMTSに登録してあるCOMをエクスポート後 クライアントにインストールしました。MTSの方はレジストリに書き込まれ ていますので書き込まれているRemoteComputerの変数を強制的にWin2kServerの コンピュータ名に書き換えてやるとなぜかWin2k側のCOM+が動きます。 こんな状況です。 よろしくお願いします。
236 :
227(ほろ酔い) :01/11/08 20:45
>235 ちなみにVBはEnterprizeEditionかいな? VisualStudioToolsのOLE/COM ObjectViewerでCreateInstanceできるかいな? オデもCOM使うときはC++からのみなもんでVBでのCOMはよう知らんのよスマソ。 本当はAPIのFormatMessageとかが吐くエラーのほうが情報量多いんだろうが・・・ >234 DLLの拡張版じゃ。
>231 >受け側も送り側もIDL(タイプライブラリ)での型宣言は同じになってる? こちらですが、IDLは使ってませんで、ActiveXでのCOM化(?)でやってマス。 問題はEXE同士、画面を持つモノ同士での構造体配列のデータの引き渡しに失敗することなんです。 ん〜説明不足でしょうか? やはりIDLを使ってタイプライブラリを作成し、組み込む方が良いのでしょうかね? ATL未使用でのCOMでのC同士の連携は成功してます。ガックシ。 VB同士のCOMでの開発の資料が殆ど無いので、困ってる次第です。 やっぱIDLでCOMった方が良いのかなぁ・・・・ どなたかVBのEXE同士での連携に成功した方いらっしゃいませんでしょうか?
>>237 構造体はやめた方が吉。
クラスで参照渡しした方が安全だしIDL要らずで楽チン。
サーバ側は
Public Property Get Hoge(Byval Index As Integer) As HogeClass
Set Hoge = myHoge(Index)
End Property
ってかんじかな。
>VB同士のCOMでの開発の資料が殆ど無いので
MSDNライブラリを"coffee"で検索してみよう。
239 :
デフォルトの名無しさん :01/11/13 23:17
VCでCOMを作るときって、BSTR文字列同士の比較ってみんなどうやってる? 俺がよく使うのは・・・ 1)2つともOLE2Tしてからstrcmpで比較 2)2つとも_bstr_tに代入して==で比較 なんだけど、どっちのほうがいいんだろう? なんか、VCは文字列の扱い方が多くて迷うよな・・・。
・UNICODE <-> SJIS 変換はテーブル参照でとっても遅い ・UNICODE -> SJIS は変換できない文字がある ってことで、基本的に1)はあまりお勧めできない。
241 :
デフォルトの名無しさん :01/11/14 08:23
どうもです>240 ちなみにこういう書き方はOK? if( ( _bstr_t )aaa == ( _bstr_t )bbb ) { // aaaとbbbはBSTR変数 いや、いちいち_bstr_tのインスタンスを明示的に生成するのが面倒くさいからキャストしてるんだけど。 それともわざわざ _bstr_t aaaaa = aaa; _bstr_t bbbbb = bbb; if( aaaaa == bbbbb ) { てやったほうがいいのかなあ?厨房な質問でスマソ・・・
それは後続する処理とか、aaaとbbbの一致率とかで決めるべき。 あとでSJISなルーチンにつっこむなら、OLE2Tで比較してもいいし、 UNCIODEのままHogeるなら、最初に_bstr_で代入したほうが便利。 aaa,bbbがそこでしか使わないなら、そこだけキャストするのもいいだろう。
243 :
デフォルトの名無しさん :01/11/14 18:11
VBのCOMからのイベントをJavaScriptで記述したHTMLで拾えるのに、 ATLのCOMからのイベントをJavaScriptで記述したHTMLではどーしても拾えないっす。
244 :
デフォルトの名無しさん :01/11/14 19:47
漏れは、、相当の処分、、のようなきがするYO。。
>241 _bstr_t型に直接BSTR型を代入するとリークすると思われ。 if( _bstr_t(aaaBSTR,FALSE) == _bstr_t(bbbBSTR,FALSE ){ ... としたほうがリークしないらしい。(ちゃんと確認したわけではない) もっとスマートな方法ないんでしょうかね? MSDNあたりをあさってみてください。 検索で_bstr_t リーク 等のキーワードでHitすると思います。 比較演算子はないけど、ATL使ってるならCComBSTRクラスのほうが軽量でよい、と聞いたことがあります。
if( _bstr_t(aaaBSTR,FALSE) == _bstr_t(bbbBSTR,FALSE) ){ )が足らなかった。鬱
249 :
デフォルトの名無しさん :01/11/15 17:55
「起動されたオブジェクトは、クライアントから切断されました。」 のエラー原因ってなに?
250 :
デフォルトの名無しさん :01/11/15 22:31
>>249 禿しくスレ違い。
COMに斬られてどうする。
マジ?
>>247 ( _bstr_t )aaa とか _bstr_t bbbbb = bbb; とかいままでしょっちゅうやってるんだけど・・・
>>251 VC6.0SP5の環境でチェックしたらリークしなさそうですね・・・・
1999年の文書を参照してるので、現在は修正されてるのかな?
リークが顕著化しないのであれば、特に問題ないと思います。
# ほんとはしてたりして・・・
微妙に息の長いスレだな。
254 :
デフォルトの名無しさん :01/11/20 13:21
定期age
wcscmp(aaa,bbb) でいいのでわ? とかそういう問題(互換性?)じゃあないんでしょうか?
256 :
てんさいぷろぐらむぁ(偽) ◆8Fck5JHo :01/11/22 02:21
ageてみる
257 :
デフォルトの名無しさん :01/11/22 06:06
MIDLでvoid * 使うにはどーしたらよかとでしょうか。
258 :
デフォルトの名無しさん :01/11/22 23:50
>>257 IDLでvoid*は試したことないなあ。
COMの原則から言えば(RPC上の)転送サイズの推測が利かない
VOID*は禁止されていたとしても不思議ではない。
DLLサーバなら別に実害はないんだろうが、EXEサーバーとかで
は完全に破綻する宣言方法だな。
メソッドの引数として使うと確実にエラーとしてはじかれます。<void * や HANDLE MIDLはメソッドの引数として型無しを認めていないからです。 これはオートメーションでは禁止という意味で、 MIDLでは全く不可能というわけではありません。 MIDLでの void * の使い方。 cpp_quote("#if 0") typedef ULONG * HNDL; cpp_quote("#else") cpp_quote("typedef HANDLE HNDL;") cpp_quote("#endif") 反則かも知れないけど、これで HNDL という定義は .cpp 上では void * になります。 また、MIDL上でもエラーをこきません。
260 :
デフォルトの名無しさん :01/12/02 11:58
COMって消え行く技術なの?
>>260 消えるとは思えないけど、デバイスドライバを書く人がそんなに多くないように、
生COMを使わなければならない、という場面は減ると思う。
262 :
デフォルトの名無しさん :01/12/02 19:42
>>243 うまくいったVBの方をOLEViewでTLBの情報をみてC++ で同じようにつくってやれば?
&heart
264 :
デフォルトの名無しさん :01/12/25 23:30
age
>>260 COMは消えないかもしれない。
が、COMを経由しない世界はもっとスゴイ。ステップ激減で高性能。
逆に言うと、COMを作る側は不思議に膨大なヘッダーファイル、実行時は性能がネック。
266 :
デフォルトの名無しさん :02/01/04 05:38
>265 安物ぎじゅつだよあれは。氷魚の著作。しかもかなり手抜きのな。 お前ら糞氷魚のあとおってるだけ。 どうせMSだけでなくて米業界全体が、統一思考や一括管理な んて思考をうけいれるつもりなんてまったくないと氷魚は嘆いて いたよ。完璧なものをつくらせちまえよ。やつに。 こころあたりはあるんだろ?それらしいやつ。
267 :
デフォルトの名無しさん :02/01/04 05:41
G400でとめさせているのも奴。 勝ち疲れでATIやらにも手ぇ貸してるみたいだがな。 あこがいちばん素直ないろと設計らしいし。もいっかい りりーすされるのきぼーん。 AUREALも奴つぶした?1bitも奴。 とっとと完成品くんでしまえと逝ってやれよ。
270 :
デフォルトの名無しさん :02/01/15 23:19
age
271 :
名無しさん@お腹いっぱい。 :02/02/01 19:23
age
sage
273 :
デフォルトの名無しさん :02/02/23 21:24
ATL COM AppWizardでEXEサーバーを作り、ATLオブジェクトウィザードで ダイアログを追加しました。そして以下のテンプレートクラスを継承させました。 public CAxDialogImpl<CComDialog>, public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CComDialog,&CLSID__ComDialog>, public IDispatchImpl<IComDialog,&IID_IComDialog,&LIBID_SAMPLELib> ダイアログリーソースにエディット、インターフェイスにVisibleプロパティを 追加してクライアントプログラム(クライアントはコンソールアプリケーション)から起 動しましたが、エディットボックスに文字をタイプすることが出来ません。 カーソルは表示されマウス操作によるカット&ペーストは可能です。さらにBackSpace キーは無効でDeleteキー、カーソールは有効です。 EnableWindow、SetFocus周りの見落としがあるのかと試行錯誤しましたた。 このような場合、エディットのテキストエリアに文字を入力できるようにするには、 どうしたらよいのでしょうか?
自己れす TranslateMessageが無かっただけ。 Wizardに頼りすぎだった。
275 :
VBCOM :02/03/10 16:36
VBでつくったCOM(+)をVCで使う方法がどうもわかりません。 以下のようにVBでTestVBComをつくって、Com+にも登録してVBScriptから呼べることを 確認して、さあCで使おうとおもったら、タイプライブラリがない、とおこられます。 「コンポーネントおよびコントロールライブラリ」にも自作のVBCOMが出てこないし・・・ なにか不足なことがあるんでしょうか? #include "stdafx.h" #include <comdef.h> #import <TestVBCom.dll> named_guids int main(int argc, char* argv[]) { CoInitialize(NULL); // COM の初期化 printf("Hello World!\n"); return 0; }
276 :
デフォルトの名無しさん :02/03/10 20:42
質問です。(言語はC+SDKです) ・Invokeで取得したVARIANT値がVT_DISPATCHだった時に、 そのインターフェースを使う場合AddRef/Releaseしますが、 使わないで、ただ(戻り型を知る様な目的で)空読みした場合、Releaseは必要でしょうか? 現在必要ないものとして処理してますが、これは正しいでしょうか?
277 :
デフォルトの名無しさん :02/03/10 21:03
age
278 :
デフォルトの名無しさん :02/03/12 22:24
>>276 メソッドがIDispatch*を返す直前にAddRef()してるなら、Release()
する必要があるでしょ。そうじゃなければ必要なし。まともなメソッド
なら普通AddRef()してるはずだが。
279 :
VBCOM :02/03/13 16:46
すこし勉強しました。 で、Cからも呼べるようになりました。 #import "C:\Documents and Settings\hoge\My Documents\MyVB\TestVBCom\TestVBCom.dll" no_namespace named_guids で、次なんですが、[out, retval] BSTR* retValをCで受ける方法がわかりません。 Public Function View() As String View = "Hello, Com World!!" End Function のタイプライブラリが、 inline _bstr_t _Hello::View ( ) { BSTR _result; HRESULT _hr = raw_View(&_result); if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); return _bstr_t(_result, false); } となっていたため、_bstr_tで受けたのですが、 _bstr_t retVal = MyPointer->View; cout << (char*) retVal << endl; としても、-1しかかえって来ません。 デバッガで_bstr_tを見たのですが、そもそも("-1", (1))という値しか入ってないです。 これってVB側の問題なのでしょうか、VC側の問題なのでしょうか?
君の問題。
281 :
デフォルトの名無しさん :02/03/13 17:17
COM+サーバで一度に1クライアントしか呼べないようにしたいのですが、 どうすればいいのでしょうか? プールとリサイクルで呼び出し制限を1にしたのですが、いくらでも呼べてしまいます。
_bstr_t retVal = MyPointer->View; _bstr_t retVal = MyPointer->View();やなくて?
283 :
VBCOM :02/03/13 17:49
あ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Comのメソッドを呼ぶときはView()じゃなくてViewなんだあ、 となぜか勝手に思い込んでました。 ありがとうございました。
284 :
デフォルトの名無しさん :02/03/13 21:17
VariantClearについて質問です。 この関数は対象となるVARIANT変数のAllocSysStringで確保したBSTRの開放や DispatchなどのインタフェースのReleaseまでしてくれるんでしょうか?
この関数の仕様を見誤ると、 メモリリークの原因になってしまうのでコワイです。 知ってる人いたらおね害します。
だめだこりゃ
>>284 こんなとこで聞くのが間違い。
ちなみにおれは知らん。
>>287 え?
じゃあどこで聞けば委いいですか?
From MSDN... The function clears a VARIANTARG by setting the vt field to VT_EMPTY. The current contents of the VARIANTARG are released first. If the vt field is VT_BSTR, the string is freed. If the vt field is VT_DISPATCH, the object is released. If the vt field has the VT_ARRAY bit set, the array is freed.
>>289 ありがとう。
でも英語なんで正確な意味がわからなかった。
つまり開放してくれるって事ですか?
>つまり開放してくれるって事ですか? そーでーす。
>>291 ありがとう。
謎は全て解けた!
きみの様ないいやつが沢山いればこの板も安泰だね!
COMのメリットがよくわかんないんですが、 確かにOSアップグレードする時に、DLL入れ替えるだけでできるのはいいと思うけど、 他になんかある?
えーとですね。COMのメリットはですね。 すいません。ありませんでした。(゚∀゚)
>>293 IEやExcelが操作できるよ
まあ、そんだけかな。
296 :
デフォルトの名無しさん :02/03/13 23:54
aspから使える
297 :
デフォルトの名無しさん :02/03/14 00:02
VBからもVCからもVJからもASPからもVBScriptからもJScriptからも使える
298 :
デフォルトの名無しさん :02/03/14 00:06
>>297 つまり、ソケットが使えない
あるいはクソ言語しか使えないプログラマーのための
上級プログラマーの配慮という事ですな。
299 :
デフォルトの名無しさん :02/03/14 00:18
>>297 みたいな状況だったら使い道あるかも。
クリティカルな部分はCOMにして信頼できるやつに作らせて、
怪しいプログラマにはCOMクライアントの部分をVBとかでやらせるとか。
今だ!オッパイゲット!
302 :
デフォルトの名無しさん :02/03/14 01:11
とりあえず怪しい奴にはJava触らせてるけどやっぱ危険
303 :
デフォルトの名無しさん :02/03/14 01:48
そもそも動かないため、怪しい奴にはC++を触らせるのが吉かと。
304 :
デフォルトの名無しさん :02/03/14 01:58
怪しい奴には、テスターやってもらえ。ソース触らせるのはヤメトケ。
怪しい奴にはマシンさわらせるのもヤメトケ。 Windows壊されるぞ。
>>293 まじれすつけておこっと
既存インターフェイスと新規インターフェイスのどちらも持てるところ
じゃないかなあ。
ファンクションコードと ver x 以降使えます。みたいな API よりも
実際に必要なインターフェイスをもっているかどうか。
の方が即物的でイイカンジっしょ。
COMのメリットは言語をまたがったコンポーネントの相互運用が可能になること。 たぶんソケット云々って言ってるやつにとっては、そんなのソケットでできるじゃん、 ってことになるんだろうけど、ソケットとは思想が違う。ソケットにデータを送るのではなく、 相手のメソッドを呼び出すということ。それがマシン内でもマシン間でも透過的に できることがメリット。
つーかな、いちいちマーシャリングコードを socket使って書くのはだるい、ちゅうねん。
同意。
310 :
デフォルトの名無しさん :02/03/14 21:05
>>308 COMの意味ない知識を詰め込むよりましだと思うが。
というか、COMにして良かったと思った例を教えて欲しいんだが。
俺はバイトなので、仕方なくCOM使ってるけど
COMが便利だと思える場面は経験してない。
まあ、あえて言えばASPしか使えない奴がプログラマーと名乗ってる組織で
仕事する時は便利だな(w
>310 お前はDQN。
>>310 じゃぁ、今使っているCOMの機能をすべてsocketで実装してください。
まぁ君が今使っている機能ぐらいなら作れるだろうな、
どうせ関数呼び出し程度しか使ってないだろうから。
それに、バイト君は暇だからいいけど、プログラマはそんな
低レベルな実装を時間をかけてわざわざやらないのだよ。
>310 socketでは無くCOMにして良かった例 ・COMならsocketで書かなくてならない面倒くさい処理を書かなくてすむ socketで出来ない処理があるかって言うとそれを探すのは難しい。 しかし、問題はそこじゃないんだよ。 問題は今作っているものにどっちがふさわしいかってこと。 C++でやれることは全てアセンブラでも実現可能だろ。 しかしアセンブラを使用することは少ない。その理由と同じさ。
314 :
デフォルトの名無しさん :02/03/15 00:25
厨房な質問でスマンが、なんでsocketなんて出てくるんだ? もしかして、COMを使わないで似たようなことやるには 自前でプロセス間通信して〜って話ですか?
315 :
デフォルトの名無しさん :02/03/15 00:38
RPCが出てくるなら分かるけど、Socketが出てくる辺り・・・ 涙が出ます
316 :
デフォルトの名無しさん :02/03/15 01:04
リモートにあるオブジェクト同士を透過的に呼び合う機構を擬似的に仕立て 上げてくれる方法が、いまやいろいろ(COM/CORBA/RMIなど)あるっつうのに、 未だにsocketでなんでもやろうとする奴は、究極の車輪再発明野郎だとおもう。 しかもそういう奴は、どういうわけかそのことにプライドを持っている。なんでだ?
>>316 ネットワーク層やデータリンク層に手を入れられるからでしょ。
318 :
デフォルトの名無しさん :02/03/15 01:20
COMってさー、GUIDとかレジストリ使ってる時点で終わってると思う。
321 :
デフォルトの名無しさん :02/03/15 01:25
>>317 そんな必要があることは、あまりないと思うが…
セキュリティ関係でプレゼンテーション層を変更する必要があることは
多いけど、こういった機構を使っていても、それは可能だしね。
>>320 環境変数よりはマシだと思う。っていうかCLASSPATH逝ってよし。
>>315 その一言でわかりました。
つーか、socketなんて個人でいじる場合は
データ通信にしか使わないよな。
>>320 はぁ?
GUIDはむしろ歓迎だろ。
本当にUniversal Uniqueだとしたら
うわっ、釣れた
何かを作る上で「ここまでは決め事にしましょう」っていう 合意がなければ何も作れない。その決め事をフレームワークって いうかどうかは別としても、おれはその意味をそう捉えている。 COMを使いましょうって決まったのなら、可能な限りその範囲内で 問題を解決しようっていうことだから、もしSocketで十分なものだと 判明しても、間違っているのは最初の合意(COMの採用)であって COM自体の優劣の話じゃない。
327 :
デフォルトの名無しさん :02/03/15 10:49
>低レベルな実装を時間をかけてわざわざやらないのだよ。 ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。 >しかしアセンブラを使用することは少ない。その理由と同じさ。 ネタ?(w COMの位置付けが全然わかってないようで・・・・ COMとソケットの関係が,C++とアセンブラだってさ(w >未だにsocketでなんでもやろうとする奴は、究極の車輪再発明野郎だとおもう。 なぜ? 俺はソケットの方が、短時間でできる例しか知らないから、 ソケットでやった方が優れていると主張してんだけど。 車輪の再発明とかほざく奴は、どういうわけかそのことにコンプレックスを持っている。なんでだ? >上げてくれる方法が、いまやいろいろ(COM/CORBA/RMIなど)あるっつうのに、 そういう奴に限ってXMLは重いと言う罠 まあJavaだけ使うなら、RMI便利だけどね。 どーせ、おまえらIDLすらよくわかってないんだろ。 で、結局COM使って良かった例は ・ASPしか使えない奴がプログラマーと名乗ってる組織で仕事する時 だけなんだね。
>>327 > ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。
どんなことをやっているのか教えてください。
>>327 > ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。
「時間は変わらん」というだけなら誰でもできるよ。たとえそれがウソでも。
実例をあげなさい。
> COMの位置付けが全然わかってないようで・・・・
> COMとソケットの関係が,C++とアセンブラだってさ(w
あなたの意見は? COMの位置付けを説明してよ。 笑うだけなら誰でもできるからさ。
> 俺はソケットの方が、短時間でできる例しか知らないから、
> ソケットでやった方が優れていると主張してんだけど。
そりゃソケットの方が短時間でできるならソケットを使うよ。
じゃぁソケットで時間がかかるときはどうするの?
ソケットの方が、短時間でできる例しか知らないのね。
> 車輪の再発明とかほざく奴は、どういうわけかそのことにコンプレックスを持っている。なんでだ?
「そのこと」ってどこにかかっているの?
> そういう奴に限ってXMLは重いと言う罠
なんでいきなりXMLが出てくるの。だれもそんなこと言ってないでしょ。反論になってないよ。
> で、結局COM使って良かった例は
> ・ASPしか使えない奴がプログラマーと名乗ってる組織で仕事する時
なんでASPなの? ウソならだれでも言えるからさ、根拠を言いなって。
的外れな意見ばかりだね。もう少し日本語勉強して出直してきなさい。
330 :
デフォルトの名無しさん :02/03/15 11:30
>ソケットの方が、短時間でできる例しか知らないのね。 そういうことだから、教えてくれって言ってるんだよ。 で、短時間でできる例がわかってると認識されてるわけだから、 実例挙げなくてもいいのか? >なんでいきなりXMLが出てくるの。 逝ってよし 329はえらそうな事言ってる割には、知識乏しいみたいだね(w 実例挙げろ、とか根拠とかさ 結局おまえ何もわかってないだろ。 ASPとVBに訂正して欲しいか? >的外れな意見ばかりだね。もう少し日本語勉強して出直してきなさい ストレートに書かなきゃわからん奴は、 ´_ゝ`<<ひっこんでろ!!
つかな、Socketつかって書くにしても、listenしているポートを どうやって広告するんだよ。 固定か?/etc/serviceか?ロケータサービスか? いずれにしてもおめでてーな。
332 :
デフォルトの名無しさん :02/03/15 11:38
>>331 COMだってそこらへんはしょぼいじゃん(w
333 :
デフォルトの名無しさん :02/03/15 11:39
ちなみに俺は固定だけどね
たとえばWord.ApplicationをどうやってSocket化するのか、教えれ。 君の話を聞いていると、Inner-Networkなのばっかりやん。 COMのInner-Process, Inner-Machineな部分は無視ですか(w
XMLってファイル形式の一つという使われ方のほかに SOAPでやりとりするデータ形式という認識であってる? 結局ここで話しているのはsocket vs COMじゃなくSOAP vs COMなわけ? SOAPよく知らないから変なこと言ってたらすまん。
337 :
デフォルトの名無しさん :02/03/15 12:04
>>336 あってない。SOAPとCOMは関係ない。この文脈のXMLってのは単にアフォが
勘違いしてるだけ。
>>337 > XMLってファイル形式の一つという使われ方のほかに
> SOAPでやりとりするデータ形式という認識であってる?
↑これも間違い? これが間違い?
339 :
デフォルトの名無しさん :02/03/15 12:10
>338 XML InfoSetについて調べてみよう。SOAPは<>じゃないよ。
>>339 よくわからんが、分かった。XMLとSOAPについて調べる。ありがと。
341 :
デフォルトの名無しさん :02/03/15 14:34
>COMのInner-Process, Inner-Machineな部分は無視ですか(w
ごめん無視してた。
開発者側から見て、というつもりだったので
>>337 比喩がわからんおまえがアフォ
つーか、COMのリスクが分かってないのか?
>>341 おまえ、>327じゃねーの?どこが比ゆなんだ?比ゆってなんだかわかってないだろ?
343 :
DCOM使っている人いるの? :02/03/15 18:38
DCOMでリモートのオブジェクトユーザが死んだ場合って、 オブジェクトの参照カウントってどうなるんだ? ちゃんとIUnknown::Release()されるの? Releaseされないで放っておかれると、 オブジェクトユーザが死ぬたびにオブジェクトが 放置されるから、ちゃんとReleaseされるんだよね。(たぶん)
>>343 Releaseされる。DCOMは分散GC実装してるから。
345 :
デフォルトの名無しさん :02/03/15 21:29
>>344 たぶん、GCできるかどうかどうやって判断するんだ?
ってことだと思うが
>>346 嘘だろ?いくらマイクロソフトだからってそんなことは・・・
ICMPじゃないぞ、言っとくけど。
349 :
DCOM使っている人いるの? :02/03/15 22:12
>>344 Thanks!
そうそうおもいだした。
MSKBのQ171414にこれのメカニズムと停止方法が書いてある。
PINGを使って生存確認している。当然、誰がどのオブジェクトの
ポインタを持っているのか、AddRefしているかを管理しているわけだ(はずだ)
でオブジェクトユーザが異常死亡すると
その人がAddrefした分、Releaseされるわけだ。で合っているよね。
ということは
IConnectionPoint::Adviseしたオブジェクトが死んだ場合も
IConnectionPoint::Unadviseされるんだよね。
ほかにもIOleObject::AdviseやIDataObject::DAdviseもそうだよね。
それともAdviseしているオブジェクトのメソッドを呼んで
RPC_E_FAULTにでもなったら自分でUnadviseしなければならないの?
DCOMに限るけど COMPLEX PINGとか使って定期的にオブジェクト が生きているかどうか調べているんじゃなかったでしたけ? あと、Proxy/StubでAddRefやReleaseも最初と最後しかネットワークに 送信しない様に最適化してるって話も聞いた事がある。 システムでウマーくやってくれてるんじゃないでしょか?
最適化?なるほど。やっていそうだね。 QueryInterfaceの非効率さに気がついて、 MULTI_QI構造体を用意したくらいだから
IRemUnknown。
353 :
デフォルトの名無しさん :02/03/15 23:35
>>352 そうですね。そっちの方が詳しく書いてある。
で、Adviseの件はどうなんでしょう?
だれか教えてください。自動的にUnadviseされるなんてやっぱり甘い?
自動的でなければ、せめて、死んだことが死んだ時点か
それに近いタイミングで通知されるような仕組みがあると楽なんだけど。
354 :
デフォルトの名無しさん :02/03/16 00:56
COMアプリってメモリリークしまくるのが多いけどなんで?
355 :
デフォルトの名無しさん :02/03/16 00:57
MSが作ってるからでしょ?
どこが作ればメモリリークしませんか。
それはキャッシュです、とか言い張る?(w
358 :
デフォルトの名無しさん :02/03/16 01:10
なんつーか、VARIANTあたりの設計で、C++みたいな コンストラクタ/デストラクタ持ってる言語でも うまく破棄されない場合があった気がする。
359 :
John ◆0z.4Is5E :02/03/16 01:12
自分のバグを人のせいにすんな、見苦しい。
361 :
デフォルトの名無しさん :02/03/16 01:24
363 :
デフォルトの名無しさん :02/03/16 01:57
禿同、とかいってるやつは理解してないだけ。
364 :
デフォルトの名無しさん :02/03/16 02:42
365 :
デフォルトの名無しさん :02/03/16 07:47
実行時のエラーは起きる可能性はいつだってあるから、 バグとも言い切れない
>>365 確保できた資源が、解放時にエラーになる?
それはどのシステムのどんな資源でしょうか?
スマートポインターとスコープ 参照カウンター
369 :
デフォルトの名無しさん :02/03/16 20:57
COMは巨大なオープンソースプロジェクトであるMozillaに採用されているYO!
371 :
デフォルトの名無しさん :02/03/16 21:13
路線変更?
Mozilla使ってる奴はCOMに感謝するべき
LinuxやMac OSのMozilla使ってる奴は誰に感謝すべき?
>>373 Mozillaのソース見たことないのか...
375 :
デフォルトの名無しさん :02/03/16 22:01
ここは悲惨は373の居るスレってことで
禿同
379 :
デフォルトの名無しさん :02/03/19 13:09
>>349 Unadviseされるわけがない。
理由:Proxy/Stubがそこまで考慮していないから。
380 :
デフォルトの名無しさん :02/03/19 13:22
>で、Adviseの件はどうなんでしょう? >だれか教えてください。自動的にUnadviseされるなんてやっぱり甘い? カメレスで済まないけど、Adviceつーても、 単に内部で参照カウントとインターフェースのポインタ 持ってるだけだということを考えませう。 クライアントが落ちてもサーバーが落ちても、 DCOMがRelease( )してくれるのなら メモリリークはとりあえず発生しない。
ただし、 Unadviceはもちろんやってくれないので、 接続のはがれたインターフェースポインタがいつまでも居座ることにはなる。 DCOMがどんな風にRelease( )するかによるけど、安全性の観点から見て、 多分落ちることはないのではないかと思う。 (使うと常にエラーを返すようになると思うが) ほんとは、そのあたりでエラーを検出したらインターフェースを取り外すように Proxy/Stubを吐いてくれると無駄が無くていいのだけど。 そこまではしてくれていない。 VC++のウィザードが作るコードは、大雑把にはvectorでインターフェースを複数 保持して、それらをお構いなしにコールしているだけだと思った。 (エラーが返るからまあいいじゃねーか、という考えなのかな?)
382 :
デフォルトの名無しさん :02/03/19 14:00
メモリリークするかしないかは実装の仕方により。 ATLのIConnectionPointの実装だと(純粋なCOMというスレの趣旨だがサンプルということで) Adviseしたオブジェクトのシンクインタフェースへのポインタを固定長の配列で保持している。 だからUnadviseし忘れたオブジェクトがいくつもあってもそのうち、保持しきれなくなる。 あとからAdviseしてきてもCONNECT_E_CANNOTCONNECTと返すほか無くなる。 人によってはIConnectionPointの実装を可変長配列やリストで管理していたりする。 そうなるとおそらくヒープにとるので、Unadviseされないとメモリリークになる。 よくありがちなのが、クライアントが死んでものだからしょうがなく再起動するを繰り返したりする場面。 クライアントが異常終了から再起動するたびに、どんどんメモリリークするかAdvise可能な回数が減る。 DCOMをつかってサーバーから接続しているクライアントに一斉にイベントを投げるようなシステムは気をつけたほうがいい。 こんな状況でもAdviseを受け付けられるようにメモリリーク覚悟でヒープからとるか 固定長の配列で、あふれるようなら拒否するかどっちが良いか悪いかわからんが問題があることは確かだ。 (俺としてはAdvise可能な回数は制限したほうがいいと思うけど) というわけでイベント送出時にRPC_E_なんとかとなったら自分でUnadviseするのが無難だろ。 VBは自分でUnadviseなんかできないな。 VB屋さんが、DCOMで簡単にサーバークライアントシステムが組めるや、 ちょちょいのちょい。なんて調子で安易にDCOMを使って、 しまいにはどうしたらいいかわからなくなる。 これでもWindowsDNA(死語)の基幹テクノロジーなんだがね。
っていうかDCOMベースのシビアな環境でIConnectionPointなんか使うほうが間違い。
384 :
デフォルトの名無しさん :02/03/19 14:43
DCOMを使う=シビアな環境なのか。
385 :
デフォルトの名無しさん :02/03/19 15:16
>っていうかDCOMベースのシビアな環境でIConnectionPointなんか使うほうが間違い。 おいおい、リモート・ローカル等価性はどうなったんだ? IConnectionPointはリモートで使ってはいけないから リモートとローカルで等価ではないってことだな。 実はリモートに限らずローカルサーバーもやばいんじゃないか?ということで等価か。 とIConnectionPointひとつを重箱の隅を突くように取り上げて煽ってもしょうがないが 現実問題として、IConnectionPointに限らず、リモートオブジェクトから インタフェースを渡されるような場面は気をつけたほうがいい。 渡してきた相手がこそっり死んでいるようなこともあるんで。
>>382 VBはUnadviseを勝手にやってくれたりはしないのかな?
>>384 そうではない。ここで問題になっている程度の、それなりにそれなりが要求される環境で、
しかもDCOMを使っている場合ってこと。
>>385 Effective COM読んでね。
9. Avoid connection points
388 :
デフォルトの名無しさん :02/03/25 03:10
はげ
389 :
デフォルトの名無しさん :02/03/29 00:49
#別のところから流れてきました。 VCでCOMつくってVBScriptから使おうと思ったんですが、 VBScriptに2つ以上の返り値を戻す方法がわかりません。 つまるところ、 Set Hoge = CreateObject("Hoge.Hoge") Status = Hoge.Func(InVal, OutVal, OutVal2) IF OutVal = "aaa" And OutVal2 = "bbb" Then みたいな設計はできないんでしょうか?
>>389 できません。VBScriptの制限事項です。
>>390 どうも。
がっくし。SAFEARRAYとVARRANTつかって配列で受け渡しするしかないか・・・
392 :
デフォルトの名無しさん :02/03/29 22:51
COMでプロパティって設定しますよね。たとえば、 COM側(VC): [propget, id(10), helpstring("プロパティ RemoteHost")] HRESULT RemoteHost([out, retval] BSTR *pVal); [propput, id(10), helpstring("プロパティ RemoteHost")] HRESULT RemoteHost([in] BSTR newVal); クライアント側(VBscript): Hoge.RemoteHost = "myhost" みたいな。 でこの場合、getやputでエラーとなった場合の処理ってどう実装すればいいんでしょうか? とくにputの場合エラーとなってもクライアントは判定できないです。
なんの為にHRESULT返してるんだ。
スクリプト側でエラーを検出したいって事だろ
クライアントか。すまん。 VBSならON ERRORで処理するんちゃうんか? それともVBSはput時のエラーは無視する仕様なの?
えっと、初歩的な質問かもしれませんが・・・。 VBからオートメーションでExcelを操作するのに、事前バインドと実行時バインドでどのくらい レスポンス差があるのか気になって、 (1) 事前バインドで Dim .... As New Excel.Application (2) 事前バインドで Dim .... As Excel.Application → Set .... = New ... でインスタンシング (3) 事前バインドで Dim .... As Excel.Application → Set .... = CreateObject ... でインスタンシング (4) Dim .... As Object → Set .... = CreateObject ... で実行時バインド の4通りを比較してみたところ、(4)が一番速いという、予想外(常識はずれ)の結果となってしまい ました。(ベンチマークの内容は、DAOのRecordsetをExcelに出力する、というもの) COMの解説書には、事前バインドの方が高速と書いてありますが、どうして期待した結果にならないの でしょうか? ちなみに、インプロセスサーバを参照してコンパイルしたEXEを該当するコンポーネントがレジスト されていない端末で起動するとプロセスが起動せずにクラッシュしますが、上記(1)〜(3)のEXEを Excelがインストールされていない端末で起動しても、エラーにならずに正常に起動してしまいます。(無論、オートメーション機能は動きませんが) インプロセスコンポーネントと、アウトプロセスコンポーネントでは、バインドの仕組みが違うの でしょうか? ご存知の方、コメントお願いします。m(_ _)m
>>396 環境は、VB6.0 SP5 + Excel8.0 SR-2 です。
Windows 98 / NT4.0 ws SP6
のどちらでも、
> (4) Dim .... As Object → Set .... = CreateObject ... で実行時バインド
が最速でした。
速いというのが具体的に何の時間を測ったのか書け。
>>398 ソースが現在手元に残ってないのでアレですが、50000件のレコード(DAO.Recordset)を
セルに出力する時間を計測しました。
インスタンス化 → Nothing までの時間です。
無論、現実的には、二次元配列を使うなり、CopyFromRecordsetメソッドを使えば一発の
処理なのですが、メソッドやプロパティの参照回数を増やさないと明確な差が検出でき
ない?と考えたので、1件ずつループしてます。
>>399 ケース毎にプログラム終了した?
exeにコンパイルして試した?
ケース毎にマシン再起動した?
おおよそ (総時間) = (一件当たりの時間) * (件数) + (定数) になるから 件数を変化させたときの時間の変化を見れば、 もう少し分かったと思うんだがなあ・・・ ソースコードがないんじゃあもう無理か。 ちなみにそれぞれの時間を覚えてない?
>>400 当然、IDEではなく、EXEでテストしてますし、プログラムも1回毎に立ち上げ
直しました。マシンのリブートまではしてませんが。(やるべきでした?)
それと、レスポンスの計測にTimer関数を使用したので、測定誤差はあるかも
しれません。でも、誤差が出るのは、(1)〜(4)までおなじ条件なので、(4)に
だけ有利に働くなんてことはないですよね?
>>401 ソースがないのは、今、実家に帰ってるから(^-^;で、自分とこのマシンにはちゃんと
あります。(件数をもう少し増やせば、というのはちらっと思いました)
ちなみに、このベンチマークをやったのは、昨年の9月頃です。
実行時バインドの方が高速だなんて、気でも違ったかと思われそうで、技術系のMLやBBS
に上げるのを躊躇してました・・・。
>>399 >ちなみに、インプロセスサーバを参照してコンパイルしたEXEを該当するコンポーネントがレジスト
>されていない端末で起動するとプロセスが起動せずにクラッシュしますが、上記(1)〜(3)のEXEを
CreateObjectでコケてるんですな。
>Excelがインストールされていない端末で起動しても、エラーにならずに正常に起動してしまいます。(無論、オートメーション機能は動きませんが)
こっちは、めそっど、ぷろぱてぃの情報がコンパイル時に解決されますね。
ソースあるんなら試せるね。よかった。
厳密に言うなら、ディスクキャッシュなどの影響をなくすために、
同じテストを3回以上繰り返すべき。(1なら1を3回実行する)
これで生の処理時間に近づけるはず。
あと、プロパティやメソッドの実行レスポンスを調べたいのであれば、
計測開始時刻と計測終了時刻 を ループ開始直前とループ終了直後 に
置いたほうがいいね。
4にだけ有利に働く可能性としては
a:単に最後に実行して、全部のデータがディスクキャッシュに乗っていた
b:4のみ
>>401 のいう定数部分が小さい(あるいは1〜3は定数部分が大きい)
などがあると思う。
ベンチマーク(理科でいうところの対照実験)の基本なので、
このへんを押えてないと厨房扱いされちゃうよ。
>>396 エクセルを操作するのでアウトプロセスでしかもDispatchインターフェイスのみ
でしょう。
どの方法でも測定誤差程度しか違わないのではないでしょうか。
>>405 ありがとうございます。
> b:4のみ
>>401 のいう定数部分が小さい(あるいは1〜3は定数部分が大きい)
> などがあると思う。
その可能性はありそうですが、Excelの場合、行数に65536という制限があるので、
ベンチマーク方法をもう少し工夫した方がいいのかもしれません。
私的に気になっているのは、メモリ上の操作ではなく、ファイル出力の
レスポンステストなので、複数回実行すると環境が汚れることによる影響
があるんじゃないかと・・・?
>>406 ありがとうございます。
> エクセルを操作するのでアウトプロセスでしかもDispatchインターフェイスのみ
> でしょう。
インプロセスとアウトプロセスではバインド方法が違う、という理解でよろしいの
でしょうか?
使っている言語がVBオンリーな上、COMのメカニズムもあまり理解していないので、
このスレの話題についてくのはしんどいです・・・。(T_T)
よそのプロセスのCOMインターフェースにアクセスする方法はありませんか?
ちなみに、取得できる情報は、 対象のプロセスとインターフェースの型と、インターフェースへのポインタだけです。 CoCreateInstance()などで取得できるものではありません。
それから、できれば、ウインドウをフックしてcallするのは最後の手段にしたいです。
もうちょっと勉強してから出直せ。
COM関係のスレ2つとも職人さんたち対象なので、 お勉強レベルのスレがあってもいいかもね
>>412 1 そんなことできるわけねーだろ、ボケ
2 そんな簡単に実現できること、自分で調べろ ゴルァ
なのか、どっちなんでしょう?
それだけでもよろしくお願いします。
通常ポインタがプロセスを超えられないことは知ってます。 ただ、スタックトレースを見ると、たとえばドラッグ&ドロップなんかは rpcrt4.dllなどを介してcallされているし、何か抜け道なりがあるのかもしれないと思って聞きました。 ちなみに、フックをかけてcallをする方法は試してみたところ成功しました。
>415 だから、マーシャリング、プロキシ/スタブ、スレッドモデルなんかに ついてもっと勉強しろや。 他のプロセスにあるinProc COMサーバを(その、「ほかの プロセス」を実行主体として)呼ぶのは、フックでもしないと無理。 そうでないなら、普通にCreateProcessから呼び出せば、 あとはole関連ライブラリが善処してくれる。
>>408 バインド方法とサーバのプロセス形態は直接は関係ないですよ。
バインド方法はVBのソースで型名でオブジェクトを扱うのか、
Objectで扱うのかの違いでしょ。
一般的にVBでいうところのバインドは、
参照を追加して型名で操作 == アーリーバインド
開発時に型情報等を解析する
サーバへのバージョン依存性は高くなるが
開発時にエラーチェックできる
またパフォーマンスはよい
object型で操作 == レイトバインド
実行時に型情報等を解析する
サーバへのバージョン依存性は低くなるが
実行時エラーになる可能性もある
またパフォーマンスはさがる
という事で
>>396 でなぜレイトバインドが一番速かったのか
と疑問に思っているのではないでしょうか。
#ちなみにnewとCreateObjectはオブジェクトを作るときのみ
#違いがあるので受けた後の型しだいで上記と同じ。
バインド方法で著しくパフォーマンスがかわるのは
dualインターフェイスのインプロセスサーバを扱った
ときでしょう。アーリーバインドで開発時にIUnknown側の
メンバーを扱う様にコードが吐かれるのか、レイトバインド
で実行時にDispatchのInvoke経由でメンバーを扱うのかという。
たとえdualインターフェイスでもアパートメントに互換性が
あるインプロセスサーバ以外は直接サーバとは対話していない
ので注意が必要です。
しかし
>>396 で検証した結果レイトバインドが速いというので
あれば、仮説ですがVBがDispatchのみのエクセルに対して
アーリーバインドするとエクセルを扱う仮想のエクセルオブジェクト
を作成しているとか、使用しないメンバー情報等も全て
取得してまうとか...そのぐらいでしょか。
結局エクセルを扱うときDispatchでInvokeするしかないわけだから
アーリーバインドする事でどのぐらいパフォーマンスに差がある
かといわれると「誤差ぐらい」と思われますが。
>>417 丁寧なコメント、ありがとうございます。m(_ _)m
残念ながら、私は勉強不足のようです。(VBユーザーは、COMを「使う」ことはあっても、
内部の仕組みは必ずしもしらなくても足りてしまう場合が多いので)
このスレの話題について行けるよう、いろいろ研究してみます。
ソフトウェアの動作原理や(隠蔽された)内部のふるまいに興味が大いにありますので。
Inside COM+ や Inside OLE ぐらいは読んどいたら?
それは後者だね。ちなみに私は 177 のレスを読んで 速攻買いに行きました。ここまで高い本買ったのは初めてだったが かなり勉強になるよ。入手出来なければ大きめの図書館で借りたりとかね。 家の近郊の図書館にはInside OLEはあった。まあ購入後知ったことだから どうでもいいんだけどね。常に手元に無いと落ち着かないって言うのもあるし 損した気分にはならなかったね。今の学生さんならお金持ってるだろうし そんなに負担ではないのでは?(いいかげんな推測ですが)
>>421 いちおう、ええ歳こいた社会人(0x20代)なので(にしては、厨房質問ですが(^-^;;;)、
本くらいは買えます。
「Inside COM+」ですね。
ありがとうございました。m(_ _)m
InsideOLEは駒場東大前の駅前の書店に野ざらしにされてボロボロの状態で、定価で売ってる。 俺が立ち読みしてるので、絶対に買うな。お長居します。
>>423 現在、東京在住ではない(地方に飛ばされました(T_T)ので、買えません・・・。
425 :
デフォルトの名無しさん :02/04/02 18:28
誰か俺にIMonikerをやさしく解説してください。 このインタフェース訳わからんです。 どう実装していいのかどう使っていいのか 何のためにいるのか、さぱーりわかりません。 ちなみにInsideOLE読みました。でもわかりません。
IMonikerはIClintonを陥れたりするために使います。
IMoniker に I はない。あるのは、ただ欲だけ(:´Д`)
うまいなぁ。
429 :
デフォルトの名無しさん :02/04/02 23:31
COM+ってこれからどうなるの? 良く分からないは、レジストリから切り離されるって噂。 それと、64bitVBが出ないんなら、64bitCOM+が出ないって事?
430 :
デフォルトの名無しさん :02/04/03 01:03
MFCをかじった程度の初心者です。教えてください ・COMってなんですか?入門ページありますか? ・COMって今後はどうですか?
431 :
デフォルトの名無しさん :02/04/03 01:24
432 :
デフォルトの名無しさん :02/04/03 11:12
タイプイライブラリを#importを使わずにC言語で 読み込む方法を教えて下さい。(VC6またはBCC)
ITypeLib や ITypeInfo とか使えば? そういうことじゃなくて?
VBScript エンジンと JScript エンジンではアーキテクチャという観点から どのようなメリット、デメリットがありますか? たとえば文字列において VBScript では BSTR、 JScript ではオブジェクト、 実行速度などで差が出てくるものなのでしょうか?
>>433 >ITypeLib や ITypeInfo
多分それです。知りませんでした。
これもQueryInterfaceやGetIDsOfNamesで取ってこれるんでしょうか。
QueryInterface(IID_ITypeInfo, &pTypeInfo)だろ。多分。
ITypeLib ITypeInfo で検索しても日本のサイトはほとんど引っかかりませんね。 本の索引とかばっかりで。 タイプライブラリの参照で参考になりそうなWebサイトがありましたら 紹介してください。
s/233/432/
...
>432 私の場合、ほとんどの情報や技術は MSDN ライブラリと 専門書から学びました。まあ専門書は高いですし、簡単に 買えとは言えませんが、MSDN ライブラリはお持ちでないの? 持って無くても以下のサイトで見ることが出来ます。 msdn.microsoft.com/library/ ここで次のように階層を辿って下さい。 Component Development Automation SDK Documentation Automation Type Description Interfaes あと厳しいようですが英語が読めないというのは論外です。 専門技術を身につけるには英語力は必須ですからね。
442 :
デフォルトの名無しさん :02/04/04 21:18
ひょっとして、ASPからはCOMを使ってもレジストリの中身は見れないんですか? 実行ユーザの権限が低いから
>>442 NT,W2K,XPだとレジストリにもセキュリティ属性というものがあるんよ。
444 :
デフォルトの名無しさん :02/04/05 18:15
>>443 やっぱりそうですか・・・
IISの匿名アクセスユーザをAdministratorとかに設定させるしかないのかな?
Usersで十分。Readがあればいいんでしょ。
446 :
デフォルトの名無しさん :02/04/05 18:39
>>445 とおもってUsersのユーザにしたけどだめでした。
そしてなぜかAdministratorsにしてもだめでした。
コンピュータの管理者(XPなので・・・)にしてみたらできました。
へんですね。コンピュータの管理者も所詮所属グループがAdministatorsになってる
だけなのに・・・
iisresetしてやりなおし。
448 :
デフォルトの名無しさん :02/04/05 19:01
>>447 ありゃ?できました。
IIS画面で停止->COM+のIIS????をシャットダウン->IIS画面で起動
までやったんで大丈夫かと思ってたのに。
iisresetってさらに何かやってんですね。どうやら。
・・・けどやっぱりUsersだけだとだめでした。たぶん自分の見に行ってるレジストリの
権限が高いんですね。きっと。
449 :
デフォルトの名無しさん :02/04/06 17:50
COMにしたDLLに、自分自身がインストールされているパスを返す関数を 組み込みたいのですが、うまい方法がわかりません。 Dllの仕組みの中にそういう機能ってありませんでしたっけ?
GetModuleFileNameをつかえばいいのでわ?
>>450 なにか期待と違う結果が・・・
C:\WINDOWS\System32\dllhost.exe
dllを呼び出した側のモジュール名が出てきました。?
>>451 DllMainで渡されるHINSTANCEを保存しておいて、それにGetModuleFileName()
>>452 ありゃ?だめだ。というかdllhost.exeってただしいっちゃ正しいんだけどね。
dllhost.exeってCOM+だけの話かとおもってました。
GetDllFileNameとかあればよかったんだけど。
HINSTANCE g_hInstance;
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
g_hInstance = hInstance;
}
--
extern HINSTANCE g_hInstance;
hoge()
{
TCHAR fileName[_MAX_PATH];
::GetModuleFileName(g_hInstance, fileName, sizeof(fileName));
}
失礼。できてました。(iisが前のをにぎりっぱなしでした)
昔ポプCOMっていう小学館からでてた雑誌あったなー 関係ないけど好きだった
456 :
デフォルトの名無しさん :02/04/14 17:50
VC++でreturn E_FAILをし、それをVBScript(ASP)で受けたいのですが、なぜか受け取れません。 エラー タイプ (0x80004005) エラーを特定できません とは出るので、以下のように受けようとしても、Err.Numberは0のままなんです。 On Error Resume Next MyCom.Hoge() Response.Write("Error# " & Hex(Err.Number) & "<BR>") Response.Write("Generated by: " & Err.Source & "<BR>") Response.Write("Description: " & Err.Description & "<BR>") On Errorじゃ受けられないんでしょうか?
457 :
デフォルトの名無しさん :02/04/14 19:02
>>456 自己レス
しまった。受ける場所を間違え・・・
しかし今度はE_FAILしかかえってこんな・・・
458 :
デフォルトの名無しさん :02/04/19 01:02
QueryInterface が失敗するのはどういう時ですか? 多分ちゃんと登録されているオブジェクトのはずなのですが、 確かめる方法からわかりません。
そのインターフェースがインプリメントされていないとき。
461 :
デフォルトの名無しさん :02/04/19 09:53
>>456 ISupportErrorInfoとか調べてみてちょ
462 :
デフォルトの名無しさん :02/04/19 10:52
COMって.NETが普及すれば無くなるんじゃないの? .NETからみたら過去の技術扱いでラッパーしかないですね。
463 :
デフォルトの名無しさん :02/04/20 18:10
どなたか! IBindEventHandler インターフェースの の、使い方(というか使われ方)を知ってる人いませんか? 解説書の書籍名でも結構です。情報をお待ちしております。
464 :
デフォルトの名無しさん :02/04/20 21:18
COMってVBのために作られたらしい
465 :
デフォルトの名無しさん :02/04/20 23:40
.NETランタイムが普及するまではCOMの天下
自己解決しました。 簡単にレポートすると、WSHなんかに公開するオートメーションオブジェクトで、 IBindEventHandlerを使えばIConnectionPointとかを使わずに動的に イベントハンドラを指定させたりできるというものでした。 どっかにドキュメント用意しとけよ!>M$
468 :
デフォルトの名無しさん :02/04/21 00:17
COMを今から勉強しても無駄なんですか?
無駄の定義による。 windowsの既存のコンポーネントをガリガリ使うなら基礎知識として 知っておいたほうがいいかも。選択肢がいろいろ広がる。 まあこれからは.NETから使えるようになるだろうから、そこまでの プライオリティがあるとは思えんがね。
470 :
デフォルトの名無しさん :02/04/21 23:51
>>464 COMが最初に登場したのはOLE2ではなかったか?
インプレースアクティベーションを実現したかったから。
そのためにOLE WindowやData Objectがでてきて
COMというアイデアがでてきたと俺は解釈していた。(DDEはもう限界だ)
この流れにVBの話は1つもなしで、
今VBで自由に扱えるディスパッチインタフェースは
後になっての話でVB3で初めて使えるようになった。
さらに後になってインプレースアクティベートが発展して
OLEコントロールというしくみに発展する。
間違っていたらすまん。
471 :
デフォルトの名無しさん :02/04/22 00:10
だれかプロパティとメソッドの違いを教えてくれ
違わない。プロパティはメソッド。
>>472 「プロパティ⇒メソッド」は成り立つが「メソッド⇒プロパティ」は成り立たんだろ。
まったく同じみたいな書き方するなって。
>>473 472は「プロパティはメソッド」と書いてあるだけで「メソッドはプロパティ」とは
書いてませんが。
475 :
デフォルトの名無しさん :02/04/22 18:16
ITypeInfo::GetFuncDesc(unsigned int index, FUNCDESC** ppFuncDesc)で (*ppFuncDesc) ->invkindが、 INVOKE_PROPERTYGETかINVOKE_PROPERTYPUTかINVOKE_PROPERTYPUTREFなら そのファンクションはプロパティ。 INVOKE_FUNCなら、そのファンクションはメソッド。 OK?
>違わない。 と書いてますが。
477 :
デフォルトの名無しさん :02/04/22 22:17
>>475 ITypeInfoって、どうやって取得するの?
>>477 IDispatch::GetTypeinfoあたりからどうぞ。
結局、プロパティとメソッドはともに(必ずしもとは言えないけどたいていは)
IDispatchからInvokeできる関数ディスクリプタ。
その関数ディスクリプタがPROPGETやPROPPUT, PROPPUTREFとマークされているものを
とりあえず、プロパティと呼ぶ。とりあえずというのはオブジェクトが
プロパティと主張しているだけでコントローラがプロパティとして扱うかは
別だから。でも扱わないケースを見たこと無いけどね。
関数ディスクリプタがFUNC(やMETHOD)とマークされていればそれはメソッドとして
扱ってくれということ。プロパティと同じでオブジェクトの心、コントローラ知らず。
あと異なる点は、同じ関数ディスクリプタを異なる種類(Invoke Kindというらしい)
で呼び出すことができるという点。同じ関数ディスクリプタに対してPUTとGETができる。
(PUTREFなんてのもあるけどおいておいて)
たいていはPUTしたものはそのままGETできるし、PUTによってオブジェクトの状態(色とか)が変わったりする。
場合によってはオブジェクト自身がプロパティを勝手に変更したりするが
この場合はIPropertyNotifyでコントローラに通知したりすることができる。(うる覚え)
必ずしもPUT, GET両方ともサポートする必要は無し。どっちか片方なんてのはザラ。
読み取り専用プロパティなんていうのは、GETのみね。
今日のところはこの辺でカンベン。
眠くてなに言っているのか自分でもよくわかんなくなった。
おやすみ、またあとで。
479 :
デフォルトの名無しさん :02/04/23 02:07
結局 COM インターフェイスのメソッドとスクリプト言語等のメソッドを 同義に捉えてはいけないんだよね。それがいつも混乱の元になる。 472〜474のやり取りではそれが浮き彫りになってるね。 ひとつ気になったのはプロパティとメソッドの違いを問う人が、いきなり 475氏の説明を読んで理解できんのかな?って思う。「ありがとう」って 書いているし、要らぬお世話かな...。
481 :
477=479 :02/04/23 09:34
>>480 >>ITypeInfoって、どうやって取得するの?
>IDispatch::GetTypeinfoあたりからどうぞ。
これに対しての「ありがとう」です。
後半はよくわかりませんでした。
わからないと言えば他にも。
各メソッド/プロパティで設定したり取得したVARIANT型の変数の
開放は誰が行うべきなのか?とか。
getで得たものは自分で開放すべきなのはなんとなくわかりますが・・
COMの基本がなってないねー。[in][out]によって誰が解放すべきかは決まっているのだよ。
483 :
デフォルトの名無しさん :02/04/23 17:34
あ〜、夕べ眠くて、自分でも何かいているのかわけわかんねぇ。 平たく言えば、オブジェクトがそれをプロパティと言えばプロパティ。 メソッドといえばメソッド。 プロパティは同じ関数をGET/PUTと違う種別で呼び出せる。 メソッドの呼び出す種別は一種類だけ。 ということです。眠くなくても何言っているのかわからんね。 >各メソッド/プロパティで設定したり取得したVARIANT型の変数の >開放は誰が行うべきなのか?とか。 >getで得たものは自分で開放すべきなのはなんとなくわかりますが・・ 質問の意図はおそらく、VARIANTそのものの開放ではなく BSTR* VARIANT::pbstrValのようにポインタの先に値の実体が あるようなVARTYPEで、そのポインタの先の領域はだれが開放するのか ということだろう。getでもらうにしても、あらかじめ VARIANT構造体を渡してそこに入れてもらうしかないし。 パラメータの受け渡しにかぎらず VARIANTについては以下のような単純なルールを守っていれば問題ないかと。 1.VARIANT構造体の実体を宣言したら、それに対してVariantInit()すること。 例:VARIANT var; VariantInit(&var); 2.VARIANTに値を入れる場合は、前もってVariantClear()しておくこと。 VariantClearはVariantのvtにあわせて、中身の開放も行ってくれる。 例:VariantClear(&var); var.vt = VT_I4; var.lVal = 2222; VariantCopy()を使う場合はコピー先にVariantClearが行われるので不要。 3.VARIANT構造体の実体を消す(あるいはauto変数で自動的に消えそうな)場合は 前もってVariantClear()しておく。でないとリークする。 最終的に開放の責任を負っているのはそのVARIANT型の変数を割り当てた人。(ルール3) VARIANT型の割り当てだよ、pbstrのようなVARIANTの中身の割り当てでは無いよ。 もらった側に最終的な開放の「義務」はない。 ただ、Byref渡しがあるので開放してはいけないということではない。(ルール2) もらったVARIANTの中身を別の値、はては別のvtにする場合もあるので その場合は中身を開放する必要があるんで。 渡す場合でも渡される場合でも、このルールに従えばいいと思う。 長くてすまん。間違っていたらすまん。だれかフォローしてくれ。
>プロパティは同じ関数をGET/PUTと違う種別で呼び出せる。 言いかえるならば「同じ関数名」ですね。get_、put_ が呼び出している 関数は異なる関数です。 VARIANTについては 「初期化する前のVARIANTにVariantClear()を行ってはならない」 VariantClear() は渡されたVARIANTを意味のあるものとして解釈するため、 初期化前のでたらめなデータが入っているVARIANTに対して使うと 無意味な参照を開放しようとしたり何が起こるかわからない! (VARTYPEの解釈次第) 「クリアされていないVARIANTにVariantInit() を行ってはならない」 VariantInit() は渡されたVARIANTを意味の無いものとして解釈するため BSTR やオブジェクト等のデータを保持しているVARIANTに対して使うと これらは開放されること無くメモリに残り続けることになる。 って具合ですかね。当たり前のことですけど。
メソッドやプロパティの戻り値で 他のオブジェクトのインターフェースを返すとき どうやって宣言してますか? 自分としては、IFooとかを返したほうが良いような気がするのですが、 いろんなサンプルでは、ほとんどIDispatchとかVARIANTで返してるので、 なんでだろう?と思いました。
483で、名前欄書き忘れた475です。
>>484 フォローサンキューです。なのでフォロー返しです。
弁明すると、1つの関数 = 1つのDISPIDに対してという意味でして、、
get_, put_で関数が分かれているのはデュアルインタフェースで
組まれているインタフェースのケースですね。
(というか、今時IDispatchを実装するのにデュアルが普通でしょ?)
この場合はvtblの要素がget_, put_で二つに分かれているので
関数が二つ必要ということです。(当たり前のなりゆきですが)
名前が、プロパティhogeに対してget_hogeとput_hogeになるのは
midlがそういうヘッダファイルを生成するから。
>「初期化する前のVARIANTにVariantClear()を行ってはならない」
それ以前にVariantInit()されていないVARIANTはVARIANTで無い
ということでしょう。当然他のVariantXxxx()にも
VariantInitされていないVARIANTを渡してはいけない。
>>485 メソッドやプロパティという単語が出てきているから
IDispatch経由ということでいいでしょうか?
それなら、IFooのようなオリジナルインタフェースは
引数に指定できないから。
渡すにせよ、もらうにせよ
パラメータに指定できるインターフェースは
(VARIANTの中身を含めて)IDispatchかIUnknownしかない。
なので、IDispatchかIUnknownを受け取った側でQueryInterfaceして
本当にIFooかを確認すればいいかと。
ところでスレの趣旨からしてrawなCOMの場合の話でいいんだよね?
488 :
デフォルトの名無しさん :02/04/24 18:00
「rawなCOM」ってなんでしょうか? unixでいうraw/cockedの関係?
いんや、補助ライブラリ使用しないって事では。
>「rawなCOM」ってなんでしょうか?
すんません。説明不足です。
IDispatchの話にはVB辺りを絡めて考えている人もいると思い、
「VBでのCOMではなく、
>>1 に従って、生(raw)のCOMでいいんですよね?」
ということです。
491 :
デフォルトの名無しさん :02/04/25 00:06
IDispatchってVBのために作られたような気がせんでもないがなー late binding以外にIDispatchの利点てありますか?
近頃はVBよりもJSやVBSの為ですかね。 IDispatchExとか言ってみるテスト。
私もCOM(というかOLE2)を勉強し始めたときに 「IDispatchってなんで必要なんだろう?」 と疑問におもっていた。で、俺流の解釈は 1. インタプリターだとこういうほうが扱いやすいのか と自分を納得させていましたが、 いまや、VBでさえ、IDispatchなんて関係なく カスタムインタフェースを呼べる、実装できる。 (oleautomationの制限はあるけど) 2.中間コードも作らない純粋なインタープリターだと カスタムインタフェースを「呼び出す」のはなんとかできても カスタムインタフェースを「実装」するには難しいと思う。 あらかじめ、全メソッドがわかっていないとvtblを作ることができないので。 その点、IDispatchは、メソッド名を問われた時点で考えれば いいからやりやすい。 VBは開発環境で実行してもこっそりコンパイルしてコードを作って 動かしているような感じがするので、純粋ともいえないと思う。 3.「何にも考えなくてもマーシャリングできる」 (でもlongにポインタなんか入れたらダメだけど) とも思いつつも、 カスタムインタフェースでも ほぼ、自動的にマーシャラを用意できる。 結局、利点は2かな?
何を理由かこつけてんの?IDispatchはVBのためにVBチームが作った インターフェイス。以上。VBがIUnknownを扱えるようになったのは ずっと後の話。
>492 確かに。 VBScript の Class ステートメントの定義から作られる オブジェクトなんかは内部的には IDispatchEx 経由で アクセスするからね。正直このステートメントの実装を 可能にするために IDispatchEx は出来たんだろうね。 (いやまあ、推測だけど...。)
>>494 おそらく私宛だと解釈して
>何を理由かこつけてんの?
いや、理由をかこつけているのではなく
IDispatchを使う利点をかこつけているのですが。
>IDispatchはVBのためにVBチームが作ったインターフェイス。
そうですか。うすうすは感じていましたが。知りませんでした。
>VBがIUnknownを扱えるようになったのはずっと後の話。
「いまや、VBでさえ、IDispatchなんて関係なく
カスタムインタフェースを呼べる、実装できる。」
の「いまや」でその辺を示していたんですが。
あまりハッキリして言っていませんでしたね。すみません。
私の記憶では、VBでのCOMサポートはVersion3で
IDispatchドライバになることができた。
Version4でIDispatchオブジェクトになれて
Version5で制限ながらIUnknownオブジェクトになれる。
でしたっけ? 実はVB3って使ったことないんですが
OLE2 SDKについていたDISPTESTとかいう
テスト用のオートメーションドライバが
VB3のサブセットということを聞いたことがあるので。
497 :
デフォルトの名無しさん :02/05/06 00:10
VCスレに逝くべきかもしれませんが、COM特有なのでここで質問。 #define _WIN32_WINNT 0x0400 #define WINVER 0x400 #include <windows.h> #include <tchar.h> #include <comdef.h> #include <objbase.h> #undef DialogBoxW #pragma comment ( lib, "Rpcrt4.lib" ) #import "xl5jp32.olb" \ rename("DialogBox", "DialogBoxForExcel") \ rename( "RGB", "RGBForExcel") int foo() { CoInitializeEx(0, COINIT_MULTITHREADED); Excel::_Application *pRawExcel = NULL; VC6で上のコードをビルドすると、Excel::_Application の行で C:\proj\src\libexcel\libexcel.cpp(18) : error C2039: '_Application' : 'Excel' のメンバではありません。 C:\proj\src\libexcel\libexcel.cpp(18) : error C2065: '_Application' : 定義されていない識別子です。 なかんじのエラーが出てしまいますが、何がまずいんでしょうか? C++からexcelのセルがいじれてマクロが呼べればどのようなやり方でもいいんですけど、 そのへんから拾ってきたコードも、MSDNのサンプルもろくにビルドできずに困ってます。
ちなみに、excel9.olbをインポートすると、かわりに c:\proj\src\libexcel\debug\excel9.tlh(1194) : error C2504: '_IMsoDispObj' : 定義されていない基本クラスが宣言されています。 みたいなエラーがたくさん出てきます。 はひゅー
499 :
デフォルトの名無しさん :02/05/06 04:55
>>497 CoInitializeEx(0, COINIT_MULTITHREADED);
Excel::_ApplicationPtr pRawExcel( __uuidof( Excel::Application ) );
これでいかないか?
タイプライブラリをインポートすると、生のインターフェイスの代わりに
スマートポインタ版インターフェイスが定義されるはず。
_com_ptr_t<>ってやつ。インターフェイス名にPtrと付く事に注意。
スマートポインタなんで普通NULLは入れないな。
500 :
デフォルトの名無しさん :02/05/06 05:12
純粋にC++だけやってるからか オートメーションやアクテブXの存在理由がイマイチわからん。 使うこともないし。何の意味があるのこれ? C++を使う上で、無意味ともとれる決まりごとが多くてかなわん。 VBとかで使う為に必要なんですよとかそんなの理由になるのか? .NETの本にCOMが難しいのは、本来OSが受け持つサービスを 自前で用意しなければならないからだとか書いてあったが正しくその通り。
>>500 > VBとかで使う為に必要なんですよ
.NETもそういう決まりごとでがんじがらめになってるけど、
コードを書く側にとって見えなくなってる。それがCOMとの違い。
COMは負担が大きすぎた。
>>499 ありがとーん
あの後、MS09.olbとかVB6EXT.olbとかいること発見したんで、EXCEL9.olbを
使うように戻しました。
#import "C:\Program Files\Microsoft Office\Office\MSO9.DLL" \
rename("DocumentProperties", "DocumentPropertiesXL")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "C:\Program Files\Microsoft Office\Office\EXCEL9.OLB" \
rename("DialogBox", "DialogBoxXL") \
rename("RGB", "RBGXL") \
rename("DocumentProperties", \
"DocumentPropertiesXL") \
no_dual_interfaces \
exclude("IFont","IPicture")
int foo()
{
CoInitializeEx(0, COINIT_MULTITHREADED);
Excel::_ApplicationPtr pRawExcel( __uuidof( Excel::Application ) );
pRawExcel->Quit();
return 0;
}
でもやぱーり、
c:\proj\src\libexcel\debug\excel9.tli(3731) : error C2511: 'PutOnDoubleClick' : オーバーロードされたメンバ関数が '<Unknown>' にありません。
なんてのが出てきてお手上げ状態です。
web上にも完全なコードやOLB間の依存関係の情報があまりないところを見ると、
#importではみんなうまくいかなくてあきらめちゃってるんじゃないかと思う次第であります。
>>502 折れも試しに作ってみたが、一応コンパイルは通ったよ。
動くかどうかは試してないけど。
普通にATL COM AppWizard でexeサーバー作ってる。
// Test.cpp : CTest のインプリメンテーション
#include "stdafx.h"
#include "EXCEL9_TEST.h"
#include "Test.h"
#import "E:\Program Files\Microsoft Office\Office\MSO9.DLL"
#import "E:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "E:\Program Files\Microsoft Office\Office\EXCEL9.OLB" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL")
/////////////////////////////////////////////////////////////////////////////
// CTest
STDMETHODIMP CTest::a()
{
CoInitializeEx(0, COINIT_MULTITHREADED);
Excel::_ApplicationPtr pRawExcel( __uuidof( Excel::Application ) );
pRawExcel->Quit();
::CoUninitialize();
return S_OK;
}
>>503 ウワーン
#includeを付けたりはずしたらりしてたらビルドできるようになったよー
手順はこうです
>>497 をふつうのWin32 Console exeで作成
↓
いろいろいじるがパーイ
↓
2chに泣きつく
↓
>>503 を読んで、ATL COM AppWizardでexeサーバを作ってコンパイル
↓
Σ(゚д゚lll)ガーン動くよ
↓
#includeしてるヘッダが関係してるかと思って
>>497 に#include <atlcom.h>とか
#define STRICTとかいれてみる
↓
Σ(゚д゚lll)ガーンコンパイル通るよ
↓
元の
>>497 に戻してビルド
↓
Σ(゚д゚lll)ガーンコンパイル通るよ
という次第です。
コンパイラが作成する tlhとかが壊れてたのかなーと思ってみたりして。
というわけで野望に向けてようやく一歩前進です。 ところで、excel 97/98/2000/2002を同じようにC++側から操作したい場合、 ソースは一個で何とかなるんでしょうか? それぞれのofficeのバージョンごとにolbとか取り込まなきゃいかんのでしょうか?
>>505 折れはアマゲープログラマなんで
EXCELのことは全然わからんのですよ。( ´Д⊂
ただやっぱ、COMなんだから
EXCEL97〜EXCEL2002が
同じCLSIDを持つコーポネントを利用しているのなら
最新のOLD1つを対象に組むだけで良いんのではないかな?
互換性に関しては __uuidof( Excel::Application ) のところがポイントですかね。 Excel97で持っているUUIDを渡すべきかな? 場つなぎ的なサンプルしかないのでこれも試行錯誤するしかないですね。
バージョンなしのProgIDを使えばいい。 が、97〜2002で全く挙動が一緒だという保証はないと思うが。
"Excel.Application.9" みたいなのがバージョン付きで "Excel.Application" みたいなのがバージョンなしのProgIDなんでしょうか。 やりたいことはセルの値の取得と設定、マクロの起動くらいなので バージョンには依存しないと思われます。 最新のOLD+バージョン無しProgIDの線で攻めてみます。
>>507 調べまくってわかりました。
EXCEL95がxl5jp32.olb、
EXCEL97がEXCEL8.olb、
ELECEL2000がEXCEL9.olbなんですね。
それで折れが調べた限り
xl5jp32.olbとEXCEL9.olbは
コーポネント上の互換性は無いみたいです。
インターフェイスやそのメソッドとかは
なんとなく似てるんですが。
自分のWin2000ではxl5jp32.olbのインターフェイスを呼ぶと
何故か失敗するので確かめることはできなかったんですけど。
EXCEL8.olbは手元に無いのでわかりませんでした。
こりゃああきらめてVBを間に挟むしかないかな。
512 :
デフォルトの名無しさん :02/05/07 08:51
↑みたいなのを#importを介さずに同じ事するにはどうすんだべ? BCCからも使いたいっぺ。
513 :
デフォルトの名無しさん :02/05/07 12:00
>>512 当然だが、C++からは直でタイプライブラリは読めないので
C++のソースファイルへの変換が必要。
#importディレクティブは、OLBファイルから
TLHとTHIというC++のヘッダとソースを作り出す。
それに加え、OLBファイルからツールを使ってIDLファイルを作成し、
IDLファイルからMIDLコンパイラを使ってC++ヘッダをコンパイルする方法もある。
上記二つのどっちかのC++ソースを、何らかの方法でゲットしてBCCで使えるかどうか
試す。
又は、COMの機能を使って動的にタイプライブラリを読み出す事も可能。
LoadTypeLibEx()でITypeLibインターフェイスを取得する方法。
一番古いバージョンのExcelのタイプライブラリをインポートして、 CLSIDFromProgID( "Excel.Application" )ではだめでしょうか? だめなら、全てIDispatch経由でアクセスするしかないでしょうか...
>>514 497?
ならすいません。ウソこいてました。
EXCEL9.olbはxl5jp32.olbの上位互換性を持ってるようです。
xl5jp32.olbで公開されているインターフェイスは
dispinterfaceだけしかありません。
EXCEL9.olbはそれに加えdual interfaceとinterfaceを公開しているようです。
しかし、xl5jp32.olbで公開されている
dispinterface _Globalとdispinterface Applicationの
このふたつは何故かEXCEL9.olbには無いです。それ以外の
dispinterfaceは定義されているようです。
自分はEXCELにはあまり詳しくないんで
わからないんですが無くてもいいんですかね?
まあ結論としては、インポートするOLDはEXCEL9.olbで1つでOK。
ただし、xl5jp32.olbへのアクセスはIDispatch経由以外ないと、
こうなると思います。
>ただし、xl5jp32.olbへのアクセスはIDispatch経由以外ないと、 >こうなると思います。 xl5jp32.olbと互換性を持たせるなら、IDispatch経由以外ないと の間違いです。
>>515 497ではないですが(^^;)
古いexcel等は確かおっしゃるとおりdispinterfaceしか定義されていなかった
と記憶しています。
そこで
>>497 さんは #import を使っているみたいですから、#import すれば
Dispatch経由でアクセスしてくれるラッパが自動的にできないかなーと思ったしだいです。
今手元に環境が無いのでおぼろげな記憶だけですが..
だめならやっぱり
>>514 に書いたとおり、
せめて excel のクラスIDぐらいはバージョン非依存で取得して、
あとは自分で IDispatch 経由でアクセスするしかないかと..
>>514-517 ありがとーございましし。
>xl5jp32.olbと互換性を持たせるなら、IDispatch経由以外ないと
コードレベルでの互換をとるなら、という意味ととってよいでしょうか。
OLBは今ある最新のものを使うとして、それがofficeのバージョンに
依存するかどうか、が一番の焦点だったのですが、問題なさそうですね。
とりあえず、バージョン非互換のクラスID+OLBのインポートで
テストしてみます。
2chで初めて人に感謝しました。
すんません質問です。DelphiでCOMを作る方法を探しています。 Delphi6 PersonalでCOMが作れるか調べていたのですが、 Personalにはウィザードがないようです。ベタに作る手は あると思うのですが、Googleでもあまり情報がなく。 VC++は歯が立たないので、ほかの言語でCOM作って遊ぼうと している次第で。WSC、VB6、.Net(C#)は実践済み。
それだけできてVC++で作れないというのが信じられない
hello worldだけとか?<実践済み WSC(わんだーすわんからー?)/C# がCOMと関係あるとは思えない
sage間違いすいません。
>>520 Cの経験がないのです。ニセモノです私(恥)
>>521 ASP/スクリプト環境で使うことを考えていたのです。
作ったものが呼べるとわかればあとは何とかなると思っています。
WSCはWindows Script Componentです。あまり流行ってませんが。
スクリプトのかたまりをCOMとして呼べる代物。
C#/.netはinterop経由でアセンブリをCOMとして呼べます。
VBならActiveX DLLでCOMのこと何も知らずに作れるので、
気楽なものかと思っていたのですが。このスレ読む限り
非常にレベル高そうですね。
ここまで書いてCOMの意味を誤解している気がしてきました。
生COMの実装はカナーリつらいぞ。 知識として知っておくのはいいかもしれんが、自分でやることはないだろうなあ。 DelphiでのやりかたはDelphi関連のスレで聞いた方がいいとおもう。 なんらかのサポートがあったと思うがよく知らない。
ありがとうございます。場所を変えて聞いてみます。
525 :
デフォルトの名無しさん :02/05/13 03:21
今からCOMはかなりお勧めしない。 やるならオートメーションは意図的に省いて それ以外のアーキテキチャを勉強を勉強すべき。 マーシャリングとかそこらへん。 俺は確信に至った。 IDispatchやIDispatchExなんてのは 明らかに死に行く技術だ。存在価値ゼロ。
>>525 そこまで読み切れる判断力がうらやましい。(決して皮肉とかじゃないですよ)
VBがやっとな俺の頭脳では、高度な技術の是非までは残念ながら判定できない。(泣
497です。 なんとかうまいことC++からExcelを操作することができるようになりましし。 重ね重ねお礼を申し上げます。
age
>それ以外のアーキテキチャを勉強を勉強すべき。 君はまず日本語を勉強すべき。
アーキテキチャ
>Excelを操作することができるようになりましし こういうのってIDispatchのおかげじゃないの?
533 :
デフォルトの名無しさん :02/05/17 08:41
このスレでMFCアプリケーションからのMSHTMLの利用方法に関する質問をしてもいいですか? Web制作板はscriptの話ばっかりで参考にならなくて。
>>534 おおう。サンクス。とりあえずそっち全部読んでみるよ。それでもわからんかったら帰ってくるかも。
age
537 :
デフォルトの名無しさん :02/06/09 19:47
COMってEJBとかと比較されますけど、速度はどうなんでしょうか?単純に比較は しにくいかもしれないですけどVBとVCで作ったCOMの比較とEJBを比較するとどの 程度の速度差になるのでしょうか?やはりATLなどでVCのCOMがあまりはやらない のはVBなどでも満足いく速度だから?
>>537 >VBとVCで作ったCOMの比較とEJBを比較するとどの程度の速度差になるのでしょうか?
何の速度差か知らないけど多分、
VC>>>>>VB=>EJB
でしょう。
>やはりATLなどでVCのCOMがあまりはやらないのはVBなどでも満足いく速度だから?
なにが「やはり」なのかはおいといて、
エンドユーザー/開発者から見た場合、COMはVBの為に作られたんだから、
そもそもVCで流行るはずが無いのは当然の結果かと。
VCだけで使うんなら、ただのDLLでもなんでもいいし。
VCでのCOMは「作る」よりも「しかたなく使う」が圧倒的。
速度については、VBは元々遅いから、それで満足する様なやつらからは
文句はでないってだけだと思う。速いマシンに換えるとかね。
それで満足しないやつらは他の手段を模索するでしょう。
539 :
COMビギナ :02/06/10 18:44
どうかご教授を。 タイプライブラリにenumで定義した定数シンボルを、 XMLで記述されたクライアントから参照することは可能でしょうか? よろしくお願いいたします。
連続カキコでスマソ。 ちょっと誤解を招きそうな表現なので書き直します。 enum定義を含むタイプライブラリを、XMLで利用する際に、 その定義されたシンボルを参照することは可能でしょうか? よろしくです。
541 :
デフォルトの名無しさん :02/06/10 19:25
無理
>>541 レスどもです。
やっぱ無理ですか。
別な方法を考えます。
543 :
デフォルトの名無しさん :02/06/18 15:49
COMってコールバック関数を引数に出来ないんだねぇ。 クライアントにコネクションポイント実装させるのもなあ。 しかし本気でこの型制限にはいらつくよ。何も出来やしねえじゃねえか。
素直にインターフェイスポインタ渡せよ。
まったくだ。コールバック関数よりはるかに柔軟だと思うが。
546 :
デフォルトの名無しさん :02/06/29 11:58
COMにおける配列参照はいままでも話題になっては いるのですが、私も文字列の配列をCOM<->VC++クラ イアント間でやり取りする方法に悩んでいます。 どなたか以下の状況で実装されているソースをご存知 ありませんか? (1)VC++クライアント側に配列のインスタンスがある。 これはCOleSafeArray (2)配列はBSTRの一次元構造 (3)COM側で、受け取った配列の参照に対して操作を加える よろしくお願いします。
>>544-545 ピュアなCやC++の環境で使いたい場合どうすんの?
それだとCOMクライアント専用になっちゃうじゃん。
あと質問。
IDLでメンバのオーバーロードを定義すると怒るんだけど。
これって仕様?
だとしたら本当に糞だなCOMって。
548 :
デフォルトの名無しさん :02/06/29 20:18
古い話してるね〜 COMなんてもうないだろ。 今はEXEだよ。
コールバックされたいクラスの事だよな。 それなら、別にIUnknownから継承をうけて、実装を いれたとしても、pureなC++でも使えると思うが。
550 :
名前:デフォルトの名無しさん :02/06/29 20:22
>>548 意味不明。ネタにしても自殺を勧めたくなるほどつまらん。
>>549 IUnknownから継承を受けるには
IUnknownの実装を入れなければならないと思うけど。
Release()とかダミーで実装させるの?
真っ当に実装したらいいやん。
>>552 それじゃ、COMで実装させることと変わりないじゃん。(笑
MSだって、DirectXとかの例があるし諦めろってことだな。
所詮過渡期の技術か。
>553 でも、COMクライアント専用(この語もなんだか意味不明っぽいが) というわけではないだろ。
555 :
デフォルトの名無しさん :02/06/29 23:22
Cからタイプライブラリってどうやって使うんですか? FreeのBCCでExcelの定数を認識させたいんですが、 さっぱりです。Invokeとかはなんとなくつくれるんですが。 Excelのタイプライブラリの参照例みたいなコードどこかに無いでしょうか
>>553 お前、結局何が不服なんだ?
まぁ過渡期ってのは間違いないだろうな。といってもあるものすべて過渡期と言えるが。
安心しろ。いろんな欠点は.NETで解消されてるだろうから。
>>556 俺は、CやC++用のライブラリをCOMで作りたい。
COMの基本的な概念、インターフェイスとか参照カウントなどは
良いと思うのでそれは導入したい。
しかし、マーシャリングやオートメション、スプリクト言語対応
といった機能は別に使わないのでいらない。
だから、そういったものに付随する制限まで課せられるのは
イヤだなと。
それに、C++で使う為のライブラリをC++で作ってるのに、
訳のわからない理由でC++の機能が使えなくなるのは
なんだか納得がいかない。
だったら使うなと言わないで欲しい。
代わりになるものがあるなら別だが。
生のC++や.NETでは代わりにはならない。
558 :
デフォルトの名無しさん :02/06/30 08:30
>>543 MS社某のお言葉。
0.1%の比率に過ぎないないコンポーネントビルダーは、
99.9%のVBプログラマ向けに、彼らの頭脳では製造不可能な
ものを構築するために存在するんだそうだ。
COMのさまざまな制限はVBあるいはVBA/VBSとの接点による
ものであり、核心部分はC++で記述、フロントをVB/ASP等で
安く作らせるための構図であると。
>>558 ホンネなんだろうけど・・・正直過ぎ。(苦笑)
あの構成を見てそう思わない奴は居ないと思う。 いまさら言ってるお前って・・・
>>543 いや、COM初心者の俺に説明してくれただけだよ。
いや、よくわかりました。
もう愚痴を言うのはやめるよ。
562 :
デフォルトの名無しさん :02/07/12 17:41
スレッディングモデル絡みの質問なんですが、 ActiveIMM(ActiveX)のCOMサーバをCoIntilaizeEx(NULL,COINIT_MULTITHREADED)で初期化した スレッド(MTA)で使おうとすると[REGDB_E_IIDNOTREG]なるエラーが出てインターフェイスが 取得できません。 レジストリでそのCLSIDを見ると[ThreadingModel]は[Apartment]でした。 MSのサポート技術情報を見る限りMTA所属のスレッドでも、[Apartment]で登録されている COMサーバはプロキシ経由で使えそうなのですが、なにか必要な手続きがあるのでしょうか? ちなみにCoIntilaize()(STA)で初期化したときは正常に取得できます。
IMarshalに答えない仕組みなんじゃない。あるいは、local属性つけてるか。
564 :
デフォルトの名無しさん :02/07/12 20:28
>>558 ガーン、おれは残り99.9%の中のその他大勢だったのか・・・
0.1%の中にはいるにはどうすればいいんだ・・・(鬱
>>564 0.1%なんて世紀末におけるサウザーぐらいな奴と思われ。
フハハハーとか言って、余興でジジイ殺しちゃうような。
開発言語の格差をCOMで吸収しようという。 ただしオブジェクトはバイナリレベルで提供と。
age
568 :
デフォルトの名無しさん :02/07/25 18:45
マーシャリングの質問。 メインSTAで作成したインターフェイスポインタを別のMTAなスレッドで マーシャリングせずに使ったら、普通に使えてしまったんだがこれって このまま使っても問題でないんだろうか? その逆で、MTAなスレッドで取得したインターフェイスポインタをメインSTAで 使用しても同じように問題なく使えました。 ちなみにマーシャリングしようとするとエラーが出て、マーシャリングが できないんで、そのまま使ってみたんだけど…。 う〜ん、COMは良く分からん(;´д⊂
C++のセマンティクでは使えて当然。STA側のオブジェクトがクリティカルセクションの 保護してなくて、かつ同時に複数のMTAからさわるなら、やめといたが無難。 MTAの生ポインタをSTAが使うのは、別に構わない。
>>568 インターフェイスポインタをどうやって渡したのかによるね。
インターフェイスのメソッドパラメータで渡してるなら、COMが勝手に
マーシャリングしてくれるから問題なし。問題なのはグローバル変数とかで
共有している場合だけ。
レスありがとう。
>>569 「アパートメント境界を越えての使用はマーシャリングする必要がある」
って各所に書かれてるんだけど、それは気にしなくてもいいの?
普通のコードと同じ扱いで、そのコードがスレッドセーフ(ThreadingModel=both)なら
そのまま使えて、そうでなければ(ThreadingModel=Apartment)クリティカルセクション
とかで保護すればいいだけ?
>>570 グローバル変数で共有してます…。
そもそも、何故マーシャリングできないのかが不明なんですよね。
マーシャリングするには[HKEY_CLASSES_ROOT\Interface]あたりのレジストリ
に何か登録されてないと駄目とかあります?
>>571 それならマーシャリングが必要。マーシャリングするには、マーシャリング用のコードが必要。
TLBがあるならユニバーサルマーシャラを使う。IDLがあるならMIDLでマーシャリングコードを作れる。
ちなみに、CriticalSectionを使うとかいう問題ではないのでご注意。
>>571 ってことは、マーシャリングできないのはマーシャリングコードが無いからか。
ちなみに元発言のMTAなCOMコンポーネントはDirectPlayなんでtlbもidlもないです。
STAの方はidlならあったんだけど、こっちもMS提供な代物なのでいじってもしょうがないしな。
idlがあるからそれを継承してマーシャリング機能だけ追加したものを作るってのは可能?
一番手っ取り早い解決方法は、パフォーマンスを犠牲にして全スレッドをSTAで
やればいいんだろうけど、なんか悔しいし…。
>ちなみに、CriticalSectionを使うとかいう問題ではないのでご注意。
アパートメント境界を越えたアクセスは何かしらの方法でマーシャリングは必須。
ただ、マーシャリングした結果が生ポインタの場合もある。
と言う認識でいいのかな?
なんか、盛り上がってるが……。STA用のコンポーネントの代表はOCX.こいつは、HWNDを 使ったりする。当然、作成したスレッドで動く必要がある。マーシャリングすると、 Windowsメッセージ経由でリクエストされるから、DefWndProcからの呼び出しとなる ってことは、そのSTAで動くから問題なし。だから、569はちょっと乱暴で、572が正しい。 でも、ユーティリティクラス(引数同志の演算とか。ハッシュ計算するとかさ)をVBで作っちゃった ような場合(だからSTA)で、TLS使ってないことがわかりきってれば、別にマーシャリング しなくたって構わないわけ(だが、透過性を無視してる=COMの原理破壊)。 その他、MTAでCoCreateInstanceするとブルブルとか、いろいろあって、おもしろい。
>>573 あと、STAだからパフォーマンス犠牲というのは必ずしも正しくはない。並行動作
に意味がないのであれば、STAはひたすら同一スレッドのスタックを使いながら
突っ走るから、実は高速な動作が1番期待可能。(アウトプロセスサーバがSTAだと
リクエスト1個づつしか処理できないから、パフォーマンスは低くなるけど)
また、レスありがとう。
まず訂正。前発言の
>>571 は
>>572 でした…。
>>573 全部「That's correct.」と解釈してもいいんだろうか…。
説明が無いだけにちょっと不安(^^;
>>569 さん
COMの手順に則る限りはマーシャリングは必要なんですね。
「そうでなければ自己責任で…」って感じでしょうか。(^^;
もう一つのパフォーマンス犠牲の話ですが、今回はDiretPlay使っているので
たぶんパフォーマンス落ちます。測っては無いので、どれぐらい落ちるかは不明ですが。
それに、DirectPlayがスレッドを乱立してる感じなんで並行動作してるでしょうし。
う〜ん、どうにも解決手段が見つからない。こう言う時こそMSDNのインシデント使うべきか…。
DirectPlay使ったことないから、わかんないなぁ(使ってる人、尊敬する)。 STA側ってなに? バイナリの内側の処理を勘案してMTAから使っても平気とか考えるって のがCOM違反なだけで、使って問題なければ別にOKなわけだから、そっちでごまかすって 手もあるよね。 STAをMTA(のランダムなスレッド)から生アクセスする問題は、次の点 1.レースコンディション(そりゃそうでしょ?) 2.HWNDの取り扱い(これ違うスレッドから呼ぶとエラー食らうWin32APIもあるから当然) 3.規約違反(気にすればってことで) 4.TLS(スレッドローカルストレージ)使われてるとクラッシュ #1.については、STAで作ってるんだからクリティカルセクション保護は当然してない。 これらに問題なければ3.に抵触するってだけの話。
5.中で上の1,2,4を持ったSTAのオブジェクトを作って使っている場合もまずい ということもあるから、基本はマーシャリング必須。しかし、5.についても実は 雰囲気でわかったりもするし(そもそもデバッガで動かせばロードしたDLLがわかる から、把握できるし。
>>569 さん
STAなコンポーネントはActiveIMMっていうGlobalIMEを使うのに必要な
ActiveXコンポーネントです。
で、
>STAをMTA(のランダムなスレッド)から生アクセス
してみたんだけど、駄目でした。クラッシュはしなかったけど、どうにも
メッセージ処理が上手く言ってないっぽい。
[OnDefWindowProc()]←こんなメソッドもあるんでかなり怪しいし。
あと、クラッシュはしなかったんでTLSは使ってなさそう。ってな感じかな。
こっちはもうちょっと探ってみるけど…。
という事で、解決策は
・STA一本で行く
・何とか完全分離してみる
・マーシャリングコードを自分で用意してみる(できるのか?)
・MSDNのサポートで聞いてみる(「できません」と答えてきそう…)
・その他、あれば募集中w
ってな所?
では、自力マーシャリングでいくのがいいかな? MTAからSTAへのマーシャリングの 問題点は、SendMessageしてSTAで処理が完了するまで待たされることにあるから、 STAで動いてる側に対してPostMessageで処理を行えと通知する。(ようするに、自分で 非同期COM呼び出しをするってこと)そもそも、STA側のインターフェイスポインタを マーシャリングできないわけだから、いずれにしても自分でやるしかないし。 つまり、ActiveMMを貼り付け?てるウィンドウのHWNDをグローバルに可視状態にして、 MTAはそこめがけてPostMessage(WM_APP、wParam, lParam)してやるわけ。 応答が必要な場合は、Eventで待つか、グローバル変数に状態を入れてポールするしか ないけど(SendMessageで応答を待つのも悪くはないが)。 注意点は、wParamやlParamに自動変数のポインタを渡すのは禁物って(あたりまえだけど) ことぐらい。
もしかしたらダブルかも知れないが…… 上のは中途半端だからもう少し付け加えると、COMにマーシャリングさせられないわけだから、 STA側のウィンドウハンドラで、WM_APPを受け取ったら、wParamとかから、ActiveMMの適切 なメソッドを呼び出してやる(=自分でプロクシ/スタブをやってやる)という意味です。
>>569 さん
いろいろとありがとう。ちと忙しくなってきたのですぐには試せないけど
とりあえず、手動マーシャリングの方向で作ってみます。
なんだか難しいこと書いてるけど、CoMarshalInterfaceでダメな理由がなにかあるのか?
>>585 DirectPlayにもActiveIMMにもマーシャリングコードが用意されてないらしいのですよ。
なんで、CoMarshalInterface()を使ってもマーシャリングできないのです。
それで、
>>581 の解決策のうち手動マーシャリングという話になったのですよ。
まぁ実際使ってるのは
CoMarshalInterThreadInterfaceInStream()
↑こっちですけど、中身は一緒ですし。
ちなみに返ってくるエラーはREGDB_E_IIDNOTREG(0x80040155L)です。
このエラーはMSDNに具体的な内容が記述されていないので、
「マーシャリングコードがないからマーシャリングできないらしい」
と言う不確かな結論になっているのですよ。
ちなみに、pActiveIMM->QueryInterface(IID_IMarshal, (void**)&nannka); して、HRESULT確かめてみるってのが、最初にすべきことだったかも。 ところで、ActiveIMMってのはどこの製品? なぜ、typelibマーシャリングを禁止 してるんだろ? (MFCのDLLで作ったのかな?)
見返すと
>>586 って「ですよ」だらけで変な言葉遣いだな(^^;
>>569 さん
QueryInterface()やってみました。結果はE_NOINTERFACE(0x8004002)。
idlではIUnknownを継承してたのでやっぱりと言う感じ…。
それと、idlに「tlbは全く使用しません」ってなことも書いてありました。
ちなみにActiveIMMはMSの製品(のはず)で、Win9x系での多言語入力をサポートする
ActiveXコンポーネント。所定のSDK入れればWin2kでもコンパイルだけなら出来ます。
う〜む、これ作った人がIUnknownから継承させたのが全ての元凶?(-_-;
COMの場合、直接のC++の派生とQIは無関係だからそれは余り関係ないです。 たとえば、適当なOCXあたりに、QI(IID_IDispatch), QI(IID_ITypeInfo, QI(IID_IStream) とか、やってけば、そこそこヒットします。 HRESULT QI(IID& iid, void** pp) { if (IsEqualIID(iid, IID_IUnknwon) { *pp = this; return S_OK; } if (IsEqualIID(iid, IID_IStream) { *pp = m_stm; return S_OK; } .... みたく実装するから。ミソは上のm_stmはQIに対して自分のthisではなく、こっちのthisを 返すこと。ワケワカな書き方だけど、まあそんな感じ。
今、dimm.idlを見たけど、オートメーションコンパチ型で作られてないから、TypeLibマーシャラは利用できない。 で、見るからに、MessagePumpどうしたとか、スレッドべったりだから、これはすっぱりMTAからの利用は あきらめて、ホストしているSTAに対してメッセージ投げてSTAで処理させるしかないっす。582の方法。
>>569 さん
ふむふむ、要はCOMサーバ内に目的のインターフェイスが実装されてて
それをQIで返してくれれば、継承しようがしまいが問題ないと言うことですね。
もちろん、IUnknownは必須でしょうけど。
で、やっぱり手動マーシャリングしかないのですね。うむ、それで頑張ろう。
いろいろ聞いたついでにもう一つ聞いておきたいんですが、STA側からMTA側の
インターフェイスをグローバルで共有して扱う場合は、規約違反とパフォーマンス
ペナルティがあるだけで特に問題ない?
実際にコードを走らせた時は問題なく動いてるけど、どうなんでしょう?
STAからMTA使うのって、全然問題なしと思ってるけど。そもそもMTAってのは、特定の スレッドに結びつかないってことなんだから。じゃあなぜ、BothとFreeに分かれてるか といえば、STAでCoCreateInstanceしたときに、どこに作られるかって点がひとつ。 (Bothは呼び出したSTAに作られるけどFreeは「どこか」に作られる) ちなみに、Inside COM日本語版309ページに「つまり、フリースレッドのコンポーネント は、同じプロセス内のアパートメントスレッドに対してポインタを直接渡せるのである」 って書ききってるよ、今、初めてそのへん読んだけど。いや、実はなぜ、STA->MTAに マーシャリングが必要かそっちがわからん……
あと、その場合、パフォーマンスペナルティは無いよ。同時に2つのSTAからMTAの オブジェクトを(デュアルCPUで)使うとしたって、MTAでレースコンディションに 対するクリティカルセクションでひっかかるとかはあるにしても、両方のSTAは、 単にcallで自分のとこのスタックを走ってくだけだから。(生ポインタだから、プロクシ を通さない、つまりC++での関数呼び出しと変わらないわけ)
>カスタムマーシャリングを考慮してるからじゃないんでしょうか あっ、そうか。それはすごく納得。 >メッセージポンプを壊すような作りにしてるとか 確かに引用ページにもそう書いてあるけど、これは意味不明。 でも、その後にある、STAクライアントが自分のインターフェイスポインタをコールバック 用に渡すシナリオについては、確かにマーシャリングが必要だから、生ポインタを使う 呼び出しがまずいってのもわかった。 thanks.
596 :
デフォルトの名無しさん :02/08/11 09:45
あげ
しつもーん COleClientItem* pItem = new COleClientItem( pDocument ); pItem->CreateFromFile("TEST.XLS"); 上記の方法で作成されたOLEアイテムから TEST.XLS を抽出して 保存する方法が分かりません、どうやればいいのでしょうか?
598 :
デフォルトの名無しさん :02/09/23 02:33
ちょいとはずすかもしれんが COM公開後は仕様変更しちゃだめ 機能追加は実装の追加で補い旧実装はそのまま放置 COMには「バージョン管理はしない」などという お約束事があったかと思うが 皆様はお考えを頂戴したく仕る
実装を放置しなくてリプレースしても構わないと思うが。 DirectX3位の時、バージョン上げたら実行結果が異なることがあったと思う。 新バージョンは機能追加ではなく新しいインターフェイスで公開すればいい
>>599 このCOMがインプロセスでもローカルサーバでもかまわないが
閉じた世界でのFixupであれば599の言うのも正論であると思う
がDCOMリモートに配置された分散オブジェクトで
たとえば第一次リリースしたDCOMを多数の
部門で共有していた場合などは勝手に仕様変えて動作が変わると
困るのでは?
COMを設計する上で
仕様上の規約なのかどうかをはっきりさせたいのですが
皆様のご意見をお願いします
COMコンポーネントを初めて書きました。 配布用にDll(Un)RegisterServerを呼ぶ(アン)インストーラをわざわざ別プログラムで 用意したのですが、なんだか面倒です。 一般的にはどのような形態で配布されるのでしょうか?
>>601 ご回答ありがとうございます
そうですよね確か
だから基本設計の時にじっくりと拡張したときの事まで
考えてつくらないと恥ずかしいものができてしまうとか
ありですよね
慎重に設計せねば・・(事故レス)
>> 603 なぜ? 第1段階 interface IFoo : IDispatch { // まあdualインターフェイスでいいや。 HREUSLT method1(); }; coclass { [default] interface IFoo; }; 第2段階 interface IFooEx : IFoo { HRESULT methodEx(); } coclass { [default] interface IFooEx; interface IFoo; }; 第3段階 interface IFooExEx : IFooEx { HRESULT methodExEx(); } coclass { [default] interface IFooExEx; interface IFooEx; interface IFoo; }; で、いいじゃん。<よかねぇよ。でも、この手はありだから。
>>604 ケースバイケースということで
基本的には method1()を公開したら
method1()の内部動作を修正するのは
はまずいです。内部動作仕様の変更は×です
methodEx... methodExExと新規メソッドとして
機能を追加するなら○です
ようは問題があった古いバージョンも残しておかなくては
ならないが正式なCOMの仕様だと思いますが・・
・バージョン管理を行わない(バイナリレベルの互換性保障)
ちなみにidlで内部バージョンを定義はできますが
ソースは古山さんの「DCOMガイドブック」オーム社です
もちろん個人レベルのローカルPC内の仕様変更は誰にも
影響はでませんからありということで
>>602 配布んときはselfregフラグ立てて(リソースのバージョン情報だったかな)
インストーラにレジストさせてるよ漏れは
そうでなければ客にレジストをやらせる方法もある(爆)
dll, exe, ocxでも対外はsystem32にぶっこむのパターンが多いと
思う これもインストーラまかせ
>>606 selfregというのは知りませんでした。
インストーラというのはやはり別プログラムですよね?
本当にただのdllひとつだけなので、例えばinfファイルなどでなんとか
ならないものかと思いました。
>>607 Windowsインストーラでもやっくれると思うがな
あとはjacarta-tomcatのisaapiリダイレクトDLLのインストールで
するような hoge.regファイルを自分で書いて
インストーラのスクリプトで自動実行させて登録させるとか
どっちにしてもテストの時は面倒で膨れ上がったレジストリサイズが
元にもどらないのは不満だけどね
仕様だからしょぅがない
Wizardで作成するATL, ActiveX, などの多数のCOMタイプが不明 だと思いません? どのCOMタイプがなにが得意なのかみなで整理しまへんか? ちなみに今漏れの手元で動かしてるのはVC++7.0っす VC++6.0の人も参加してください プロジェクト作成時の大項目 (1)ATL Server Webサービス (2)ATL Serverプロジェクト (3)ATLプロジェクト そのプロジェクトに追加する中項目 (a)ActiveXコントロールのMFCサポート (b)ATL Active Server Pageコンポーネント (c)ATL COM+1.0コンポーネント (d)ATL OLEDBコンシュマー (e)ATL OLEDBプロパイダ (f)ATL Server Webサービス (g)ATL コントロール (h)ATL シンプルオブジェクト (i)ATL ダイアログ (j)ATL パフォーマンスモニタ (k)ATL プロパティページ (l)MFC ODBCコンシューマ (m)MFCにATLサポートを追加 ふぅ〜
自分で選べないんじゃ使うな
>>607 rundll32.exeから呼び出せる関数をエクスポートして
それをinfファイルに記述するってのはどうよ?
612 :
デフォルトの名無しさん :02/09/26 03:49
OLEを使ってDnDを実装しているのですが、 エクスプローラ相手にドロップしたところ、 ファイルの移動が開始するまで(圧縮ファイルを一時ファイルに展開している間) エクスプローラが固まってしまいます。 これを回避したいのですが、、、 IAdviceSinkとやらで非同期の通信が出来るようですが、 Drag&Dropにも適応できるんですか? IViewObjectが無いので出来ないような気もするのですが。
>>612 圧縮ファイルって何?
ドラッグ開始のタイミングで展開始めれば?
614 :
デフォルトの名無しさん :02/10/21 10:19
COMってあんまししらないんですけど、 .NET出てきてCOMの価値が下がったってことありません? 今からでもCOM勉強したほうがいいですかね?
自分で判断できないんじゃ使うな
616 :
デフォルトの名無しさん :02/10/21 11:09
勉強しない方がいいだろ
617 :
デフォルトの名無しさん :02/10/21 11:42
COMやる価値なし!
知っておいてそんはないな。たとえレガシーだとしても。
619 :
デフォルトの名無しさん :02/10/21 22:48
概念だけ知ってればよいってことかな
概念? 実装が伴わない概念に意味がないと思うが?
Borland イイ!
えええ、三角形は実体がなくても概念として成立してますよお
&heart
質問です。 COMコンポーネントに実装されているメソッドがIDispatchインターフェイスなのか、 IUnknownインターフェイスなのか、確認する手段、ツール等はありますか? (手元にソースがなく、バイナリしか存在しない前提で) (例) ExcelのQuitメソッドが IDispatch/IUnknown のどちらなのか知りたい。
OLE/COMオブジェクトビューアを使えば確認できるよ VBはよく知らないけど、ObjectとしてアクセスするとIDispatch経由に なるんじゃなかったっけ?
626 :
デフォルトの名無しさん :02/11/02 12:31
>>625 > OLE/COMオブジェクトビューアを使えば確認できるよ
てことは、Visual Studio 6.0 の開発環境があればOKですね。
感謝! m(_ _)m
IDLもないなら、カスタムインターフェースで呼び出せるわけがないだろ。 IDLがあるなら、それみろ。
>>627 IDLをコンパイルしたのがtypelibで、COMモジュールに同梱するのが通例。
OLE/COMビューアはそのビューアでもある。
IDispatchはtypelibを参照して名前でメソッドInvokeするためのインターフェース。
リフレクションみたいなそういう感じ・・・
蛇足しちゃうとtypelibをメタデータと読み替えれば.NET。
>>627-629 タイプライブラリは、単独のファイルなのでしょうか?それとも、
レジストリに記述されているもの??
(よくわかってなくてスマソ)
>>625 oleviewで見ても、そのとき何でアクセスしているかはわからんよ。
>>627 IDLは必須ではない。IDLのないCOM DLLはたくさんあるぞよ。
>>628 IDispatchにtypelibは必須ではありません。
>>629 ちょっと違いすぎますね。
>>630 単独のファイルにすることも、リソースとしてファイルに埋め込むこともできます。
レジストリには記述されません。レジストリに記述されるのはそのtypelibのIDだけ。
>>624 参照設定をしないとコンパイルできない使い方がIUnknown
参照設定をしなくてもコンパイルできる使い方がIDispatch
> oleviewで見ても、そのとき何でアクセスしているかはわからんよ。 あるインターフェースがIDispatch経由で呼び出せるかどうか、 は分るよ
>>633 ?インターフェイスは呼び出せませんが?メソッドのこと?
だったら「Quit」がIDispatchで呼び出せるかどうかは
やってみなけりゃわからない。oleview見たってわからない。
>>634 は?
oleviewはIDispatch経由で取得できるインターフェースが列挙できるよ?
>>635 うっそー!(爆笑)
そりゃ単にタイプライブラリの中身見てるだけだろ?
タイプライブラリに書いてあるからって呼び出せるとは限らんよ。
>>635 ???
少なくとも列挙できないと呼び出せないよ?
>>637 636に対してだと思うが。。。
列挙って何を?GetIDsOfNamesが成功すりゃInvokeで呼び出せる。oleviewではそれができるかどうかは
わからん、って言ってるんだけど。
列挙ってGetIDsOfNamesのこと言ってるのかい?それが「やってみなけりゃわからない」ってことだよ。
639 :
デフォルトの名無しさん :02/11/02 17:33
別スレで回答が得られなかったので専門スレで再度質問させていただきます。 普通、COMオブジェクト(ActiveXコントロールとか)をregsvr32でシステムに登録するときは 管理者権限で 行いますが、Users権限でも使えるCOMオブジェクトというのはあるのでしょうか? 例えば、Usersグループのユーザがregsvr32を実行すると、もちろんシステムには登録できませんが そのユーザの環境だけでは有効になる、というようなものはありえるのでしょうか? それともCOMオブジェクトというものは必ず管理者権限でシステムに登録しないと 使えないものなのでしょうか? よろしくおねがいします。
アプリケーションというものはすべて管理者権限でインストールするものだ。 管理者以外が勝手にアプリケーションをインストールするから、ウィルスが はびこったり、業務アプリが止まったりする。君が使っているPCはおそらく 君のものではあるまい。だったら君にはアプリケーションをインストールする 権限がないのだ。黙って管理者様の言うとおりにしなさい。
>>640 いいえ自分のものです。
また、「アプリケーションというものはすべて管理者権限でインストールするものだ」という
理想論ではなく、
>>639 に関する答えをいただけると幸いです。
世の中にはバカ管理者も多いけどな。
2000以降ならHKEY_CURRENT_USER\Classesがあるし side-by-side sharingもあるから 原理的には管理者権限がなくてもインストールできるはずだな 対応してるアプリは(MS製のものでさえ)見たことないけど
>>641 理想論??すべてのユーザーが勝手にアプリをインストールして、
それでもマシンが動き続けると思い込むほうがよっぽど理想論ですよ。
640が一番現実的なんです。
大体自分のものなのに管理者のパスワード知らないってどういうこと?
それがすでに意味不明なんだけど。
サイドバイサイドならMSのHPに情報があるけど、そういう問題ではないね。
>>644 >それでもマシンが動き続けると思い込むほうがよっぽど理想論ですよ。
マシンが正常に動きつづけるなんて一言も言ってないよ。
「管理者以外でもインストールし得る」と考える方が現実的ってだけ。
>大体自分のものなのに管理者のパスワード知らないってどういうこと?
誰もパスワードがわからないなんて言ってないよ。
UsersでもCOMオブジェクトを有効にする環境がありえるのかと聞いてるだけ。
なんか勘違いしてるようだから、もう一回
>>639 を読み直したほうが良いと思う。
>>645 >UsersでもCOMオブジェクトを有効にする環境がありえるのか
だからありえないといっているだろうが。
インストールするときにだけsu/RunAsするのは不満か?それとも知らないだけか。
パスワード知っているならそれができるだろうが。
管理者以外でもインストールしうるから現状に色々な問題があるんだろ。
マシンが正常に動き続けないんだったらインストールすることに何の
意味があるんだよ。勘違いは君だよ。もっと広い視野で物事考えないと
人間として成長できないぞ。
>>646 >だからありえないといっているだろうが。
じゃあHKEY_CURRENT_USER\Classesはなんのためにあるんだよ。
「ありえない」んじゃなくて「仕組みはあるけど現状ではそういう運用を
する事が想定されてない」んだろ。
大体技術的に可能なのかどうかを聞いてるところで運用ポリシーの話
持ち出して来る事自体筋違い。
>>646 >だからありえないといっているだろうが。
おいおい
>>640 以降そんなこと言ったの今回が初めてだろ。
あのさぁ、「実際にここに○○というActiveXコントロールがあってそれを管理者じゃないのに
インストールしたいけどどうすればいいですか?」なんて聞いてないの。
そういうことが可能かどうかって聞いてんの。
Yes/Noで答える質問にはせめてYes/Noで答えれよ。 的外れな講釈たれる奴はたいがい無能。 政治家によくいるね。
>>647-649 おまえら教えて君のくせにずいぶんとエラソーだな。(w 身の程わきまえろ。
そんなに知りたきゃテメーで調べろよ。やってみればいいじゃないか。
やってみてそれが現実的かどうか考えてみなよ。ヒントはくれてやったろ。
UNIXな人にsuってどういうときに使うんですか?って聞いてみな。
>じゃあHKEY_CURRENT_USER\Classesはなんのためにあるんだよ。
>「ありえない」んじゃなくて「仕組みはあるけど現状ではそういう運用を
>する事が想定されてない」んだろ。
その2つにどんな違いがあるのか教えてほしいもんだ。
>あのさぁ、「実際にここに○○というActiveXコントロールがあってそれを管理者じゃないのに
>インストールしたいけどどうすればいいですか?」なんて聞いてないの。
>そういうことが可能かどうかって聞いてんの。
おいおい、その2つにもどういう違いがあるんだ?YesかNoかで答えろってなら、
すでに答えたとおりNoだ。YesであればHow?って質問なら答える必要はないな。Noだから。
少し行間読めよ。ボクイクチュ?
HKEY_CURRENT_USER\Classesについての回答は無し、と。 やはり質問の主旨を理解できずに的外れな講釈をたれるDQN、と。 ま、こいつは根拠無しに「No」ってことしか言えないみたいだからもういいよ。 的外れな運用ポリシー論を主張したいなら別板逝きな。
652 :
デフォルトの名無しさん :02/11/03 19:05
実際にやってみた。
1.まずテスト用の簡単なCOMオブジェクト(DLL)を作成。これを管理者権限でregsvr32。
2.Users権限からテスト用プログラムでDLLが使えることを確認。
3.HKEY_CLASSES_ROOTに登録されたキーをregeditでファイルに書き出す。(5ファイルできた)
4.テスト用DLLを管理者権限でregsvr32 /u。
5.Users権限からregeditでキーが削除されたことを確認。テスト用プログラムでもDLLが使用不可になっていることを確認。
6.先ほど書き出した5ファイルを編集。(HKEY_CLASSES_ROOTの部分をHKEY_CURRENT_USER\Software\Classesに置換)
7.Users権限でこの5ファイルをレジストリに結合。
8.Users権限からHKEY_CURRENT_USER\Software\Classesにキーが追加され、HKEY_CLASSES_ROOTにも同様に追加されていることを確認。
9.Users権限からテスト用プログラムでDLLが使えることを確認。
よって
>>643 が正解。
DQN
>>640 は板違いな講釈をたれた上に答えも間違い。
>>640 みたいな読解力のないDQNは早めに放置するのが得策。
いくら説明しても曲解しかしないから時間の無駄。
なんか悲惨。
こうなると質問者を見下して煽ったりしてたのが痛いを通り越して哀れにさえ見えてくる…
656 :
デフォルトの名無しさん :02/11/04 22:34
DLL(API関数が実装されている、プリミティヴ?なDLL)とCOM(ActiveX)との 違いを教えてください。 (タイプライブラリの有無?) 読むべき書籍を提示して頂けると嬉しいです。
>>656 COMとはソフトウェアの構成部分からアプリケーションを構築する技術の事。
DirectSound Audio Renderer CLSID{79376820-07D0-11CF-A24D-0020AFD79767} のオブジェクトを継承したいのですが,どのようにすればよいのでしょうか? quartz.dll を #import してもインターフェイスは得られなかったです. インターフェイスが得られないものは継承できないのでしょうか? ご享受願います. Windows2000
COMでオブジェクトを継承って??? アグリゲーションのこと?
マルチです
アグリゲーションでもコンテイメントでも構いません. アグリゲーションでできれば楽かな通っているのですが^^;
age
663 :
デフォルトの名無しさん :02/11/08 02:28
>>656 >読むべき書籍を提示して頂けると嬉しいです。
純粋にCOMって何?
ということなら,「Inside Com」がお勧め。
OLEも含めてなら,「Inside OLE」かな?
664 :
デフォルトの名無しさん :02/11/08 08:39
「Essential COM」 ってどうですか?
666 :
デフォルトの名無しさん :02/11/15 19:41
MicrosoftのSOAP使ってサーバーCOMモジュール作ったんだが、 リクエストがある度に、インスタンスの生成・破棄が起きている。 何とかならんもんか。 スレ違いならスマソ
>>665 名著だが、今となって読む価値があるかは、絶妙に微妙
>>666 VC++のBothスレッドモデルでステートレスなCOMを作っているなら、
IObjectControlインターフェイスを実装してCOM+ Component Serviceに登録。
670 :
デフォルトの名無しさん :02/11/19 14:30
>>668 > VC++のBothスレッドモデルでステートレスなCOMを作っているなら、
> IObjectControlインターフェイスを実装してCOM+ Component Serviceに登録。
レスさんくす。
よくわからんのだが、↓のようにしたらとりあえずConstrucrot/Destructorの繰り返しは
なくなった。
class ATL_NO_VTABLE CXXX :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CConferenceSession,&CLSID_XXX>,
public IDispatchImpl<IConferenceSession, &IID_IXXX, &LIBID_XXXLib>,
public ISupportErrorInfo
{
public:
DECLARE_CLASSFACTORY_SINGLETON(CXXX);
DECLARE_PROTECT_FINAL_CONSTRUCT();
なんなのコレ?
誰か解説たのんます。
どの部分が?かわからないけど、 DECLARE_CLASSFACTORY_SINGLETON(CXXX); すると、ひとつのインスタンスをstaticな変数内に保持して以後、それを使いまわす から、コンストラクタとデストラクタの繰り返しはなくなる。 IObjectControlについては、おいらも説明キボーン
DECLARE_PROTECT_FINAL_CONSTRUCT(); は、べつにいらないんじゃないか
遅レスすまそ
>>656 お主の質問文は
えらく乱れた日本語だが
言いたいことはわかった
Win32もCOMもAPIだ
Win32はC関数の集まり
COMはC++純粋仮想関数の集まり
Win32もCOMもDLLだ
Win32は例えばC:\WINNT\SYSTEM32\USER32.DLLのように位置が決まっている
COMは例えばHKEY_CLASSES_ROOT\CLSID\{00000010-0000-0010-8000-00AA006D2EA4}\InprocServer32=C:\Program Files\Common Files\Microsoft Shared\DAO\DAO350.DLLのようにレジストリに位置が書いてある
COMでないDLLはエクスポートで関数を公開する
COMは仮想テーブルで関数を公開する
COMでないDLLはDllMain()がOSから呼び出される
COMはDllMain()/DllRegisterServer()/DllUnregisterServer()/DllGetClassObject()/DllCanUnloadNow()がOSから呼び出される
タイプライブラリは必須ではない
最小限のものは*.cppと*.defだけで作れる
お勧めはできんが型宣言とGUIDをコピペれば*.hもなしで使える
COMを始める前に知りたかったことって
こんなことだったな、少なくとも漏れは
本は他の香具師が紹介してたからセミナーを紹介しておく
ttp://www.catnet.ne.jp/triceps/hi/COM.htm まあがんばれや
675 :
デフォルトの名無しさん :02/11/29 18:12
> COMはDllMain()/DllRegisterServer()/DllUnregisterServer()/DllGetClassObject()/DllCanUnloadNow()がOSから呼び出される ぷっ
>ぷっ ぷっ
ネタにマジレス regsvr32.exeは、%SYSTEMROOT%\system32の下にいるから、当然、OSの構成要素ですが何か?
MODESET MODE=SUP,KEY=ZERO
679 :
デフォルトの名無しさん :02/12/02 10:47
>>677 freecell.exeも、%SYSTEMROOT%\system32の下にいるから、当然、OSの構成要素ですが何か?
つーかregsvr32.exeは必ず入っているとは限らないのだが。
OSでなきゃ何だと言いたいんだよ カーネルモード以外はアプリとか言ってのける手合いか?
Essential COM のはじめの章で ------/*ifaststring.h*/------ class IFastString { public: virtual void Delete(void) = 0; virtual int Length(void) const = 0; virtual int Find(void) const = 0; }; extern "C" IFastString* CreateFastString(const char* psz); ------/*faststring.h*/------ #include "ifaststring.h" class FastString : public IFastString { const intm_cnt; char*m_psz; public: FastString(const char* psz); ~FastString(); void Delete(void); int Length(void) const; int Find(void) const; }; ------/*faststring.cpp*/------//実装略 みたいなのあるんですけど
これでDLL作ってからダイアログベースのアプリで使おうとすると (略) #include "ifaststring.h" (略) void CTestdlgDlg::OnBtn() { UpdateData(true); IFastString* pfs = CreateFastString(m_input); //<-(**) if(pfs != NULL){ m_length = pfs->Length(); pfs->Delete(); } UpdateData(false); } (**)のところで「error LNK2001: 外部シンボル "_CreateFastString" は未解決です」 って出るんですけど、何でですかね?
>>682 ,683
エクスポートはどうやってるの?
>>684 ifaststring.h をインクルードするだけじゃダメですか?
というか、本にはそう書いてあるので・・・
exportって「_declspec(dllexport)」のことですか?
一応、class IFastString や class FastString の間に挟んでみたりもしたのだが・・・
素人丸出しの質問で申し訳無いス。
686 :
デフォルトの名無しさん :02/12/02 15:55
リンカに、dllを作ったときにできたlibファイルを、教えておかないと逝けない。 それがいやなら、LoadLibraryからGetProcAddressの流れを。
>>687 使う側のアプリのプロジェクトの設定で
「リンク」タブのところの「オブジェクト/ライブラリモジュール」に
libファイル名を入れておけばOKですよね?(パスもちゃんと通ってる)
691 :
デフォルトの名無しさん :02/12/03 12:52
IWebBrowserApp って何? IWebBrowser2とはどう違うの? IWebBrowserAppを取得する時は、IServiceProvider::QueryService を使うというのも意味が分からないし。 サービス?なんじゃらほい。
それはもう古い
>>693 > IWebBrowserとIWebBrowserAppがそれであり、前者はコントロール、
> 後者はアプリケーションである。
つまり、サービス=アプリケーション、ってこと?
所望のサーバーとか所望のインターフェースってどうやって探してますか 今のところ↓とか使ってます C:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\lib\Win32API.csv
696 :
デフォルトの名無しさん :02/12/11 11:53
dat落ち回避
697 :
デフォルトの名無しさん :02/12/11 12:57
NdrConformantStructMarshall() NdrConformantStructUnmarshall() このAPIの使い方知ってる? MSDNにも記述ないんだけど・・・。
>>697 使い方はわからないんだけど、それってCOMとは関係ないような...
COMより低レベルのraw RCPで使うものだと思います。
うんとですね。 オープン配列/オープン構造体を カスタムマーシャリングしようとしてるんです。 MIDLのはき出すproxy/stubコードでこのAPIを使っていて、 カスタム化する際にこのAPIを使用しなくちゃいけないと 思うんですけど・・・。 って事なんです。
キリ番Get age! (・∀・)
現在プログラム板老舗スレ第4位!
>>697 外してたらスマソ。MBVカスタムマーシャリングだけが目的なら(構造体とか配列
ってことでそう思ってるわけなんだけど)、直接RPCのAPIを叩かなくても、IMarshal
をオーバーライドしてやって、ストリームへのシリアライズ/デシリアライズ処理を
記述してやればいいんじゃないかな。
#ようはその構造体や配列自体をインターフェイスとして出してやれば良いのではと。
#って、こんな記述で意図がわかってもらえれば楽でいいけどな。
703 :
デフォルトの名無しさん :02/12/17 16:10
煽りではないのですが、COM+サービス(トランザクション)とパフォーマンス以外で.NETよりCOMを好む理由は何でしょうか? C++でCOMを使ってたときは、言語との透過性、文字列操作の煩雑さ、エラー処理の言語との不一致などコンポーネントを作ろうとしたのを挫折した覚えがあります. 既存資産の利用を含めて、すべてを置き換えるとはおもいませんが、.NETのほうが私的にはプログラムに使いたく思ってます.仕事あるかは知りませんが… そんな私に意見お願いします.
>>703 ゆくゆくはその多くが置き換わるものと思ってるけど、
いきなり全てなくなるようなことはない。これはいいよね?
明らかなことは.netからそれらネイティブなコードを
呼び出そうとした場合、C関数をDLLに詰め込んだものよりも
COM形式の方が親和性が高いということ。
ネイティブのコードに対する需要がまだまだあることを考えたら
COMは未だに必要だし、理解しておくべき技術でもある。
こんな風に単純に思ってますがどうでしょうか?
>>704 同意.
コンポーネント作る簡便さは.NETに多くの点で軍パイがあがるのでしょうか?
COMでないとという必要があれば知りたいので…お願いします.
>>706 >COMでないとという必要
おれの知る限りじゃ、ない
708 :
デフォルトの名無しさん :02/12/18 10:57
RogersenのCOMの参考書には、VBAからC++で書かれたDLL内の関数を呼び出せ る、とありましたけど、どなたかいい参考書ご存知ありませんか?よろしくおながいし ます。
710 :
デフォルトの名無しさん :02/12/18 15:35
>>709 ごめんね。でも、情報を得るには仕方がない・・・・・
> でも、情報を得るには仕方がない・・・・・ ハァ?
それにしても、マルチポストとか目ざとくよく見つけるよな…。
>>674 厳密にはDllRegisterServer, DllUnregisterServerはCOM DLLにとって必須ではない。
インストール時の利便性を考えてRegSvr32とかで自己登録できるようにしてるだけ。
最近のWindows Installerを使ったSETUPではSETUPプログラムが直接レジストリに
書き込みする場合が多くなってきてるみたいだし、実際登録用の関数をエクスポート
してないCOM DLLも存在する。
本当に必要なのはDllGetClassObject, DllCanUnloadNowのほうだ。これが無ければ
COM DLLとして成立しない。
COM DLLは、CLSIDというGUIDを通じてDLLフルパスを探索てDLLをロード、
DllGetClassObjectでクラスファクトリを作成して、CreateInstane()メソッドから連鎖的に
オブジェクトのインスタンスを作成してゆくタイプのDLL。
普通のDLLは、必要な機能をすべて関数として仕立ててそれをずらーっとエクスポート
してるタイプ。Dependency Walkerで見比べてみるとよくわかるよ。
>>715 >厳密にはDllRegisterServer, DllUnregisterServerはCOM DLLにとって必須ではない。
御意
717 :
デフォルトの名無しさん :02/12/21 22:44
>>715 >>710 です。なんか、思い出しました。2年前にそんなことしてました。なつかしや〜。
結局、一番単純な古典的DLLを作って、VBAから呼ぶ路線にしたいと思います。
VBAからWin32APIを使うために必要は知識を網羅した(?)参考書も、他スレで教えてもらいました。
一番単純な古典的DLLで作ったほうが、Solarisなんかに計算エンジンを移すときに、楽そう。
それにしても、やっぱりみなさん詳しいですね。ぼくは、ホントアマチュアだから。
これからも時々お邪魔します。
(^ー^)ノ ヨロシク オネガイシマス
718 :
bloom :02/12/21 22:51
719 :
COM初心者 :02/12/23 21:28
素朴な疑問なのですが、コンポーネントサービスでアプリケーションを 右クリックし、詳細設定タブを開くとデバッグという項目があってデバッ ガ内で実行するというチェックボックスとデバッガパスという入力フィー ルドがあります。これはどのように使うのでしょうか?これを使ってCOM+ のデバッグがもっと的確にできるようになるといいのですが。
720 :
デフォルトの名無しさん :02/12/24 02:35
>>693 の
>Internet Explorerのイベントを処理する (検討中)
のところが知りたいんだけど
どっか参考資料ない?
>>722 どこ見てるんだ。
BEGIN_EVENTSINK_MAPのあたりを見ればだいたい分かるだろ。
comってcommand.com とかのcomということで委員ですか
激しく既出。
↑ ?
730 :
COM初心者 :02/12/26 00:07
どなたか教えてください〜
Component Object Model
732 :
デフォルトの名無しさん :03/01/07 22:50
あげ
733 :
名無し@沢村 :03/01/07 23:05
俺はCOMに真剣に取り組もうとしたことがあったが、レジストリに登録云々のことろで面倒くさくなってやめたね。
>>733 関数化すればいいやん
ただそれだけのことを何で?
あれ、沢村じゃん いかん、容易に釣られてもた 鬱だ氏のう
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
「2chでは裏でIP記録されています。IPを抜かれたくなければ セキュリティガードに…」 というコピペを流行らせる会 会長↓
そして歴史に刻まれていく
普通に考えて、増えると思うなー。子供世代がPC買って参入してくるから。老人はもともと少ないからなかなか自然減少しないし。 鯖のほうで制限しない限り。
741 :
デフォルトの名無しさん :03/01/09 14:52
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。 これで完全終了ってことか。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
すごいラインナップだな(藁 >tmp鯖
つまらないね。 トリップだってさ 全然ボツ。
>>145 掲示板の一番下が「2ちゃんねる20030107a」
ってなってる板じゃなかったかな?
>>499 漏れが恐いのは、今後の他の裁判だ。
まだいくつか残ってるんでしょ?
159は尊師
>>649 誤爆じゃなくて、ここの前スレのコピペだと思われ。
するからなー。
鷺の質問・雑談スレに移動して下さいね。
シミュレート
ひろゆき君。 メルマガまってるよ。
スレタイの日本語、微妙におかしいね。
news2鯖に入った瞬間撤退すんなよw>コピペ荒らし
2ちゃんねるのオランダ引越しまだぁ〜
まあ、あnグラな話やりたきゃ他逝けってことかなぁ。 雑談、学問、技術系な板には関係ないな。
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
知らなかった(゚д゚)つφ.,._., メモメモ
事実・嘘をとわず公衆の面前でその人を侮辱したりした場合です。
まあ,ここでどんなに崇高な理想ブチ上げてるヤツよりも, 実際カラダ張ってるのはひろゆきなわけだからな……。 動機はよくわからないが。
一秒でも早い閉鎖を日々祈ってます( ´∀`)y-~~
内Pのレッド吉田、頼むから「今日のレッド」の時に ネタ帳見ながらやるのやめてくれ、一応カネ貰ってんだろ
大阪JCネタ
それもどうかと思うけどな(^_^;) やはり「書き込むことに責任あることを認識しろ」かと。 つーか、まもなく6億〜
きねん
2ちゃんの運営側の簡単なお財布事情を知りたいのですが、 どこか詳しい解説ページ等はございますでしょうか?
ヽ(*`Д´)ノナンダトウ!
Nyの掲示板がもうちょっと使いやすければねぇ。 特定の鯖に依存しないP2Pは理想的でありんす。 あれがWebのあるべき姿でありましょう。
いや、最近のニュー速は本当に良くなってきたと思うよ。 ニュース速報板だからね。
・・・横槍。 削除依頼を内容証明以外の方法で行っても有効ですが、条理が根拠ではありません。 意思表示の一般原則であり自明のことです。 免責の対象にはならないから安心してください。
やっとhtml化だ、過去ログが読める がんばってください
(^^)
4nd・・・天然ですか?>1
(^^)
776 :
デフォルトの名無しさん :03/01/19 12:47
浮上!!
(^^)
778 :
デフォルトの名無しさん :03/01/26 00:41
誰かこれからのCOMと.NETについて教えてください. まだCOMを学ぶ価値はありますか. .NETとどう関わりあっているのでしょうか.
779 :
デフォルトの名無しさん :03/01/26 01:10
>>778 価値が有るか無いかで言えば無いと思う。現在の.NETでは
一応、COMへのインターフェイスを用意されていて過去の資産を
利用出来るようにしているけど、あくまでも一時的な処置であり、
MSの思惑としては今までCOMでやってきた事も全て、.NETで行いたい
とかんがえているはずだから。
>>779 でも、とりあえず出来る出来ないで言えば、できた方がいいのでは。
Webシステム等のクライアント部品として、ActiveX使う事もあるでしょ?
#...ま、必ず覚える必要があるって訳でも無いが。
まあいわゆるひとつの「必要になるまでほっとく」というやつですな 暇つぶしにはなるだろうけど、必要に駆られないと身にならんと思う
みなさんありがとうございました. COMも横目で眺めつつ.NETの勉強してみます.
783 :
デフォルトの名無しさん :03/01/28 05:37
別スレで回答がないのでこちらに・・・
------
LPITEMLISTを解放するために手順が必要になってしまいます。
まずIMallocっていうインターフェースを持って来なくっちゃならない。
名前から想像できる通り、IMalloc ってのは COM ベースのメモリ
アロケータ(メモリの確保/解放を実行する)のようなもので結構
いろんなところで登場してくる。 まさか API ひとつだけですんじゃ
うようなもののために COM 使うとは思わなかったけど、要求され
てるんでしょうがない。
http://www.bd.wakwak.com/~opapa/VC/API/SHBrowseForFolder.htm -------
この辺のプログラミングを理解するには、どんな本が
適切でしょうか? Win32 API側で確保したメモリを
アプリ側で解放するらしいのですが、説明を読んでも
やり方が今一つわからずに使えません。
コモンコントロールなんかのWinプログラミングの基礎本
(by ハーバードシルト)と、柏原さんの「MFCによる
Winプログラミングの基礎知識」は読みました。
>>68 は、おいらが読むのに適切でしょうか?
抽象的な概念だけじゃなく、実際のコード書きに
直接役立ちますか?
784 :
名無し@沢村 :03/01/29 00:12
>>783 ヌヒよ、今日は特別に便利なAPIを教えてやろう。
それはCoTaskMemFree()だ。
沢村様にレスするのは恐れ多いが OLEのアロケータ(CoTaskMemFree)とシェルのアロケータが今後も一致するという保証は無い
786 :
名無し@沢村 :03/01/29 00:43
>>785 MSDNのCoTaskMemAlloc()の説明には、
Allocates a block of task memory in the same way that IMalloc::Alloc does.
て書いていますが、それでもだめですか? どうか、教えて下されー。
ShGetMallocで得られるIMallocとCoGetMallocで得られるIMalloc の実装が同じである保証がどこにある?
788 :
名無し@沢村 :03/01/29 01:25
>>787 VC7付属のshlobj.hには下記のような説明があるのですが、それでもだめですか?
教えて下されー。
// Notes:
// In next version of Windowso release, SHGetMalloc will be replaced by
// the following macro.
//
// #define SHGetMalloc(ppmem) CoGetMalloc(MEMCTX_TASK, ppmem)
おうっ VC6のshlobj.hでもPSDKOct2002のshlobj.hでもそう書いてある 沢村様に論破された漢として語り継がれそうだ
790 :
デフォルトの名無しさん :03/01/29 03:33
>>784 ありがとうございます。
CFolderDialog::~CFolderDialog()
{
CoTaskMemFree(lpItemIDList);
}
という風にデストラクタに実装してみました。
デバッカで追ってみたのですが、CoTaskMemFree実行
直後はlpItemIDListも、その参照先も特に変化ないのですが、
こんなもんなんですかね?
きちんと解放されたかどうか確認する方法はありますか?
791 :
名無し@沢村 :03/02/01 07:25
ヌヒ等よ、NETて何よ? それはCOMより新しいのか? COMでやっとアプリがつくれるようになった俺としては、そういうのが出てくると非常に困る! NETで検索してみたが出てくる件数が多すぎてわからなかった… ヌヒ等よ、教えてはくださらぬか?
>>791 おれもつい半年前にやっとのことでCOM開発できるようになったんだが、
.NETをやってみて衝撃を受けたよ。
もうCOMなんてやっててもニーズがない。
はっきりそう分かった。
.NETならCOMの10倍は楽にCOMより使いやすいコンポーネントが作れる。
時代の流れだと思って.NETの勉強をした方がいいと思う。
ショックはでかいと思うけどね、、おれがそうだったように。。。
でもCOMの知識があるとないとでは差は大きいから無駄ではない。
COMを知らない香具師はどれだけ.NETの功績か大きいか絶対わかんないだろうな。
793 :
名無し@沢村 :03/02/01 10:16
>>791 NETの解説したページがあれば教えてはくださらぬか?
>.NETならCOMの10倍は楽にCOMより使いやすいコンポーネントが作れる。
性能もCOMよりいいのか?ならCOMは意味ないじゃん!!
NETって意味が広すぎて検索しても出てくる件数が多すぎてわからぬのよ…
ヌヒよ、教えてはくださらぬか?
795 :
デフォルトの名無しさん :03/02/05 17:05
COMもたそがれの時期を迎えたか...
ただし.NET Frameworkをインストしていないユーザーは 見捨てることになる罠。
糞スレ常時アゲ
COM になっていれば、.NET 連携は簡単だし、オレなんか ActiveX 使いたくて、.NET憶えたえた後にいまさら COM 何ぞ勉強中なんだけど。
799 :
デフォルトの名無しさん :03/02/10 23:19
すいません。 基本的な事(しかも厳密にはCOMの質問ではない)かもしれませんが、 質問があります。 BSTRな文字列を使用する場合はにSysAllocStringを使用しますが、 こいつをSysFreeStringするのは誰がやらなければいけないのでしょうか? たとえば、 コンポーネントのメソッドに HogeA(BSTR strHoge) があった場合、コンポーネント内部でSysFreeStringを行う必要があるのでしょうか? また、コンポーネントのメソッドに HogeB(BSTR* strHoge) があった場合、(値を返す場合)SysFreeStringが行うのでしょうか? また、IConnectionPointなイベントで、HogeAのようなイベントがあった場合、 イベントを受け取ったクライアント側でSysFreeStringを行うのでしょうか? すいません、ご教授願います。
HogeBはIDLに依存だった。 [out]BSTR* hoge なら、呼ばれた側は解放せずに確保 [in,out]BSTR* hoge なら、解放してから確保。
>>800 ,
>>801 レスありがとうございます。
大変参考になりました、これで安心して作成できます。
しかし皆さんMSDNの解説ソースをよく発見できますねぇ(失礼な言い方ですが変な意味じゃないです)
自分なんかは膨大な情報量ですぐにソースが発見できません。
やっぱり英語力とかでしょうか・・・・
ありがとうございました。
804 :
デフォルトの名無しさん :03/02/22 16:51
COM+
macross+
age
807 :
デフォルトの名無しさん :03/03/13 16:24
BC++5.5 でCOM関連のプログラミングってできますか?
保守&質問です。 Win32 API質問スレからこちらを紹介されました。 COM で QI して得たポインタが サスペンド/ハイバネーションを行なうと、無効になる ことがあります。色々調べたら 6分通信がされなかったらポインタを無効にする仕様だ そうですが、うまい回避策(workaround)を知っていたら教えて下さい。 ちなみに QI したポインタを全部覚えておいて、レジュームメッセージを受けとって、 Release() -> QI しても、先にポインタを使われることがあって、だめみたい。 (´・ω・`)
>>809 誘導されてきた場合、その旨伝えたほうが良いらしいよ
とりあえず
WM_POWERBROADCAST / PBT_APMSUSPEND
などでサスペンドを検知して対処するとか
>>810 ああ、向うでもこっちでも伝えましたよ?
それから、メッセージで処理すると
> ちなみに QI したポインタを全部覚えておいて、レジュームメッセージを受けとって、
> Release() -> QI しても、先にポインタを使われることがあって、だめみたい。
と書いた通り。もちろん、サスペンドする直前に Release() しちゃっても、レジューム
する時に、レジュームハンドラの処理以前にポインタに触られると落ちます。
で、困ってます。
812 :
デフォルトの名無しさん :03/03/15 16:12
RegisterServerやUnRegisterServerをインストーラ無しで自動化する 方法ってないですか? インストーラだとサイズがでかくなるし、手動だと初心者は門前払いになって しまうし、なによりめんどくさい思いをさせてしまう。
>>812 アウトプロセスサーバにして、起動するだけで登録するようにする。
削除は-uオプションにでもすればいいんじゃない。
>>812 inprocDLLをCPLにしてコントロールパネルでインストール/アンインストール可能にする
そのオブジェクトを使うexe側が、dllを探してきてRegisterServerする。 (何のためのCOMや、、、)
>>813 、
>>815 それは、毎回exeを起動するたびにRegisterServerするってことですか?
確かにそれは良さそうなんだけど、なんか不安感が拭えないですね。
重くなりそうだし、レジストリ毎回書き換えることになりませんかね?
でも、やっぱり、それしか方法は無いのかな・・・
816の名前は813ではなく、812です。すいません。
本当に切られちゃったという洒落にならない話
>>816 レジストリに書き込むタイミングぐらい、自分の好きなようにすればええやん。
>>813 ,816
んなこと無いよ。事実MFCのEXE系COMサーバは、そうやってるし。(逆に、/regserver
は自力でやらにゃならんかった。VC4の頃の話だけどな)
821 :
デフォルトの名無しさん :03/03/16 13:40
レジストリに登録した後、DLLを別のフォルダにコピーしたら、 また登録が必要ですか?
レジストリにはコンポーネントのパスが記録されているから コピーしても元のファイルを参照しに行くだけで問題はないです。 もちろんコピー先のファイルは何も意味はもちませんが。 移動したのであれば再登録が必要です。
>>822 なるほど。
では、パスを変えて再登録した場合、二重に登録されますか?
それとも、上書きされてしまうのですか?
>>823 GUID が同じものが別々登録されたとすると COM の概念から言ってどうなると思いますか?
と答えておきます。
>>824 なるほど。やってみたら、上書きされるみたいですね。
>>825 上書きされないとバイナリが一つに絞れないということでしょうか。
ありがとうございました。
/ ̄ ̄ ̄ ̄ ̄ ̄ | フサでーす \ ______ V ∧ ∧∩ ∩∧,,∧ ( ^д^)/ 目 ヽ(・ω・`) ⊂ | || ミ ⊃ 〜| | .|| ミ ミ〜 ∪ ∪ || ∪ ∪ /| / ̄ ̄  ̄ ̄ ̄ ̄ | ・・・・・・( ´・ω・)。 \_______
828 :
デフォルトの名無しさん :03/03/17 15:30
TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset))); こうやってnewしたインスタンスってどうやったらdelete出来ますか?
829 :
デフォルトの名無しさん :03/03/18 16:16
ADO-MFCでパラメタクエリーする場合、どう記述するのか教えて下さい。 UNICODEでなく、SJISです。これだとうまくいきません。 VARIANT vParam; vParam.vt = VT_LPSTR; vParam.pcVal = pcValue; _ParameterPtr pPrm = __getParameterPtr(ParamName); if (pPrm == NULL) { pPrm = FCmd->CreateParameter( ParamName, adChar, adParamInput, iLen, vParam);
830 :
デフォルトの名無しさん :03/03/24 20:10
COMのBSTRとは何者ですか。 アスキーですか。ウニコードですか
プラットフォーム依存でごわす。
>>831 それをSJISに変えるにはどうしますか?
うーん?USES_CONVERSIONしてWideCharToMultiByte?
SJISとUNICODEでお腹いっぱいなところに、BSTRが入るCOMて、いったい...
835 :
デフォルトの名無しさん :03/03/26 20:31
dllファイルからIDLファイルを生成するツールを捜しています。 どなたか知りませんか。
836 :
デフォルトの名無しさん :03/03/28 11:37
ATL、MFCを使用しない方法で、 イベントを受け取りたいんですが、 どこかにわかりやすく紹介されているサイトないですかね。 イベントが受信できず、はまっとります。
>>836 BCB使う。
VCLの中でメッセージハンドラが受けてて見やすい。
>>837 CBuilderでつか?
すんません、もってないんですよ・・・・・・
VisualStudio.Netしか・・・・。
しかも、IdispachされてないCOMなので、オートメーションは
つかえないんでつ・・・・
>>838 COMを作る側と使う側とわけわかになる、まさにCOMの弊害。
BCBにしてCOMを捨てるべき
ふむふむありがとうございます。 しかし、VCLって情報が少ない??ですね。 どんなクラスがあるのか知りたくても、ほとんど情報がない。 英語ならあるのかな・・・・ 自分が欲しい機能がないのに試しに購入するのも バカらしいので、調べてみまつ。 ま、平行して.netで開発を続けるわけですが・・・・
>>840 .NETよりはコンポーネント多いよ。
ソース付のフリーのコンポが無限にある。
844 :
デフォルトの名無しさん :03/03/29 08:44
VC++でEXCEL、IEなどを使いたいのですけれども いまいち、COMがわかりません 教えてください!!!
基本的にはBSTRは自身のサイズ情報を格納する領域を持ったUnicode と理解すればいいでしょう。正確にはUnicodeに限らずバイナリ データを入れても構いません。サイズ情報を持っているので Nullも入れることが出来るからです。
L'\0'とNULLはちげーだろ、って言いたい
>>846 NULLとは書いてないだろ。
Null文字のことだよ、ボケが。
848 :
デフォルトの名無しさん :03/03/29 15:59
COMでEXCELは使えません
言語によってはnullだったり大文字小文字を区別しなかったりするから やっぱりいまいちだと思う
COMなしでIEやEXCELを使おうとしたら 大変だろうな。
>>850 ウデ利きのプログラマなら、処理性能(スループット)だけなら何とか
なるかもしれないが、生産性はお話にならない予感・・・。(-_-;
>>851 分からんぞ。良い感じのインターフェースを持ったクラスに仕上げてくれるかもしれん。
COM無しっていうと DDEやSendMessageやkeybd_eventなどか? たとえ腕利きでもまともな性能を出せるとは思えないが
COM無しなら、OLE2あり?
855 :
デフォルトの名無しさん :03/04/01 19:39
質問です。 VBで、アーリーバインド ←→ レイトバインド のコードの相互変換をしたいのですが、例えば、 Set objHoge = CreateObject("Hoge.Instance") というコードをアーリーバインドに書き換える場合、"Hoge.Instance"の 文字列から、参照すべきライブラリのフルパス、ファイル名、型名 (Dim Hoge As Library.Type)を調べる方法はありますか? また、その反対に、アーリーバインドで Dim Hoge As Library.Type と宣言しているコードを Dim Hoge As Object に書き直す場合、 CreateObject(Arg) の文字列を調べるにはどうすればよいのでしょうか?
>855 レジストリエディタで HKEY_CLASSES_ROOT 以下に ProgID は登録されています。 あなたのいう Hoge.Instance という文字列のことです。このキーのサブキーとして CLSID というキーがあります。 ここに書かれている CLSID と同じキーを HKEY_CLASSES_ROOT\CLSID キー以下から 見つけます。そこにあなたの望む情報が登録されているはずです。 ご存知かと思いますが VB の場合、アーリーバインディングには 参照設定が必要です。単にソース上で型を定義しても VB には なんのことか判らないためです。 また参照設定で目的のコンポーネントを探すには TypeLib 名として 登録されている名称で探す必要があります。 CLSID キーのサブキーである TypeLib に書かれている ID と同じキーを HKEY_CLASSES_ROOT\TypeLib キー以下から見つけます。 このサブキーに 1.0 などというキーが有ると思います。 これに書かれている名称が登録されているタイプライブラリ名です。 参照設定ではこの名称をさがすとよいでしょう。 OLEVIEW などのツールをつかうことでもう少し効率的に情報を 取得することもできるでしょう。
857 :
デフォルトの名無しさん :03/04/02 09:20
>>856 ありがとうございます。(結果報告は後ほど・・・)
858 :
デフォルトの名無しさん :03/04/02 22:48
COM使えば ソース->COM用ソース->コンパイラ->COM生成 という感じで実行時型生成できそうな気がするんだけど どうなのでしょうか?
>>856 遅くなりましたが、お蔭様で無事に解決できますた。m(_ _)m
(^^)
861 :
デフォルトの名無しさん :03/04/18 04:02
Essential COM を読み始めたんですが、 Visual C++でコンパイルしたDLLが、他のコンパイラで 利用できないってのはホントなんですか? DLLって使ったこと無いから、よく分からないんですが。
それはたしか、「C++クラスをエクスポートしたDLLは、 ほかのコンパイラでは利用できない」、って話だろ。 そのとおり。
∧_∧ ( ^^ )< ぬるぽ(^^)
∧_∧ ( ^^ )< ぬるぽ(^^)
はじめましてこんにちわ、いま、VCでCOM(ATLウイザード)で 作ったCOM(DLL形式、タイプライブラリ)をVBから つかっているのですが、現在つかっているCOM別に新たに COMを作って、C++でいう継承をしたいのですが、 簡単に説明すると 新規で作ったCOMクラスBとしてC++でいう 基本クラス、現在つかっているCOMをAとしてC++で言う派生クラス (ちなみにA,BもおなじATLウィザードクラス?なかにつくります。) 例 class A : public B { インターフェイス関数 drawA } class B{ インターフェイス関数 drawB } //したい事 A *tmp; tmp = new A; tmp->drawB(); ←というようにしたいのですが。 どうもうまくいきません。 どうも、インターフェイスのインプリメントとなるメニューを発見して 実行しました。VCのクラスビュウでは、ちゃんと、Bのインターフェイス がAのクラスにはいっているのですが、VBから呼び出した場合 インターフェイスの関数名がでません。(メンバ一覧にのっていません) うまく説明できてないところがありますが、どなたかご存知な 方おしえてもらえないでしょうか?よろしくお願いします。
カスタムインターフェイス... えっ? IDispatch インターフェイス?
867 :
デフォルトの名無しさん :03/05/22 18:58
ActiveXコントロール作ってるんですが、 それに別のActiveXコントロールって貼り付けられますか? 一体どうやればいいのでしょうか。 貼り付けたらダイアログが出てこなくなってしまうんです。
まじでわかんないですけど。誰か助けてください。 ちなみにMFCです。 カスタムコントロールやActiveXを貼り付けるとダイアログが消失します。
869 :
デフォルトの名無しさん :03/05/27 17:32
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
はぁ、やっぱり誰も回答してくれない。 もうActiveXなんて廃れてるよな。 COMなんて今さら勉強したくないのに。 会社辞めてやる!
廃れてるけど情報源はちゃんとあると思うよ。 それを探せないなら辞めたほうがいいんじゃないかな。
COMアゲ
874 :
デフォルトの名無しさん :03/05/31 04:41
未だにCOM使ってる香具師は素人。
876 :
デフォルトの名無しさん :03/06/02 11:51
COMで構造体をやり取りしてもいいものでしょうか? IDLを typedef struct _a{ int a; int b; } a; interface [ 略 GetData(a *pVal); みたいに書いて、クライアントでは a data; interface->GetData(&a); とかしてIDLで定義した構造体をやりとりしたいんです。 MIDLでは標準のインターフェイスじゃないみたいな警告がでるんですけどね。 データが数100個あるから、インターフェイス作って プロパティをそれだけ書くのはめんどいというかためらわれるんです。 やっぱりきちんとインターフェイス作った方がいいですか?
VBからプロパティとして見えることが重要かどうかによる
インターネットエクスプローラーにオリジナルのツールバーを作りたいのですが、 何を勉強したら良いでしょうか。または参考になるサイト、お勧めの書籍などございましたら、 教えてください。
>>879 ありがとうございます。とても参考になりました。
また長年悩み続けてきたものが解決されました。
ほんっと感謝してます。
COMって決まり事が多くて俺の脳みそではきつい。 なので、こんなんだったら簡単というCOMを考えてみた。 しょうもなかったら笑って許してください。 ・インターフェースポインタは、関数ポインタの配列。 (vtblへのポインタではない) ・サーバは、_new_object(インターフェースポインタを返す)と _delete_object(オブジェクト削除)という関数をエクスポートする。 ・サーバは、xmlでインターフェース定義を書いて、 バイナリとともに配布する。 ・クライアントはnew_objectでインターフェースポインタを受け取る。 Cでクライアントを書くと、 struct treeview{ void (*set_visible)(int value); }; treeview *obj; obj=new_object("/window/treeview",1);//DLLをロードしつつ1個作る obj->set_visible(TRUE); という感じ。
COMってさー、GUIDとかレジストリ使ってる時点で終わってると思う。
mozillaをバカにするとは・・・愚かな奴
>881 簡易COM的な仕様のDLLを作るのは、COMでレジストリを 汚すのがいやな場合なんかには有効なテクかもね。
厨房ほどレジストリが汚れた・汚れたってうるさいんだよな。 特にHKEY_CURRENT_USER\Softwareに書き込むだけで騒ぐ奴はどうしようもない馬鹿。
でも厨房はCOMがHKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSIDに書き込んでも気づかなかったりする。
hoge
888 :
デフォルトの名無しさん :03/07/24 00:45
プロセスが使用しているCOMコンポーネントをリストアップする方法って あるんでしょうか?? 教えてくださいーーー。
889 :
デフォルトの名無しさん :03/07/26 18:18
あげ
890 :
デフォルトの名無しさん :03/07/27 09:09
891 :
デフォルトの名無しさん :03/07/27 09:11
>888 Comspy
893 :
デフォルトの名無しさん :03/07/28 01:44
>892 さま サンクスです。明日試してみます。zzz・・・。
894 :
デフォルトの名無しさん :03/07/30 00:48
c#やVBScriptでいうところの
foreach (object o in hoge){
fugafuga():
}
という処理をMFCでやる場合は
ttp://www.eternal.nest.or.jp/~shiro/macosx/life0302.html の2/21であるようにやるといいのでしょうか?
こんな感じのコードを組んだんですが、
IEnumVARIANT::Next( 1, &childVariant, &numfetch );
のnumfetchがどうしても0でしか戻ってきません。
なにか足りない点がありましたらご教示ください。
(具体的なコードが必要でしたらその都度晒します)
(^^)
VB6でEXCELのCOMアドイン登録方法について教えてください。
システムアドインとして登録(HKEY_LOCAL_MACHINE に書き込み)せずに、
システム上の全てのユーザーで使用できるようにしたいのですが、
誰かご存知の方いらっしゃいますでしょうか?
http://support.microsoft.com/default.aspx?scid=kb;ja;290868 MSサポート↑では、HKEY_USERS\.DEFAULT・・・・に書き込むことで可能だと書いてあるのですが、
うまくいきません。
実装したいことは、「COMアドイン」ダイアログで、ユーザーが必要に応じて
アドインを有効にしたり無効にしたり出来るようにしたいのですが・・・・。
よろしくお願いします。
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
DCOM = 'COM ' - MTS
com
華麗に900get
901 :
デフォルトの名無しさん :03/10/05 10:52
age
今、COM+を勉強しているのですが.NETでは使われているのでしょうか。 又使われているとしたらどのような形なのでしょうか
思想として受け継がれている部分はあるが .NET 自体は COM を もう含んでいない。ただレガシーな機能として相互利用はできるが。。。
どこかの板で.NETの中でネイテブな部分でその技術が生かされている と見たような気がするのですが、どんなもんでございましょう。。。
905 :
デフォルトの名無しさん :03/11/07 20:41
OLE/COM Object Viewerでみると、System.*が大量にあるけど、それのことかな。
906 :
デフォルトの名無しさん :03/11/21 01:33
Inside COMを読みたいんだけど、どこも品切れ。 ひょっとして絶版?
COMと.NETでは全然違った問題意識から作られた規約群だから共通部 分が見えなくて当然。WindowsのMS提供コードの多くはCOM出現以来 それに拘束されており、.NETの低レベル部分も例外ではない筈。
908 :
デフォルトの名無しさん :03/12/06 21:52
age
909 :
デフォルトの名無しさん :03/12/06 23:34
.NET ってそんなに便利? COM勉強はじめたけど、IDLだったかを 一々書かないといけないのがマンドクセ。
そんなお前はIDLがないだけでも便利さを感じられるだろう。
>>909 ATLの属性付きプログラミングを使えば?
>> 905 それかもしれない >> 906 そうみたい。Inside COM+は おいらが注文した時は最後で、日焼けした物が一冊しかなくそれで良いかと 問い合わせが来たので増刷する予定を聞いたら増刷する予定はないといわ れた。少し割り引けと返事したらダメと言われシブシブ買った。 >> 907 おぉー すごい >> 912 「属性付き」というのはよく解らないけどATLでCOMを作るのは簡単そう? みたい。 ただ、クラスメイとそのメンバ関数を記述すればいいみたい?
>>913 そこまで簡単じゃないけど、あれが難しいというのなら COM が行う処理の
中身の方が書けないんじゃないかな、ってレベル。
どなたか、IEコンポーネントを使い倒すスレの次スレを立てて いただけませんか?
916 :
デフォルトの名無しさん :04/01/28 12:44
HTMLに<OBJECT>タグで埋め込んだActiveXを、 同様にして埋め込まれた別のActiveXからメソッドを呼び出したり プロパティーをセットしたりというのは可能でしょうか? よろしくお願いします。
917 :
デフォルトの名無しさん :04/01/28 12:47
いまだに64KBの壁引きずってるスレはここですか?
引きずっているのはスレではない
フィルターとCOMってどう違うの?
920 :
デフォルトの名無しさん :04/01/30 14:24
とりあえずこのスレでなんか作ってみないか? ORG 100H ↓次よろ
921 :
デフォルトの名無しさん :04/01/30 19:31
M$って1つのものにあれこれややこしい名前付けたり、複数のもを1つの言葉にまるめるの好きだよね、たぶん社内用と社外用を使い分けてるね
924 :
デフォルトの名無しさん :04/02/01 08:37
MFC ActiveXウイザードが吐き出したコードにデュアルインターフェースを 追加しようとしているのですが死にそうです。 とりあえず BEGIN_DUAL_INTERFACE_PART(MyDualInterface, IMyDualInterface) というのを追加してみたのですが、 error C2504: 'IMyDualInterface' : 定義されていない基本クラスが宣言されています。 といわれてしまいます。ODLファイルにインターフェースを追加するだけじゃ だめなんでしょうか? サンプルのACDual.hはなにかに自動生成されてるようですが自分のプロジェクトには それらしきものは見当たらないし。。。
>>924 何て言うか取りあえずなんかインクルードしなきゃいけないんじゃないの?
素人だけど。
そうみたい。でもこれって自動生成っぽいんだけどどうやって作るんだろう。。
自己レスです。 こまんどぷろんぷとからmidlコマンドをつかって作成できました。 どうやら作成されるヘッダファイルの名前と同じファイルが既にあったため作成されてなかったみたいです。 出力ヘッダファイル名を変えたら作成されました。
928 :
デフォルトの名無しさん :04/02/22 17:44
COMの初期化のために CoInitializeEx(NULL, COINIT_MULTITHREADED); とすると、ファイルを開くコモンダイアログで、 マイコンピュータを選択したときに何も表示されなくなってしまいました。 (ふつう、ドライブとかの一覧が出ますよね) COINIT_APARTMENTTHREADED なら問題ないのですが…。 STAが作成されるか、MTAが作成されるかの違いだと思うのですが、 これでコモンダイアログの挙動まで変わってしまうのでしょうか。 ぐぐと格闘したのですが、、、ダメでした。
929 :
名無し@沢村 :04/02/22 19:59
ザコよ、COMの世界を斬ってどうする? いいかCOMは人間が考え出したものだ。だからザコよ、おまいが斬らなくてもCOMの世界はすべてが明らかになっている。 いいかすでに明らかになっているものをいまさら斬ってどうするよ? いいか斬る価値があるのは、神が考え出したものだ。 だからDNAの世界を斬るというのなら、価値があるよ。 だがCOMの世界を斬っても何の価値もないぞ!!ザコよ!!
931 :
デフォルトの名無しさん :04/02/23 10:10
DrCOM MonitorのラインでCOMのどのメソッドにアクセスしてる、どのイベントが返ってきてる とかいうレベルまでわかるツールない?ないだろうな。 Spy+は問題外。TracePlusもDrCOMには勝てないという結論。
933 :
デフォルトの名無しさん :04/03/07 22:53
COMの関数のアドレスはどうやったら取得できるのですか? APIフックと同じように、COMの関数呼び出しにフックかけたいのですが、 関数のアドレスがわからないとどうしようもないので…。
935 :
デフォルトの名無しさん :04/03/08 00:19
インターフェイスへのポインタを取得したいわけじゃないんです。 別の言い方すると、インターフェイスを介して関数を呼び出したいわけではなくて、 関数の呼び出しを監視するために関数のアドレスそのものが欲しいのです。 舌足らずで申し訳ないっす。 APIの場合は関数のアドレスはインポートセクションのアドレステーブルにあるので フックは簡単だったのですけど…。
>APIの場合は関数のアドレスはインポートセクションのアドレステーブルにあるので 単純にGetProcAddrしたらいい話じゃなくて? もっと静的な話?オフセットを定数で持ちたいとか。
>>937 COMにどうやってGetProcAddresを使うんだ?
そもそもGetProcAddresはDLLにしか使えないじゃん。
>>937 APIが呼ばれる前に自分の関数を呼び出してもらうために(つまりAPIフック)
インポートセクションのAPI関数のアドレステーブルを自分の関数の
アドレスで上書きするんです。ほんと、舌足らずで申し訳ないですw
>>936 vtable書き換えればいいような気がするんですが、
インターフェイスを介してvtableにアクセスできるのですか?
そしてvtableの仕組みってどうなってるんでしょ。どうやって関数名の参照の
解決してるのかご存知ですか?
>>942 あのさ、あおりでも攻撃でもないんだけど、vtable の仕組みがわかんない人に
COM のインタフェイスのフックの仕方なんて説明できると思う?
このスレで C++ の基礎について説明求めるのって非常識だし非効率っぽくない?
C++ 勉強してから、Universal (Anonymous) Delegator とか調べてみるといいよ。
>>942 アクリゲージョンを使って継承っぽいことをすればよい。
COMのvtableとC++のvtableが同じだと思ってるやつがいるな いくらC++のお勉強したところで、COMのvtableには辿り着かないよ
>>947 C++ の勉強をしないでもたどり着けるとでも言いたげな書き込みに見える・・・
とにかく 942 のやりたいことなら APIhook + universal delegator で簡単にできる。
(別に universal じゃなくてもいいけど)。漏れはキミより頭いいよ、ってだけでなんらの
情報の無いカキコは・・・2ch の花なのでいいのか orz
それしかストレス解消の手段が無いんだよ。見逃してよ。
Delegatorすごい役に立ちそうです。どうもありがとうございました。
952 :
デフォルトの名無しさん :04/03/31 22:15
モニカがよく分かりません。参考になる本やサイトはありますか?
↑ユリアソ発見。
955 :
デフォルトの名無しさん :04/04/04 15:47
age
あげとこう。
957 :
デフォルトの名無しさん :04/05/30 01:44
純粋に C だけで COM コンポーネントを書いてみた。 楽しかった。 チンコ
958 :
デフォルトの名無しさん :04/06/13 13:06
DllRegisterServer で登録する具体的なレジストリの値がわからないんですけど どこかに書いてありましたっけ?
>>958 どういう COM サーバかによると思うけど。
インプロセスサーバかどうか、とか。
>>959 今取り組んでるのはインプロセスサーバです。
英文なら資料あるのかなぁ…
>>961 >>960 のスレで、俺ちょっと前にピュアCでCOM書いた
って話を載せたんだけど、そのときに参考になるリンクとか
いくつか書いたから読んでみては?
963 :
デフォルトの名無しさん :04/06/13 16:15
.netによってCOMの役割が終わりましたので、 このすれももうすぐ終了になりますね。 長い間ありがとうございます。 もうあうこともないとおもいますがお体に気をつけてください。
964 :
デフォルトの名無しさん :04/06/13 17:52
>>959 アウトプロセスサーバはDllRegisterServerを使うわけないと思います。
dllではないのですから。
.netやるとCOMやる気がでん... .netのコンポーネント化らくすぎ。 COMはC++とかだと言語との違いがありすぎてかくのが面倒。
>>965 まぁ俺もそう思うが、
それでもしぶとく C/C++ + COM は生きのこっていくんだろうなぁ。
OSごと C# なんかで書けるようになるとは思えないし。
とはいえ、C の中でインラインアセンブラを使うような
感覚になるんだろうな。C# から COM を使うのって。
967 :
デフォルトの名無しさん :04/06/20 09:30
.netなんてMSが商売するために作った言語だから こんなものに依存してはいけない。COMはCOMでわが道を行け。
COMは商売のためではなかったのか?
969 :
デフォルトの名無しさん :04/06/20 09:40
>>913 スペースで間を空けるな糞が、>>は引用符じぇねぇ参照符だ。
何おしゃれさん気取りしてんだか。
>>969 去年のカキコにカッカするなよ (クールワラ
>>965 VS .NET 2003 で ATL 使うと激しく簡単に非マネージドの COM 書けるよ。
イベントもインタフェイスに型書いて、raise するとこで __raise 一行で発火できるし。
C# 側ではプロジェクトを参照するだけでラッパクラス作ってくれて using できるし。
凝った UI とかいらなければ .NET framework で大体なんでも出来るんで、
あんまり生 COM は必要なくなってるのは確かだけど・・・
VB6の需要もまだあるから、.NET環境でも動作保証されたCOMというのは 使い道あるけどね。
>VB6の需要もまだあるから、.NET環境 負け組み合併?
ExcelのVBAから呼び出すCOMオブジェクトを作成しています。 開発が進めば進むほど、ExcelVBAからCOMを呼び出すのが どんどん遅くなりました。 レジストリが原因だと思うんだけど、具体的にどんなツールでどんなことをすれば 速くなるんだろう。 えらい人教えて。
974です。 他のところで聞いてみます。 ありがとうございました。
976 :
デフォルトの名無しさん :04/06/25 01:24
あげとこう。
977 :
デフォルトの名無しさん :04/06/29 14:10
本の話で持ってない方には申し訳ないんですが、Essential COM P68の [object, uuid(ry] interface ICatDog : IDog { // 基底を複数持つのは違反 HRESULT Meobark(void); } の「基底を複数」ってどのへんが複数なのかわかります?
多重継承が出来ないということ。なんでこんなことがわかんないの?
少なくともコード上では単一継承してるようにしか見えないが、コメントから察するに何か自分が気づいてない形で多重継承しているので消化ってことでそ。 もれも単一継承しかしてないように見える。 interface ICatDog : ICat, IDog {~ ならわかるけど。
>>979 前置きのソースが半ページくらい割いて載ってるんですけども、
写し間違いとかやらかすとまた大変なんで写すのはやめました。
そっちを見てもやっぱり多重継承には見えないんすよね。
errataも見たけど出てないんでここはこういうもんだと思ってスルーします。
>>980 単にミスプリじゃない?
p68の中ほどに「実装では可能」と
class CatDog : public ICat, public iDog {
なんていう例が出てるから
interface ICatDog : ICat, IDog { // 基底を複数持つのは違反
としたかったのではないかと想像してみる。
>>981 その本知らないけど、「基底を複数持つのは違反(なので単一継承にする)」という
意味なのでは?
>>981 IDLとC++がごっちゃになってませんか?まったく別の言語ですよ。
>>983 ごっちゃになんてなってない。
持ってるんだったらEssential COMの68ページを見てくれ。
それで
>>981 に書いた意味がわかると思う。
>>984 っていうか、このスレを少し遡って読むだけでも状況は分かるよね。
COMってかならずレジストリに登録しなきゃいけないの? WindowScriptComponentみたいに、同じフォルダにあるだけでいきなり 使えるようになるには、どうしたらいいのかしらん。