5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

COM の世界を斬る!

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
書いたことあるけど、面倒なので素直に本読んどけ。

6 :4:2001/02/11(日) 03:15
>5
すみませんが、参考書籍名など教えていただけないでしょうか。
自分ではそれなりに探したのですが店頭にある書籍には
出ていないもので、タイトルがわかれば注文するつもりです。



7 :VB使い:2001/02/11(日) 03:41
ショートカットの作成ってオートメーション使ってできないの???


8 :5>6:2001/02/11(日) 03:57
OLE2なんとかって本と、あと色々。
とりあえず図書館逝っときなさい。

9 :デフォルト:2001/02/11(日) 04:55
アウトプロセスサーバでインターフェイスの解放を忘れるとメモリリークに
なるのはわかるんだけどインプロセスサーバだったらクライアントの終了時
に解放されるような気がする。間違ってるかなぁ。



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
コード紹介してくれませんか???


13 :デフォルトの名無しさん:2001/02/13(火) 01:11
FAQなんだから自分で調べなさいって。じゃないと厨房って言われちゃうぞ。

14 :デフォルトの名無しさん:2001/02/13(火) 01:26
ここの過去ログ検索してみなさい。

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


17 :デフォルトの名無しさん:2001/02/13(火) 07:46
warata

18 :デフォルトの名無しさん:2001/02/13(火) 11:47
私のようなロースキルのプログラマにはCOMはむつかしすぎます・・・
私にできるのは CComPtr を使って COMオブジェクトを利用することぐらい。

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

こんな難しいモンを将来標準にされると辛すぎます。っつーのが私の感想です。


19 :デフォルトの名無しさん:2001/02/13(火) 19:07
MFCやATLも使わずにコンポーネントを使えるぐらい理解している奴なんて
そういるもんじゃない。まあ難しいことはわからなくても使えるようにす
るためのもんだしな。この手の掲示板ではさすがにレベルが高すぎるんじゃないか?
おれも良くわかんねーし、つーか俺が馬鹿なだけか???


20 :デフォルトの名無しさん:2001/02/14(水) 03:41
この板人少ないね。ぽつり。

21 :デフォルトの名無しさん:2001/05/01(火) 09:30
#沈んだすれをサルベージ。

COM初期化
CoInitialize(NULL);
って、普通はこまめには呼ばないって聞いたんですけど、
どういう時に呼べばいいのでしょ。
ご存知のかた教えてください。
(こむちょー初心者質問でスマソ)

22 :デフォルトの名無しさん:2001/05/01(火) 09:54
>>21
プログラムの一番最初

23 :デフォルトの名無しさん:2001/05/01(火) 14:59
>>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
あ、処理系は
http://www.activeware.com/
ね。

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
>39
書籍はこの辺でどうよ。
http://www.amazon.co.jp/exec/obidos/search-handle-form/249-5193886-0877137

44 :43:2001/05/05(土) 03:09
エラーになっちまうので、以下で
「CORBA」で検索。
http://www.amazon.co.jp/

45 :デフォルトの名無しさん:2001/05/05(土) 19:17
「インサイドCOM+」は全然インサイドじゃない・・・

46 :デフォルトの名無しさん:2001/05/05(土) 19:50
COMってなんですか…。

47 :デフォルトの名無しさん:2001/05/05(土) 19:54
>>46
レッツゴ−以下のサイト。
http://www.microsoft.com/japan/developer/thisweek/combasics/combasics1.asp

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
プロパティ、メソッド、イベント、名前付き定数など、
クラスの詳細な記述が含まれたリソースである

54 :デフォルトの名無しさん:2001/05/07(月) 13:34
タイプライブラリ自体は何で作るんですか?
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
>>65
レジストリのProgID見れ

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 オブジェクトが単一のシステム
上で共存できる。

73 :デフォルトの名無しさん:2001/06/06(水) 04:15
>>70
先月、秋葉の書泉ブックタワーで売ってるのを見かけたぞ。

74 :中級ぐらいです:2001/06/06(水) 18:56
>73
Inside COM じゃなくて?
んじゃ、飛行機乗って行ってみっかな。
交通費が往復6万ぐらいしそうだ。

75 :デフォルトの名無しさん:2001/06/06(水) 22:09
>74
イヒヒ!おれ今日かっちゃた!

76 :デフォルトの名無しさん:2001/06/07(木) 23:29
通販でも買えるのでは? >Inside OLE

77 :デフォルトの名無しさん:2001/06/08(金) 01:11
>通販でも
amazonでも品切れなのに......。

78 :デフォルトの名無しさん:2001/06/08(金) 14:32
再版してくんねーかな?それともCOMの知識なんてもう必要ないっつー
メッセージなのか?ワラ

79 :デフォルトの名無しさん:2001/06/11(月) 22:55
いくらするんですか?その本。

80 :名無しさん:2001/06/11(月) 23:31
>"com" は一般すぎる言葉のため、 検索には使用されていません。
氏ね。

81 :デフォルトの名無しさん:2001/06/12(火) 08:37
InsideOLE
関東近辺での発見情報求む

82 :このスレ初書き込みの人:2001/06/12(火) 20:31
Inside OLE
先週秋葉原の書泉ブックタワーは売り切れだったので
そのままLaox(?)の一階にある本屋に行ったら売ってたよ。

・・・
・・・
・・・
・・・
・・・・・・・・・・漏れが買ったから在庫あるか知らないけど。(^^;)

83 :デフォルトの名無しさん:2001/06/12(火) 20:31
hage

84 :デフォルトの名無しさん:2001/06/12(火) 21:26
>>82
くれ

85 :デフォルトの名無しさん:2001/06/12(火) 23:01
>>84
良いよ

86 :82:2001/06/12(火) 23:30
>>85
コラッ!!

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ページ以上(電話帳並)あるし妥当な価格だと思う。

90 :デフォルトの名無しさん:2001/06/13(水) 00:29
ちきしょーちきしょおおおう。

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分かかるんですけど。
こっちのほうがやばくない?

97 :デフォルトの名無しさん:2001/06/15(金) 05:12
>おーる
昨日秋葉原Laox逝って来た。
InsideOLEあった。見本まであった。
買おうとおもーたけど、金なかった・・・涙
教会に行く。でもあそこまだまだ沢山ありそうなので、
遠くて行けそうもない人も問い合わせてみる価値ありそう。
店頭に一冊しかなかったけどまだまだあるよ多分。
LaoxがInsideOLEを隠してるの間違いなし(ワラ
今日青いシャツでInside・・・買ってるのがいたらそれ俺だから
よろしくv(゚9゚)

98 :デフォルトの名無しさん:2001/06/15(金) 07:59
>>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
なんどもスマソ。

今見てきたら、US の MSDN ライブラリのサイトでは
Inside OLE(英語)がまだ公開されてるみたい。
 http://msdn.microsoft.com/library/default.asp

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の初版ね)でしたから・・・
大昔に大量に仕入れて大量に在庫抱えてるのかな(^^;)

106 :名無しさん@お腹いっぱい:2001/06/16(土) 17:48
見本置いてるなんてやっぱ大量に持ってるんだよ、絶対。

107 :197:2001/07/05(木) 21:07
COM初心者です。
MFCオートメーションでイベントをクライアント側に返したい
時はどうすれば良いのでしょうか。よろしくお願いします。

108 :デフォルトの名無しさん:2001/07/05(木) 23:19
>>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
あたりの事?

115 :デフォルトの名無しさん:2001/07/12(木) 00:07
気狂いそうだ。

氏氏氏氏氏氏氏氏氏氏氏氏氏。げろげろ。

116 :デフォルトの名無しさん:2001/07/12(木) 00:32
>>113
ソース読む

117 :むずい:2001/07/12(木) 00:36
>>114
そうです。
特にクライアント側。

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
しかし、そんなアホウな参考書ってどこにある?

122 :デフォルトの名無しさん:2001/07/15(日) 23:10
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


132 :age:2001/07/19(木) 16:34
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
最初スペルミスかと思ったら英語ではレイトバウンドというのね
どこからバインディングになったんでしょうね
知っている人がいたら教えてね

136 :デフォルトの名無しさん:2001/07/20(金) 08:20
>>135
英語でもlate-bindingはlate-bindingだ。

late-binding == 実行時バインドする
late-bound == 実行時バインドされる

137 :デフォルトの名無しさん:2001/07/20(金) 09:56
VariantCopyInd使うべきなのにVariantCopy使ってて死にました……
でも闇雲にVariantCopyInd使ってると、メモリーリークする?

138 :135:2001/07/20(金) 12:28
>136
辞書見ました。
私が英語に無知なだけでした。
御免。

139 :デフォルトの名無しさん:2001/07/20(金) 17:26
>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なわけだから)

141 :石川五右衛門:2001/07/22(日) 14:15
すいません、COMがうまく斬れないのですが、私の斬鉄剣に
何か問題でもあるのでしょうか?

142 :デフォルトの名無しさん:2001/07/23(月) 23:40
OleRunとは何をやっているのか。

143 :デフォルトの名無しさん:2001/08/03(金) 02:41
age

144 :デフォルトの名無しさん:2001/08/04(土) 14:10
厨房な質問ですが,
COMの利点はどんな言語からでも使えることだと思いますが,
Windows以外のプラットフォームでも実行(利用?)できるのでしょうか?

145 :デフォルトの名無しさん:2001/08/05(日) 01:18
>>144
>Windows以外のプラットフォームでも実行
以前はそんな話もあったけど事実上無かったことになってるはず。
バイナリレベルでインターフェイスを統一するのは難しいし、肝心のマイクロ
ソフト自身もCOMのめんどくささにさじを投げて、インプリメントが楽そうな
SOAPで通信する.NETに方針転換したんでないかな。

146 :デフォルトの名無しさん:2001/08/13(月) 12:14
AddRef や Release で参照カウントが増減しないオブジェクトは
オブジェクト側で参照カウントをロックしていてクライアントからは
明示的に解放することが出来ないという理解も可能ですか?

147 :デフォルトの名無しさん:2001/08/13(月) 12:43
>>146
クライアントがReleaseによって行っているのは、オブジェクトの解放ではなく、
いまそのクライアントが持ってる "参照の解放" ではないかな。

あと、参照数は取得できなかったと思うけど。

148 :デフォルトの名無しさん:2001/08/13(月) 12:53
>>144
COMそのものの仕組みは単純なんだけど、まともに利用しようとするなら、
その周辺まで用意する必要があります。これがまた大変。

モジラには、XPCOMという名前で採用されてます。これですべてではないですが、
Windows以外での最も大きなCOM(+周辺)の実装だと思います。

プロセスやネットやをまたごうとすると、COMではきついです。
結局 .NET ではCOMは表にでてこなくなってしまいました。
無くなったわけではないですけど。むしろ覆い隠したというべきか・・・

149 :デフォルトの名無しさん:2001/08/13(月) 13:50
>モジラには、XPCOMという名前で採用されてます。これですべてではないですが、
Windows以外での最も大きなCOM(+周辺)の実装だと思います。

Bristol TechnologyがMSからソースライセンスを受けて各社Unixに
COMを移植していたと思うんですが。

>プロセスやネットやをまたごうとすると、COMではきついです。

プロセス間通信は別に問題ないのではないですか?
DCOMは確かに付け焼刃的印象がありますが、元々(L)RPCで通信を
行っていたのでCOM->DCOMの拡張はそれほど苦労していないのでは
ないかと思います。

>結局 .NET ではCOMは表にでてこなくなってしまいました。
>無くなったわけではないですけど。むしろ覆い隠したというべきか・・・

COMやCORBAのようなレイヤが「見えなく」なるのは正しい方向だと
思います。

150 :デフォルトの名無しさん:2001/08/13(月) 13:54
>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ってコマンド(など)を使う。

ドトネトは知らないのでパス。

153 :151:2001/08/13(月) 16:07
>>152 どうもありがとうございます。
レジストリ使わないのはポイント高いっすね > XPCOM
XPCOM 使ってなんか作ってみようという気になるかも。

154 :152:2001/08/13(月) 16:13
>>151
レジストリと同程度にこわれやすいよ(笑

155 :151:2001/08/13(月) 16:43
>>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ってなんですか?

160 :デフォルトの名無しさん:2001/08/14(火) 23:07
>>159
ここで聞いちゃいかん!

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だというだけで。

163 :デフォルトの名無しさん:2001/08/15(水) 19:57
つーか、.NET、COMに依存しすぎ!

164 :デフォルトの名無しさん:2001/08/15(水) 22:47
そりゃーいままでこんだけCOMってたのに、いきなり全部とっぱらうのは無理でしょう。
既存のシステムに部分的導入をしてもらうためには、COMサポートは必須かと。
そのへんをハキチガエないのがMSっぽいところかな。Sunと違って(藁)

165 :デフォルトの名無しさん:2001/08/16(木) 03:11
自分のアプリから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
板橋区でいい事やるぞ イベント ブロードバンド
http://www.e-itabashi.org/

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の情報求む。

174 :デフォルトの名無しさん:2001/08/25(土) 03:11
>>173
だーかーらー、秋葉のLaoxだって。
おれなんていつも立ち読みしてすましてるw金ないもんで、、

175 :デフォルトの名無しさん:01/08/26 14:02
ところでInsideCOM+の続編はいつ出るんだ?
.NETのせいで出版計画も頓挫したとか言わないで、
ちゃんと書き上げてくれ〜!
それともタイミングをXP以降に伸ばしたとかかな?

とにかく楽しみに待ってるよ。>Eddon

>>173
InsideOLEにはInsideCOM+に書いてないこととか載ってるのかな?

176 :デフォルトの名無しさん:01/08/27 09:59 ID:pvQjaL1c
>173
行ったんだけど見つからなかったんだよ!
COM関連は右の入り口から入って直ぐあたりだよね?

177 :てんさいぷろぐらむぁ(偽) ◆8Fck5JHo :01/08/27 21:25 ID:D2JQQVP6

昨日秋葉原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って難しいね。
エクスプローラーとかで右クリックした時に表示される
コンテキストメニューにメニューを追加するだけでも
未だに分からんもん

182 :デフォルトの名無しさん:01/09/11 04:25
それは
「膨大なライブラリから、適切なAPIを見つけだし、利用する」
「適切なサンプルをみつける」
が難しい、ということでは?
別に、COMだから難しいわけではないかと

183 :デフォルトの名無しさん:01/09/11 17:20
正体不明のインターフェイスのポインタを取得した場合に、
そのインターフェイスが持つメソッドやら引数やらを知る方法はありませんか?

レジストリにも登録されておらず、Webにも書籍でもドキュメントが見当たらず、
IDispatchもITypeLibもQueryInterfaceできない、素のポインタを渡された場合です。

184 :デフォルトの名無しさん:01/09/11 17:49
QueryInterfaceが無いなら、COMちがうやん。
逆汗しろYO!

185 :デフォルトの名無しさん:01/09/11 21:11
>>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 のごく一般的なインターフェイスしか公開されていなければちょっと手は出ませんね。

188 :183:01/09/12 09:41
丁寧なレスありがとうございます。

>>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();

また、そういったことはどうすれば調べられるでしょうか?

192 :189:01/09/18 23:30
>190
わかりました。英語が弱いって言い訳にならないよね。

ところで別の質問です
SHGetMalloc と CoGetMalloc ってどう違うんですか?

193 :デフォルトの名無しさん:01/09/19 05:45
COMについて語ってるHP探してます。
Yahoo!で検索かけても出てこないです。

194 :デフォルトの名無しさん:01/09/19 06:05
C言語のみでCOMをつかおうと言う感じのサイトがあったと思うのですが、
どこだか忘れてしまいました。
どなたか知りませんか?

195 :デフォルトの名無しさん:01/09/19 09:00
ここ?
http://www.asahi-net.or.jp/~kv8s-yjm/another/yjamain.htm

196 :デフォルトの名無しさん:01/09/19 09:15
YO!チェケラ!!

197 :デフォルトの名無しさん:01/09/19 09:17
>>195
そこそこ、ありがと〜

198 :デフォルトの名無しさん:01/09/19 10:31
>>193
http://www.microsoft.com/japan/developer/thisweek/combasics/combasics1.asp
http://www.microsoft.com/japan/developer/thisweek/combasics/combasics2.asp
http://www.microsoft.com/japan/developer/thisweek/combasics/combasics3.asp

199 :193:01/09/19 21:20
>>198

ありがとうございます。案外身近なところに・・・あるんだ。

200 :デフォルトの名無しさん:01/09/20 22:36
「COMって何?」ってレベルからの入門本紹介してくださーい
言語はC++で。

201 :デフォルトの名無しさん:01/09/21 10:19
Essential COM アスキー・アジソンウェズレーシリーズ
ISBN:4-7561-3066-6

202 :デフォルトの名無しさん:01/10/04 23:39
age

203 :デフォルトの名無しさん:01/10/07 10:43
Effective COM ってどうなの?

http://www.ascii.co.jp/books/detail/4-7561/4-7561-3166-2.html

204 :age:01/10/17 16:19
MFCCOMは最低。
この前参照カウンタ勝手に増やしてメモリリーク
おこしやがった。

205 :デフォルトの名無しさん:01/10/17 16:27
ROPE.DLLマンセー

206 :とあるスレの  488:01/10/17 20:03
違うスレに書いちゃったけど
こっちのほうが適切っぽいんで質問させてください。

COM初心者なんですけど
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
....
}
を作ろうとするとREFCLSIDが定義されてないって怒られる。
どのファイルをインクルードすればいいのか教えてくださいまし。

207 :_:01/10/17 21:28
COMの機能って、クライアントにVBを選ばなかったら
殆どいらないものばかりのような気がするのですが、
気のせいでしょうか?

208 :名無しさん:01/10/17 22:18
>>207
気のせいです。

209 :デフォルトの名無しさん:01/10/17 22:20
>>207
IDispatchとかは全くいらないな。

210 :デフォルトの名無しさん:01/10/17 23:04
逆に、かつてMTSと呼ばれていた機能(今はCOM+ Component Service)にはVBから使えないものがあるな。MTA(Freeスレッド)、NTA、オブジェクトプーリング、JITAなんてそうじゃないか?
あと、共有プロパティマネージャはVBから使えるのかな?

211 :IUnknown:01/10/17 23:21
>>209
細かい事ですが、それはCOMの規約ではなくオートメーションの規約になります。

212 :デフォルトの名無しさん:01/10/18 20:45
COMでいうところのコンポーネントって、実体は何?
DLLやEXEのようなバイナリファイルを1つのコンポーネントとして数えるの?
(HogeLib.dll=1コンポーネント?)
それともこういった中にある、実装クラス(コクラス)とそれを取り囲む
インターフェイスを1セットでコンポーネントというの?
(HogeLib.HogeHoge=1コンポーネント?)
よくわからなくなってきた。

213 :IUnknown:01/10/19 01:49
コンポーネントとはバイナリファイルという理解で取り敢えず
いいと思います(スクリプトコンポーネントといった特殊なものも
ありますが)。コンポーネントは一つまたは複数のオブジェクト
(つまりCOMクラスにあたりますね)を実装しています。。
またクライアントとの通信という観点から見るとサーバという
言葉が使われ、コンポーネントを実行形態から分類した
表現になります。

214 :212:01/10/19 08:35
ありがとうざごいます>213
「HogeLib.dll=1コンポーネント」「1コンポーネントにn個のCOMオブジェクト」
でいいんですね?(とりあえず)
で、ついでにさらに質問なんですが、CClassFactoryというのは、コンポーネント
単位で1つだけ実装されているものなんでしょうか?それともCOMオブジェクト単位
で1つずつ実装しているものなんですか?
OLEViewで自作COMの中を見てみると、IUnknownやIDispatchやISupportErrorInfo
はいるのに、IClassFactoryはどこにも見当たらないので・・・。

215 :IUnknown:01/10/19 22:46
IClassFactoryはオブジェクトのインスタンスを生成するための
特殊なインターフェイスです。他のインターフェイスから
IUnknown::QueryInterface で取得する事はできません。
そのため OLEViewer でも見れないのです。ちなみに OLEViewでは
オブジェクトが実装するインターフェイス名の取得はレジストリの
Interfaceキーをスキャンして QueryInterface を呼び出している
だけです。

オブジェクトのインスタンスは CoGetClassObject で
IClassFactory を取得して IClassFactory::CreateInstance を
呼び出すと得られます。より一般的な CoCreateInstance はこの
処理をラップした関数です。ということで IClassFactory は
オブジェクト単位で実装する事になります。

細かい事はこれらの語句をキーワードにMSDNなどを眺めてみると
いいと思いますよ。

216 :214:01/10/21 20:50
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書き込まれてま死た・・クッキーですか。鬱氏。

222 :てんさいぷろぐらむぁ(偽) ◆8Fck5JHo :01/10/25 22:05
>>220
regsvr32.exeが何やってるかっつーと
対象のCOMが持っている登録機能を呼び出しているだけなのです。

DLL(インプロセスサーバ)ならエクスポートされた
DllRegisterServer(アンインストールにはDllUnregisterServer)を、
EXE(アウトプロセスサーバ)なら・・・忘れた、確かコマンドライン引数を渡している
のです。

この自己登録機能によってCOMは自分で適切なレジストリ設定を行うのです。
逆にいうと外からはそのCOMがどんな設定を必要としているのか分からないので
勝手にレジストリを書き込むのはまずいのです。
(大変キケンをともなうので素人にはオススメできない byごるご)

つーわけで
regsvr32.exeがやっているのと同じ事を実行してやりましょう。
エクスポートされた関数を呼んだりコマンドライン引数をつけてexeを実行したりしてやってください。

注意:
COMの自己登録機能は必須ではありません。(普通はつけるけど)
自己登録を実装するのはCOM作成者なのです。

・・・・って知りたい内容と合ってるかな?
でわ

223 :218:01/10/25 22:35
ちなみに、COM+といわれるCOMの進化版では、regsvr32だけではダメです。MSIを実行しなきゃいけません。
COM+の情報がレジストリだけでなくCOM+RegDBというものにも書き込まれるからです。

224 :デフォルトの名無しさん:01/10/26 12:35
COM登録ってrgsに自己登録書くだけじゃ駄目なんかいな?

225 :masa:01/11/02 09:40
初めて書き込みます。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で対応してたっけ?

228 :papa:01/11/06 15:49
papaです。初めてのカキコです。
現在、VBにてActiveXのEXEを作ってマス。
引数として構造体があるのですが、コレがなかなか上手く渡りません。
固定長、可変長の文字列だとメモリを粉砕してるらしくって落ちたり落ちなかったり・・・
どなたかこの辺詳しい人おられませんか?

229 :227:01/11/06 20:05
>228
COMインターフェースで期待している型と
COMの実装言語(受け取る相手はCなのかいな?)での型と
VBで渡したい型の間でバイト並びが違うと当然ダメだわねえ。
とりあえずそれぞれ何の型なのか教えて味噌。

230 :papa:01/11/07 11:14
レスありがとうございます。
えっとですね。やりたい事はVBのEXE同士の構造体値渡しなんです。
ActiveXを使っての。

CとVBのBSTRとString、
long同士のように並びについても何とか分かってます。(ホントか?)
渡す引数がちゃんと対応してないとダメって事ですよね?

COMでVBのEXE同士を結びつけるのって普通しないのかなぁ・・・。
知恵をお貸しいただけるとありがたいです。

231 :227(泥酔):01/11/07 21:47
受け側も送り側もIDL(タイプライブラリ)での型宣言は同じになってる?

232 :masa:01/11/08 10:34
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ってなんですか?要するにライブラリですか?

235 :masa:01/11/08 14:43
>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の拡張版じゃ。

237 :papa:01/11/12 17:24
>231
>受け側も送り側もIDL(タイプライブラリ)での型宣言は同じになってる?

こちらですが、IDLは使ってませんで、ActiveXでのCOM化(?)でやってマス。
問題はEXE同士、画面を持つモノ同士での構造体配列のデータの引き渡しに失敗することなんです。
ん〜説明不足でしょうか?

やはりIDLを使ってタイプライブラリを作成し、組み込む方が良いのでしょうかね?
ATL未使用でのCOMでのC同士の連携は成功してます。ガックシ。

VB同士のCOMでの開発の資料が殆ど無いので、困ってる次第です。
やっぱIDLでCOMった方が良いのかなぁ・・・・
どなたかVBのEXE同士での連携に成功した方いらっしゃいませんでしょうか?

238 :デフォルトの名無しさん:01/11/13 12:47
>>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は文字列の扱い方が多くて迷うよな・・・。

240 :デフォルトの名無しさん:01/11/14 00:18
・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 ) {

てやったほうがいいのかなあ?厨房な質問でスマソ・・・

242 :デフォルトの名無しさん:01/11/14 10:44
それは後続する処理とか、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
>>243
無理

245 :これって法の盲点?:01/11/14 19:48
日本生命の削除依頼公開スレッド

1 :ひろゆき@暫定管理人 ★ :01/11/01 15:49 ID:???
「削除依頼は公開」の原則に従って削除したものを公開してますー。
ソース。
http://www.dd.iij4u.or.jp/~cap/nissei/

17 :ひろゆき@暫定管理人 ★ :01/11/01 16:01 ID:???
いやぁ、削除依頼は公開って原則ですから、、
( ̄ー ̄)ニヤリ

18 :va :01/11/01 16:01 ID:+W2rWnl4
同じこと書き込んだら、速攻で削除されるのかな?

19 :ひろゆき@暫定管理人 ★ :01/11/01 16:03 ID:???
削除依頼がくるまで放置っす。



詳しくはhttp://news.2ch.net/test/read.cgi?bbs=newsplus&key=1004597354

246 :デフォルトの名無しさん:01/11/14 19:58
漏れは、、相当の処分、、のようなきがするYO。。

247 :デフォルトの名無しさん:01/11/15 02:44
>241

_bstr_t型に直接BSTR型を代入するとリークすると思われ。

if( _bstr_t(aaaBSTR,FALSE) == _bstr_t(bbbBSTR,FALSE ){
...

としたほうがリークしないらしい。(ちゃんと確認したわけではない)
もっとスマートな方法ないんでしょうかね?

MSDNあたりをあさってみてください。
検索で_bstr_t リーク 等のキーワードでHitすると思います。

比較演算子はないけど、ATL使ってるならCComBSTRクラスのほうが軽量でよい、と聞いたことがあります。

248 :247:01/11/15 02:47
if( _bstr_t(aaaBSTR,FALSE) == _bstr_t(bbbBSTR,FALSE) ){

)が足らなかった。鬱

249 :デフォルトの名無しさん:01/11/15 17:55
「起動されたオブジェクトは、クライアントから切断されました。」
のエラー原因ってなに?

250 :デフォルトの名無しさん:01/11/15 22:31
>>249
禿しくスレ違い。
COMに斬られてどうする。

251 :デフォルトの名無しさん:01/11/15 22:46
マジ?>>247

( _bstr_t )aaa とか _bstr_t bbbbb = bbb; とかいままでしょっちゅうやってるんだけど・・・

252 :247:01/11/19 02:22
>>251

VC6.0SP5の環境でチェックしたらリークしなさそうですね・・・・
1999年の文書を参照してるので、現在は修正されてるのかな?

リークが顕著化しないのであれば、特に問題ないと思います。
# ほんとはしてたりして・・・

253 :デフォルトの名無しさん:01/11/20 01:03

微妙に息の長いスレだな。

254 :デフォルトの名無しさん:01/11/20 13:21
定期age

255 :てんさいぷろぐらむぁ(偽) ◆8Fck5JHo :01/11/22 02:20
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サーバーとかで
は完全に破綻する宣言方法だな。

259 :某 C1シリーズ:01/11/23 00:12
メソッドの引数として使うと確実にエラーとしてはじかれます。<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って消え行く技術なの?

261 :デフォルトの名無しさん:01/12/02 12:13
>>260
消えるとは思えないけど、デバイスドライバを書く人がそんなに多くないように、
生COMを使わなければならない、という場面は減ると思う。

262 :デフォルトの名無しさん:01/12/02 19:42
>>243
うまくいったVBの方をOLEViewでTLBの情報をみてC++ で同じようにつくってやれば?

263 :デフォルトの名無しさん:01/12/05 18:42
&heart

264 :デフォルトの名無しさん:01/12/25 23:30
age

265 :デフォルトの名無しさん:01/12/26 15:05
>>260
COMは消えないかもしれない。
が、COMを経由しない世界はもっとスゴイ。ステップ激減で高性能。
逆に言うと、COMを作る側は不思議に膨大なヘッダーファイル、実行時は性能がネック。

266 :デフォルトの名無しさん:02/01/04 05:38
>265
安物ぎじゅつだよあれは。氷魚の著作。しかもかなり手抜きのな。
お前ら糞氷魚のあとおってるだけ。
どうせMSだけでなくて米業界全体が、統一思考や一括管理な
んて思考をうけいれるつもりなんてまったくないと氷魚は嘆いて
いたよ。完璧なものをつくらせちまえよ。やつに。
こころあたりはあるんだろ?それらしいやつ。

267 :デフォルトの名無しさん:02/01/04 05:41
G400でとめさせているのも奴。
勝ち疲れでATIやらにも手ぇ貸してるみたいだがな。
あこがいちばん素直ないろと設計らしいし。もいっかい
りりーすされるのきぼーん。
AUREALも奴つぶした?1bitも奴。
とっとと完成品くんでしまえと逝ってやれよ。

268 :デフォルトの名無しさん:02/01/04 13:41
>>265
根拠は?

269 :デフォルトの名無しさん:02/01/04 23:03
>>268
329 :デフォルトの名無しさん :02/01/04 10:22
>>328
ここのデンパが迷い込んだだけ
脳内あぼーん推奨
http://pc.2ch.net/test/read.cgi/prog/999284410/

270 :デフォルトの名無しさん:02/01/15 23:19
age

271 :名無しさん@お腹いっぱい。:02/02/01 19:23
age

272 :デフォルトの名無しさん:02/02/19 00:58
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周りの見落としがあるのかと試行錯誤しましたた。
このような場合、エディットのテキストエリアに文字を入力できるようにするには、
どうしたらよいのでしょうか?


274 :273:02/03/01 02:22
自己れす
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側の問題なのでしょうか?

280 :デフォルトの名無しさん:02/03/13 16:52
君の問題。

281 :デフォルトの名無しさん:02/03/13 17:17
COM+サーバで一度に1クライアントしか呼べないようにしたいのですが、
どうすればいいのでしょうか?

プールとリサイクルで呼び出し制限を1にしたのですが、いくらでも呼べてしまいます。

282 :デフォルトの名無しさん:02/03/13 17:44
_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までしてくれるんでしょうか?


285 :284:02/03/13 21:37
この関数の仕様を見誤ると、
メモリリークの原因になってしまうのでコワイです。
知ってる人いたらおね害します。

286 :284:02/03/13 23:05
だめだこりゃ

287 :デフォルトの名無しさん:02/03/13 23:08
>>284
こんなとこで聞くのが間違い。
ちなみにおれは知らん。

288 :284:02/03/13 23:13
>>287
え?
じゃあどこで聞けば委いいですか?

289 :デフォルトの名無しさん:02/03/13 23:17
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.


290 :284:02/03/13 23:24
>>289
ありがとう。
でも英語なんで正確な意味がわからなかった。
つまり開放してくれるって事ですか?

291 :デフォルトの名無しさん:02/03/13 23:28
>つまり開放してくれるって事ですか?
そーでーす。

292 :284:02/03/13 23:31
>>291
ありがとう。
謎は全て解けた!
きみの様ないいやつが沢山いればこの板も安泰だね!

293 :John ◆0z.4Is5E :02/03/13 23:35
COMのメリットがよくわかんないんですが、
確かにOSアップグレードする時に、DLL入れ替えるだけでできるのはいいと思うけど、
他になんかある?


294 :デフォルトの名無しさん:02/03/13 23:39
えーとですね。COMのメリットはですね。

すいません。ありませんでした。(゚∀゚)

295 :デフォルトの名無しさん:02/03/13 23:39
>>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とかでやらせるとか。

300 :300:02/03/14 00:21
今だ!オッパイゲット!

301 :デフォルトの名無しさん:02/03/14 00:30
>>299
怪しいプログラマは何使わせても危険。


302 :デフォルトの名無しさん:02/03/14 01:11
とりあえず怪しい奴にはJava触らせてるけどやっぱ危険

303 :デフォルトの名無しさん:02/03/14 01:48
そもそも動かないため、怪しい奴にはC++を触らせるのが吉かと。

304 :デフォルトの名無しさん:02/03/14 01:58
怪しい奴には、テスターやってもらえ。ソース触らせるのはヤメトケ。

305 :デフォルトの名無しさん:02/03/14 03:03
怪しい奴にはマシンさわらせるのもヤメトケ。
Windows壊されるぞ。

306 :デフォルトの名無しさん:02/03/14 05:14
>>293
まじれすつけておこっと
既存インターフェイスと新規インターフェイスのどちらも持てるところ
じゃないかなあ。
ファンクションコードと ver x 以降使えます。みたいな API よりも
実際に必要なインターフェイスをもっているかどうか。
の方が即物的でイイカンジっしょ。

307 :デフォルトの名無しさん:02/03/14 08:47
COMのメリットは言語をまたがったコンポーネントの相互運用が可能になること。
たぶんソケット云々って言ってるやつにとっては、そんなのソケットでできるじゃん、
ってことになるんだろうけど、ソケットとは思想が違う。ソケットにデータを送るのではなく、
相手のメソッドを呼び出すということ。それがマシン内でもマシン間でも透過的に
できることがメリット。

308 :デフォルトの名無しさん:02/03/14 09:11
つーかな、いちいちマーシャリングコードを
socket使って書くのはだるい、ちゅうねん。

309 :デフォルトの名無しさん:02/03/14 09:28
同意。

310 :デフォルトの名無しさん:02/03/14 21:05
>>308
COMの意味ない知識を詰め込むよりましだと思うが。
というか、COMにして良かったと思った例を教えて欲しいんだが。
俺はバイトなので、仕方なくCOM使ってるけど
COMが便利だと思える場面は経験してない。
まあ、あえて言えばASPしか使えない奴がプログラマーと名乗ってる組織で
仕事する時は便利だな(w

311 :デフォルトの名無しさん:02/03/14 21:13
>310
お前はDQN。

312 :デフォルトの名無しさん:02/03/14 21:58
>>310
じゃぁ、今使っているCOMの機能をすべてsocketで実装してください。

まぁ君が今使っている機能ぐらいなら作れるだろうな、
どうせ関数呼び出し程度しか使ってないだろうから。

それに、バイト君は暇だからいいけど、プログラマはそんな
低レベルな実装を時間をかけてわざわざやらないのだよ。

313 :デフォルトの名無しさん:02/03/14 23:12
>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でなんでもやろうとする奴は、究極の車輪再発明野郎だとおもう。

しかもそういう奴は、どういうわけかそのことにプライドを持っている。なんでだ?

317 :デフォルトの名無しさん:02/03/15 01:16
>>316
ネットワーク層やデータリンク層に手を入れられるからでしょ。

318 :デフォルトの名無しさん:02/03/15 01:20
>>316
COMじゃなくてDCOMだろ

319 :デフォルトの名無しさん:02/03/15 01:21
>>318
総称っつーことで

320 :デフォルトの名無しさん:02/03/15 01:24
COMってさー、GUIDとかレジストリ使ってる時点で終わってると思う。

321 :デフォルトの名無しさん:02/03/15 01:25
>>317
そんな必要があることは、あまりないと思うが…
セキュリティ関係でプレゼンテーション層を変更する必要があることは
多いけど、こういった機構を使っていても、それは可能だしね。

322 :デフォルトの名無しさん:02/03/15 01:27
>>320
環境変数よりはマシだと思う。っていうかCLASSPATH逝ってよし。

323 :314:02/03/15 01:32
>>315
その一言でわかりました。
つーか、socketなんて個人でいじる場合は
データ通信にしか使わないよな。

324 :デフォルトの名無しさん:02/03/15 01:33
>>320
はぁ?
GUIDはむしろ歓迎だろ。
本当にUniversal Uniqueだとしたら

325 :デフォルトの名無しさん:02/03/15 01:35
うわっ、釣れた

326 :鯛焼きクン:02/03/15 01:48
何かを作る上で「ここまでは決め事にしましょう」っていう
合意がなければ何も作れない。その決め事をフレームワークって
いうかどうかは別としても、おれはその意味をそう捉えている。
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しか使えない奴がプログラマーと名乗ってる組織で仕事する時
だけなんだね。

328 :デフォルトの名無しさん:02/03/15 10:52
>>327
> ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。
どんなことをやっているのか教えてください。

329 :デフォルトの名無しさん:02/03/15 11:16
>>327
> ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。
「時間は変わらん」というだけなら誰でもできるよ。たとえそれがウソでも。
実例をあげなさい。

> COMの位置付けが全然わかってないようで・・・・
> COMとソケットの関係が,C++とアセンブラだってさ(w
あなたの意見は? COMの位置付けを説明してよ。 笑うだけなら誰でもできるからさ。

> 俺はソケットの方が、短時間でできる例しか知らないから、
> ソケットでやった方が優れていると主張してんだけど。
そりゃソケットの方が短時間でできるならソケットを使うよ。
じゃぁソケットで時間がかかるときはどうするの?
ソケットの方が、短時間でできる例しか知らないのね。

> 車輪の再発明とかほざく奴は、どういうわけかそのことにコンプレックスを持っている。なんでだ?
「そのこと」ってどこにかかっているの?

> そういう奴に限ってXMLは重いと言う罠
なんでいきなりXMLが出てくるの。だれもそんなこと言ってないでしょ。反論になってないよ。

> で、結局COM使って良かった例は
> ・ASPしか使えない奴がプログラマーと名乗ってる組織で仕事する時
なんでASPなの? ウソならだれでも言えるからさ、根拠を言いなって。


的外れな意見ばかりだね。もう少し日本語勉強して出直してきなさい。

330 :デフォルトの名無しさん:02/03/15 11:30
>ソケットの方が、短時間でできる例しか知らないのね。
そういうことだから、教えてくれって言ってるんだよ。
で、短時間でできる例がわかってると認識されてるわけだから、
実例挙げなくてもいいのか?

>なんでいきなりXMLが出てくるの。
逝ってよし
329はえらそうな事言ってる割には、知識乏しいみたいだね(w

実例挙げろ、とか根拠とかさ
結局おまえ何もわかってないだろ。
ASPとVBに訂正して欲しいか?

>的外れな意見ばかりだね。もう少し日本語勉強して出直してきなさい
ストレートに書かなきゃわからん奴は、
´_ゝ`<<ひっこんでろ!!

331 :デフォルトの名無しさん:02/03/15 11:36
つかな、Socketつかって書くにしても、listenしているポートを
どうやって広告するんだよ。
固定か?/etc/serviceか?ロケータサービスか?
いずれにしてもおめでてーな。

332 :デフォルトの名無しさん:02/03/15 11:38
>>331
COMだってそこらへんはしょぼいじゃん(w


333 :デフォルトの名無しさん:02/03/15 11:39
ちなみに俺は固定だけどね

334 :デフォルトの名無しさん:02/03/15 11:46
たとえばWord.ApplicationをどうやってSocket化するのか、教えれ。

君の話を聞いていると、Inner-Networkなのばっかりやん。
COMのInner-Process, Inner-Machineな部分は無視ですか(w


335 :デフォルトの名無しさん:02/03/15 11:55
>>330はヴァカなので放置してください。

336 :デフォルトの名無しさん:02/03/15 12:02
XMLってファイル形式の一つという使われ方のほかに
SOAPでやりとりするデータ形式という認識であってる?
結局ここで話しているのはsocket vs COMじゃなくSOAP vs COMなわけ?
SOAPよく知らないから変なこと言ってたらすまん。

337 :デフォルトの名無しさん:02/03/15 12:04
>>336
あってない。SOAPとCOMは関係ない。この文脈のXMLってのは単にアフォが
勘違いしてるだけ。


338 :336:02/03/15 12:07
>>337
> XMLってファイル形式の一つという使われ方のほかに
> SOAPでやりとりするデータ形式という認識であってる?
↑これも間違い? これが間違い?


339 :デフォルトの名無しさん:02/03/15 12:10
>338
XML InfoSetについて調べてみよう。SOAPは<>じゃないよ。

340 :デフォルトの名無しさん:02/03/15 12:12
>>339
よくわからんが、分かった。XMLとSOAPについて調べる。ありがと。

341 :デフォルトの名無しさん:02/03/15 14:34
>COMのInner-Process, Inner-Machineな部分は無視ですか(w
ごめん無視してた。
開発者側から見て、というつもりだったので

>>337
比喩がわからんおまえがアフォ
つーか、COMのリスクが分かってないのか?

342 :デフォルトの名無しさん:02/03/15 15:26
>>341
おまえ、>327じゃねーの?どこが比ゆなんだ?比ゆってなんだかわかってないだろ?

343 :DCOM使っている人いるの?:02/03/15 18:38
DCOMでリモートのオブジェクトユーザが死んだ場合って、
オブジェクトの参照カウントってどうなるんだ?
ちゃんとIUnknown::Release()されるの?
Releaseされないで放っておかれると、
オブジェクトユーザが死ぬたびにオブジェクトが
放置されるから、ちゃんとReleaseされるんだよね。(たぶん)


344 :デフォルトの名無しさん:02/03/15 18:59
>>343
Releaseされる。DCOMは分散GC実装してるから。

345 :デフォルトの名無しさん:02/03/15 21:29
>>344
たぶん、GCできるかどうかどうやって判断するんだ?
ってことだと思うが

346 :デフォルトの名無しさん:02/03/15 21:40
>>345
Ping。

347 :デフォルトの名無しさん:02/03/15 21:48
>>346
嘘だろ?いくらマイクロソフトだからってそんなことは・・・

348 :デフォルトの名無しさん:02/03/15 21:51
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しなければならないの?


350 :デフォルトの名無しさん:02/03/15 22:22
DCOMに限るけど COMPLEX PINGとか使って定期的にオブジェクト
が生きているかどうか調べているんじゃなかったでしたけ?

あと、Proxy/StubでAddRefやReleaseも最初と最後しかネットワークに
送信しない様に最適化してるって話も聞いた事がある。

システムでウマーくやってくれてるんじゃないでしょか?

351 :DCOM使っている人いるの? :02/03/15 22:26
最適化?なるほど。やっていそうだね。
QueryInterfaceの非効率さに気がついて、
MULTI_QI構造体を用意したくらいだから

352 :デフォルトの名無しさん:02/03/15 23:14
IRemUnknown。

353 :デフォルトの名無しさん:02/03/15 23:35
>>352
そうですね。そっちの方が詳しく書いてある。

で、Adviseの件はどうなんでしょう?
だれか教えてください。自動的にUnadviseされるなんてやっぱり甘い?
自動的でなければ、せめて、死んだことが死んだ時点か
それに近いタイミングで通知されるような仕組みがあると楽なんだけど。


354 :デフォルトの名無しさん:02/03/16 00:56
COMアプリってメモリリークしまくるのが多いけどなんで?

355 :デフォルトの名無しさん:02/03/16 00:57
MSが作ってるからでしょ?

356 :デフォルトの名無しさん:02/03/16 00:58
どこが作ればメモリリークしませんか。

357 :デフォルトの名無しさん:02/03/16 01:01
それはキャッシュです、とか言い張る?(w

358 :デフォルトの名無しさん:02/03/16 01:10
なんつーか、VARIANTあたりの設計で、C++みたいな
コンストラクタ/デストラクタ持ってる言語でも
うまく破棄されない場合があった気がする。


359 :John ◆0z.4Is5E :02/03/16 01:12
>>356


360 :デフォルトの名無しさん:02/03/16 01:21
自分のバグを人のせいにすんな、見苦しい。

361 :デフォルトの名無しさん:02/03/16 01:24
>>360
それじゃ話が終わっちゃうじゃん


362 :デフォルトの名無しさん:02/03/16 01:27
>>360
禿同

363 :デフォルトの名無しさん:02/03/16 01:57
禿同、とかいってるやつは理解してないだけ。

364 :デフォルトの名無しさん:02/03/16 02:42
>>363
禿同

365 :デフォルトの名無しさん :02/03/16 07:47
実行時のエラーは起きる可能性はいつだってあるから、
バグとも言い切れない

366 :デフォルトの名無しさん:02/03/16 08:16
>>365
確保できた資源が、解放時にエラーになる?
それはどのシステムのどんな資源でしょうか?

367 :デフォルトの名無しさん:02/03/16 09:11
>>366
禿同

368 :デフォルトの名無しさん :02/03/16 15:05
スマートポインターとスコープ
参照カウンター


369 :デフォルトの名無しさん:02/03/16 20:57
COMは巨大なオープンソースプロジェクトであるMozillaに採用されているYO!

370 :デフォルトの名無しさん:02/03/16 21:00
>>369
まぁた路線変更に迫られるのですが?

371 :デフォルトの名無しさん:02/03/16 21:13
路線変更?

372 :デフォルトの名無しさん:02/03/16 21:37
Mozilla使ってる奴はCOMに感謝するべき

373 :うぴゅ:02/03/16 21:59
LinuxやMac OSのMozilla使ってる奴は誰に感謝すべき?

374 :デフォルトの名無しさん:02/03/16 22:00
>>373
Mozillaのソース見たことないのか...

375 :デフォルトの名無しさん:02/03/16 22:01
ここは悲惨は373の居るスレってことで

376 :デフォルトの名無しさん:02/03/16 22:08
XPCOMなんてCOMの足元にも及ばんだろ
inner-processだけだし
http://www-106.ibm.com/developerworks/webservices/library/co-xpcom.html


377 :デフォルトの名無しさん:02/03/16 22:36
禿同

378 :デフォルトの名無しさん:02/03/19 09:46
>>366
ヒープが壊れたときとか。

379 :デフォルトの名無しさん:02/03/19 13:09
>>349
Unadviseされるわけがない。
理由:Proxy/Stubがそこまで考慮していないから。


380 :デフォルトの名無しさん:02/03/19 13:22
>で、Adviseの件はどうなんでしょう?
>だれか教えてください。自動的にUnadviseされるなんてやっぱり甘い?

カメレスで済まないけど、Adviceつーても、
単に内部で参照カウントとインターフェースのポインタ
持ってるだけだということを考えませう。

クライアントが落ちてもサーバーが落ちても、
DCOMがRelease( )してくれるのなら
メモリリークはとりあえず発生しない。


381 :380:02/03/19 13:28
ただし、
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(死語)の基幹テクノロジーなんだがね。


383 :デフォルトの名無しさん:02/03/19 14:30
っていうかDCOMベースのシビアな環境でIConnectionPointなんか使うほうが間違い。

384 :デフォルトの名無しさん:02/03/19 14:43
DCOMを使う=シビアな環境なのか。


385 :デフォルトの名無しさん:02/03/19 15:16
>っていうかDCOMベースのシビアな環境でIConnectionPointなんか使うほうが間違い。
おいおい、リモート・ローカル等価性はどうなったんだ?
IConnectionPointはリモートで使ってはいけないから
リモートとローカルで等価ではないってことだな。
実はリモートに限らずローカルサーバーもやばいんじゃないか?ということで等価か。

とIConnectionPointひとつを重箱の隅を突くように取り上げて煽ってもしょうがないが
現実問題として、IConnectionPointに限らず、リモートオブジェクトから
インタフェースを渡されるような場面は気をつけたほうがいい。
渡してきた相手がこそっり死んでいるようなこともあるんで。


386 :デフォルトの名無しさん:02/03/19 15:16
>>382
VBはUnadviseを勝手にやってくれたりはしないのかな?

387 :デフォルトの名無しさん:02/03/19 15:24
>>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
みたいな設計はできないんでしょうか?

390 :デフォルトの名無しさん:02/03/29 02:57
>>389
できません。VBScriptの制限事項です。

391 :389:02/03/29 18:39
>>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の場合エラーとなってもクライアントは判定できないです。

393 :デフォルトの名無しさん:02/03/30 05:50
なんの為にHRESULT返してるんだ。

394 :デフォルトの名無しさん:02/03/30 08:03
スクリプト側でエラーを検出したいって事だろ

395 :393:02/03/30 14:14
クライアントか。すまん。
VBSならON ERRORで処理するんちゃうんか?
それともVBSはput時のエラーは無視する仕様なの?

396 :ななし:02/03/30 22:41
えっと、初歩的な質問かもしれませんが・・・。

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



397 :ななし:02/03/30 22:50
>>396

環境は、VB6.0 SP5 + Excel8.0 SR-2 です。

Windows 98 / NT4.0 ws SP6
のどちらでも、

> (4) Dim .... As Object → Set .... = CreateObject ... で実行時バインド

が最速でした。

398 :デフォルトの名無しさん:02/03/30 22:51
速いというのが具体的に何の時間を測ったのか書け。

399 :ななし:02/03/30 22:56

>>398

ソースが現在手元に残ってないのでアレですが、50000件のレコード(DAO.Recordset)を
セルに出力する時間を計測しました。
インスタンス化 → Nothing までの時間です。
無論、現実的には、二次元配列を使うなり、CopyFromRecordsetメソッドを使えば一発の
処理なのですが、メソッドやプロパティの参照回数を増やさないと明確な差が検出でき
ない?と考えたので、1件ずつループしてます。


400 :デフォルトの名無しさん:02/03/30 23:00
>>399
ケース毎にプログラム終了した?
exeにコンパイルして試した?
ケース毎にマシン再起動した?


401 :デフォルトの名無しさん:02/03/30 23:02
おおよそ
 (総時間) = (一件当たりの時間) * (件数) + (定数)
になるから
件数を変化させたときの時間の変化を見れば、
もう少し分かったと思うんだがなあ・・・

ソースコードがないんじゃあもう無理か。
ちなみにそれぞれの時間を覚えてない?

402 :ななし:02/03/30 23:05
>>400

当然、IDEではなく、EXEでテストしてますし、プログラムも1回毎に立ち上げ
直しました。マシンのリブートまではしてませんが。(やるべきでした?)
それと、レスポンスの計測にTimer関数を使用したので、測定誤差はあるかも
しれません。でも、誤差が出るのは、(1)〜(4)までおなじ条件なので、(4)に
だけ有利に働くなんてことはないですよね?

403 :ななし:02/03/30 23:09
>>401

ソースがないのは、今、実家に帰ってるから(^-^;で、自分とこのマシンにはちゃんと
あります。(件数をもう少し増やせば、というのはちらっと思いました)

ちなみに、このベンチマークをやったのは、昨年の9月頃です。
実行時バインドの方が高速だなんて、気でも違ったかと思われそうで、技術系のMLやBBS
に上げるのを躊躇してました・・・。

404 :デフォルトの名無しさん:02/03/30 23:18
>>399
>ちなみに、インプロセスサーバを参照してコンパイルしたEXEを該当するコンポーネントがレジスト
>されていない端末で起動するとプロセスが起動せずにクラッシュしますが、上記(1)〜(3)のEXEを

CreateObjectでコケてるんですな。

>Excelがインストールされていない端末で起動しても、エラーにならずに正常に起動してしまいます。(無論、オートメーション機能は動きませんが)

こっちは、めそっど、ぷろぱてぃの情報がコンパイル時に解決されますね。


405 :デフォルトの名無しさん:02/03/30 23:20
ソースあるんなら試せるね。よかった。

厳密に言うなら、ディスクキャッシュなどの影響をなくすために、
同じテストを3回以上繰り返すべき。(1なら1を3回実行する)
これで生の処理時間に近づけるはず。

あと、プロパティやメソッドの実行レスポンスを調べたいのであれば、
計測開始時刻と計測終了時刻 を ループ開始直前とループ終了直後 に
置いたほうがいいね。

4にだけ有利に働く可能性としては
 a:単に最後に実行して、全部のデータがディスクキャッシュに乗っていた
 b:4のみ >>401 のいう定数部分が小さい(あるいは1〜3は定数部分が大きい)
などがあると思う。

ベンチマーク(理科でいうところの対照実験)の基本なので、
このへんを押えてないと厨房扱いされちゃうよ。

406 :デフォルトの名無しさん:02/03/30 23:58
>>396
エクセルを操作するのでアウトプロセスでしかもDispatchインターフェイスのみ
でしょう。
どの方法でも測定誤差程度しか違わないのではないでしょうか。


407 :ななし:02/03/31 00:00
>>405

ありがとうございます。

> b:4のみ >>401 のいう定数部分が小さい(あるいは1〜3は定数部分が大きい)
> などがあると思う。

その可能性はありそうですが、Excelの場合、行数に65536という制限があるので、
ベンチマーク方法をもう少し工夫した方がいいのかもしれません。

私的に気になっているのは、メモリ上の操作ではなく、ファイル出力の
レスポンステストなので、複数回実行すると環境が汚れることによる影響
があるんじゃないかと・・・?

408 :ななし:02/03/31 00:05
>>406

ありがとうございます。

> エクセルを操作するのでアウトプロセスでしかもDispatchインターフェイスのみ
> でしょう。

インプロセスとアウトプロセスではバインド方法が違う、という理解でよろしいの
でしょうか?

使っている言語がVBオンリーな上、COMのメカニズムもあまり理解していないので、
このスレの話題についてくのはしんどいです・・・。(T_T)

409 :デフォルトの名無しさん:02/03/31 01:25
よそのプロセスのCOMインターフェースにアクセスする方法はありませんか?


410 :409:02/03/31 01:29
ちなみに、取得できる情報は、
対象のプロセスとインターフェースの型と、インターフェースへのポインタだけです。
CoCreateInstance()などで取得できるものではありません。

411 :409:02/03/31 01:39
それから、できれば、ウインドウをフックしてcallするのは最後の手段にしたいです。


412 :デフォルトの名無しさん:02/03/31 01:58
もうちょっと勉強してから出直せ。

413 :デフォルトの名無しさん:02/03/31 02:15
COM関係のスレ2つとも職人さんたち対象なので、
お勉強レベルのスレがあってもいいかもね

414 :409:02/03/31 03:13
>>412

1 そんなことできるわけねーだろ、ボケ
2 そんな簡単に実現できること、自分で調べろ ゴルァ

なのか、どっちなんでしょう?
それだけでもよろしくお願いします。

415 :409:02/03/31 03:31
通常ポインタがプロセスを超えられないことは知ってます。
ただ、スタックトレースを見ると、たとえばドラッグ&ドロップなんかは
rpcrt4.dllなどを介してcallされているし、何か抜け道なりがあるのかもしれないと思って聞きました。

ちなみに、フックをかけてcallをする方法は試してみたところ成功しました。


416 :デフォルトの名無しさん:02/03/31 12:17
>415
だから、マーシャリング、プロキシ/スタブ、スレッドモデルなんかに
ついてもっと勉強しろや。
他のプロセスにあるinProc COMサーバを(その、「ほかの
プロセス」を実行主体として)呼ぶのは、フックでもしないと無理。
そうでないなら、普通にCreateProcessから呼び出せば、
あとはole関連ライブラリが善処してくれる。


417 :406:02/03/31 19:07
>>408
バインド方法とサーバのプロセス形態は直接は関係ないですよ。
バインド方法はVBのソースで型名でオブジェクトを扱うのか、
Objectで扱うのかの違いでしょ。
一般的にVBでいうところのバインドは、

参照を追加して型名で操作 == アーリーバインド
 開発時に型情報等を解析する
  サーバへのバージョン依存性は高くなるが
  開発時にエラーチェックできる
  またパフォーマンスはよい
object型で操作 == レイトバインド
 実行時に型情報等を解析する
  サーバへのバージョン依存性は低くなるが
  実行時エラーになる可能性もある
  またパフォーマンスはさがる

という事で >>396 でなぜレイトバインドが一番速かったのか
と疑問に思っているのではないでしょうか。
#ちなみにnewとCreateObjectはオブジェクトを作るときのみ
#違いがあるので受けた後の型しだいで上記と同じ。

バインド方法で著しくパフォーマンスがかわるのは
dualインターフェイスのインプロセスサーバを扱った
ときでしょう。アーリーバインドで開発時にIUnknown側の
メンバーを扱う様にコードが吐かれるのか、レイトバインド
で実行時にDispatchのInvoke経由でメンバーを扱うのかという。

たとえdualインターフェイスでもアパートメントに互換性が
あるインプロセスサーバ以外は直接サーバとは対話していない
ので注意が必要です。

しかし >>396 で検証した結果レイトバインドが速いというので
あれば、仮説ですがVBがDispatchのみのエクセルに対して
アーリーバインドするとエクセルを扱う仮想のエクセルオブジェクト
を作成しているとか、使用しないメンバー情報等も全て
取得してまうとか...そのぐらいでしょか。

結局エクセルを扱うときDispatchでInvokeするしかないわけだから
アーリーバインドする事でどのぐらいパフォーマンスに差がある
かといわれると「誤差ぐらい」と思われますが。


418 :ななし:02/03/31 22:02
>>417

丁寧なコメント、ありがとうございます。m(_ _)m
残念ながら、私は勉強不足のようです。(VBユーザーは、COMを「使う」ことはあっても、
内部の仕組みは必ずしもしらなくても足りてしまう場合が多いので)

このスレの話題について行けるよう、いろいろ研究してみます。
ソフトウェアの動作原理や(隠蔽された)内部のふるまいに興味が大いにありますので。


419 :D:02/03/31 22:55
Inside COM+ や Inside OLE ぐらいは読んどいたら?

420 :デフォルトの名無しさん:02/03/31 23:12
>>419
たしか前者は入手困難じゃなかった? 

421 :D:02/03/31 23:54
それは後者だね。ちなみに私は 177 のレスを読んで
速攻買いに行きました。ここまで高い本買ったのは初めてだったが
かなり勉強になるよ。入手出来なければ大きめの図書館で借りたりとかね。
家の近郊の図書館にはInside OLEはあった。まあ購入後知ったことだから
どうでもいいんだけどね。常に手元に無いと落ち着かないって言うのもあるし
損した気分にはならなかったね。今の学生さんならお金持ってるだろうし
そんなに負担ではないのでは?(いいかげんな推測ですが)

422 :ななし:02/04/02 09:03
>>421

いちおう、ええ歳こいた社会人(0x20代)なので(にしては、厨房質問ですが(^-^;;;)、
本くらいは買えます。

「Inside COM+」ですね。
ありがとうございました。m(_ _)m

423 :デフォルトの名無しさん:02/04/02 09:09
InsideOLEは駒場東大前の駅前の書店に野ざらしにされてボロボロの状態で、定価で売ってる。
俺が立ち読みしてるので、絶対に買うな。お長居します。

424 :ななし:02/04/02 10:18
>>423
現在、東京在住ではない(地方に飛ばされました(T_T)ので、買えません・・・。

425 :デフォルトの名無しさん:02/04/02 18:28
誰か俺にIMonikerをやさしく解説してください。
このインタフェース訳わからんです。

どう実装していいのかどう使っていいのか
何のためにいるのか、さぱーりわかりません。

ちなみにInsideOLE読みました。でもわかりません。


426 :デフォルトの名無しさん:02/04/02 18:41
IMonikerはIClintonを陥れたりするために使います。

427 :デフォルトの名無しさん:02/04/02 20:05
IMoniker に I はない。あるのは、ただ欲だけ(:´Д`)

428 :デフォルトの名無しさん:02/04/02 22:25
うまいなぁ。

429 :デフォルトの名無しさん:02/04/02 23:31
COM+ってこれからどうなるの?
良く分からないは、レジストリから切り離されるって噂。
それと、64bitVBが出ないんなら、64bitCOM+が出ないって事?

430 :デフォルトの名無しさん:02/04/03 01:03
MFCをかじった程度の初心者です。教えてください
・COMってなんですか?入門ページありますか?
・COMって今後はどうですか?


431 :デフォルトの名無しさん:02/04/03 01:24
こちらからお入りください (W
COM プログラミングの基本
http://www.microsoft.com/japan/msdn/thisweek/combasics/combasics1.asp

432 :デフォルトの名無しさん:02/04/03 11:12
タイプイライブラリを#importを使わずにC言語で
読み込む方法を教えて下さい。(VC6またはBCC)

433 :斬ってくれ!:02/04/03 12:08
ITypeLib や ITypeInfo とか使えば?
そういうことじゃなくて?

434 :Proxy:02/04/03 12:30
VBScript エンジンと JScript エンジンではアーキテクチャという観点から
どのようなメリット、デメリットがありますか?
たとえば文字列において VBScript では BSTR、 JScript ではオブジェクト、
実行速度などで差が出てくるものなのでしょうか?

435 :432:02/04/03 14:23
>>433
>ITypeLib や ITypeInfo
多分それです。知りませんでした。
これもQueryInterfaceやGetIDsOfNamesで取ってこれるんでしょうか。

436 :デフォルトの名無しさん:02/04/03 19:06
>>434
やってみれば?

437 :デフォルトの名無しさん:02/04/03 23:53
QueryInterface(IID_ITypeInfo, &pTypeInfo)だろ。多分。

438 :233:02/04/04 09:53
ITypeLib ITypeInfo
で検索しても日本のサイトはほとんど引っかかりませんね。
本の索引とかばっかりで。
タイプライブラリの参照で参考になりそうなWebサイトがありましたら
紹介してください。

439 :432:02/04/04 09:54
s/233/432/

440 :デフォルトの名無しさん:02/04/04 12:29
    ...


441 :IUnknown:02/04/04 12:32
>432

私の場合、ほとんどの情報や技術は MSDN ライブラリと
専門書から学びました。まあ専門書は高いですし、簡単に
買えとは言えませんが、MSDN ライブラリはお持ちでないの?

持って無くても以下のサイトで見ることが出来ます。

msdn.microsoft.com/library/

ここで次のように階層を辿って下さい。

Component Development
  Automation
    SDK Documentation
      Automation
        Type Description Interfaes


あと厳しいようですが英語が読めないというのは論外です。
専門技術を身につけるには英語力は必須ですからね。

442 :デフォルトの名無しさん:02/04/04 21:18
ひょっとして、ASPからはCOMを使ってもレジストリの中身は見れないんですか?
実行ユーザの権限が低いから

443 :デフォルトの名無しさん:02/04/05 09:23
>>442
NT,W2K,XPだとレジストリにもセキュリティ属性というものがあるんよ。


444 :デフォルトの名無しさん:02/04/05 18:15
>>443
やっぱりそうですか・・・
IISの匿名アクセスユーザをAdministratorとかに設定させるしかないのかな?

445 :デフォルトの名無しさん:02/04/05 18:18
Usersで十分。Readがあればいいんでしょ。

446 :デフォルトの名無しさん:02/04/05 18:39
>>445
とおもってUsersのユーザにしたけどだめでした。

そしてなぜかAdministratorsにしてもだめでした。
コンピュータの管理者(XPなので・・・)にしてみたらできました。

へんですね。コンピュータの管理者も所詮所属グループがAdministatorsになってる
だけなのに・・・

447 :デフォルトの名無しさん:02/04/05 18:49
iisresetしてやりなおし。

448 :デフォルトの名無しさん:02/04/05 19:01
>>447
ありゃ?できました。
IIS画面で停止->COM+のIIS????をシャットダウン->IIS画面で起動
までやったんで大丈夫かと思ってたのに。

iisresetってさらに何かやってんですね。どうやら。

・・・けどやっぱりUsersだけだとだめでした。たぶん自分の見に行ってるレジストリの
権限が高いんですね。きっと。

449 :デフォルトの名無しさん:02/04/06 17:50
COMにしたDLLに、自分自身がインストールされているパスを返す関数を
組み込みたいのですが、うまい方法がわかりません。

Dllの仕組みの中にそういう機能ってありませんでしたっけ?

450 :デフォルトの名無しさん:02/04/06 17:54
GetModuleFileNameをつかえばいいのでわ?

451 :449:02/04/06 18:44
>>450
なにか期待と違う結果が・・・

C:\WINDOWS\System32\dllhost.exe

dllを呼び出した側のモジュール名が出てきました。?

452 :デフォルトの名無しさん:02/04/06 18:51
>>451
DllMainで渡されるHINSTANCEを保存しておいて、それにGetModuleFileName()

453 :449:02/04/06 19:06
>>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));
}

454 :449:02/04/06 19:28
失礼。できてました。(iisが前のをにぎりっぱなしでした)

455 :デフォルトの名無しさん:02/04/11 05:17
昔ポプ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 が失敗するのはどういう時ですか?

多分ちゃんと登録されているオブジェクトのはずなのですが、
確かめる方法からわかりません。


459 :デフォルトの名無しさん:02/04/19 01:53
>>458
何かがマズイ時

460 :デフォルトの名無しさん:02/04/19 08:25
そのインターフェースがインプリメントされていないとき。

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の天下

466 :デフォルトの名無しさん:02/04/20 23:47
>>464
ならばVB.NETになった今は不要。

467 :463:02/04/21 00:15
自己解決しました。
簡単にレポートすると、WSHなんかに公開するオートメーションオブジェクトで、
IBindEventHandlerを使えばIConnectionPointとかを使わずに動的に
イベントハンドラを指定させたりできるというものでした。

どっかにドキュメント用意しとけよ!>M$

468 :デフォルトの名無しさん:02/04/21 00:17
COMを今から勉強しても無駄なんですか?

469 :デフォルトの名無しさん:02/04/21 07:05
無駄の定義による。

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 :デフォルトの名無しさん:02/04/22 00:59
違わない。プロパティはメソッド。

473 :デフォルトの名無しさん:02/04/22 02:43
>>472
「プロパティ⇒メソッド」は成り立つが「メソッド⇒プロパティ」は成り立たんだろ。
まったく同じみたいな書き方するなって。

474 :デフォルトの名無しさん:02/04/22 12:21
>>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?


476 :デフォルトの名無しさん:02/04/22 18:19
>違わない。
と書いてますが。

477 :デフォルトの名無しさん:02/04/22 22:17
>>475
ITypeInfoって、どうやって取得するの?

478 :475:02/04/22 23:21
>>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
>>478
ありがとう。

480 :IUnknown:02/04/23 08:36
結局 COM インターフェイスのメソッドとスクリプト言語等のメソッドを
同義に捉えてはいけないんだよね。それがいつも混乱の元になる。
472〜474のやり取りではそれが浮き彫りになってるね。

ひとつ気になったのはプロパティとメソッドの違いを問う人が、いきなり
475氏の説明を読んで理解できんのかな?って思う。「ありがとう」って
書いているし、要らぬお世話かな...。

481 :477=479:02/04/23 09:34
>>480
>>ITypeInfoって、どうやって取得するの?
>IDispatch::GetTypeinfoあたりからどうぞ。
これに対しての「ありがとう」です。
後半はよくわかりませんでした。

わからないと言えば他にも。
各メソッド/プロパティで設定したり取得したVARIANT型の変数の
開放は誰が行うべきなのか?とか。
getで得たものは自分で開放すべきなのはなんとなくわかりますが・・

482 :デフォルトの名無しさん:02/04/23 15:27
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にする場合もあるので
その場合は中身を開放する必要があるんで。

渡す場合でも渡される場合でも、このルールに従えばいいと思う。

長くてすまん。間違っていたらすまん。だれかフォローしてくれ。


484 :IUnknown:02/04/23 21:21
>プロパティは同じ関数をGET/PUTと違う種別で呼び出せる。
言いかえるならば「同じ関数名」ですね。get_、put_ が呼び出している
関数は異なる関数です。

VARIANTについては
「初期化する前のVARIANTにVariantClear()を行ってはならない」
VariantClear() は渡されたVARIANTを意味のあるものとして解釈するため、
初期化前のでたらめなデータが入っているVARIANTに対して使うと
無意味な参照を開放しようとしたり何が起こるかわからない!
(VARTYPEの解釈次第)

「クリアされていないVARIANTにVariantInit() を行ってはならない」
VariantInit() は渡されたVARIANTを意味の無いものとして解釈するため
BSTR やオブジェクト等のデータを保持しているVARIANTに対して使うと
これらは開放されること無くメモリに残り続けることになる。

って具合ですかね。当たり前のことですけど。

485 :ななしー:02/04/23 22:29
メソッドやプロパティの戻り値で
他のオブジェクトのインターフェースを返すとき
どうやって宣言してますか?

自分としては、IFooとかを返したほうが良いような気がするのですが、
いろんなサンプルでは、ほとんどIDispatchとかVARIANTで返してるので、
なんでだろう?と思いました。

486 :479:02/04/23 23:04
>>483-484
大変為になりました。

487 :475:02/04/23 23:37
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の関係?

489 :デフォルトの名無しさん:02/04/24 19:49
いんや、補助ライブラリ使用しないって事では。

490 :475:02/04/24 20:20
>「rawなCOM」ってなんでしょうか?

すんません。説明不足です。
IDispatchの話にはVB辺りを絡めて考えている人もいると思い、
「VBでのCOMではなく、>>1 に従って、生(raw)のCOMでいいんですよね?」
ということです。



491 :デフォルトの名無しさん:02/04/25 00:06
IDispatchってVBのために作られたような気がせんでもないがなー
late binding以外にIDispatchの利点てありますか?

492 :デフォルトの名無しさん:02/04/25 01:04
近頃はVBよりもJSやVBSの為ですかね。
IDispatchExとか言ってみるテスト。

493 :475:02/04/25 09:50
私もCOM(というかOLE2)を勉強し始めたときに
「IDispatchってなんで必要なんだろう?」
と疑問におもっていた。で、俺流の解釈は

1. インタプリターだとこういうほうが扱いやすいのか
と自分を納得させていましたが、
いまや、VBでさえ、IDispatchなんて関係なく
カスタムインタフェースを呼べる、実装できる。
(oleautomationの制限はあるけど)

2.中間コードも作らない純粋なインタープリターだと
カスタムインタフェースを「呼び出す」のはなんとかできても
カスタムインタフェースを「実装」するには難しいと思う。
あらかじめ、全メソッドがわかっていないとvtblを作ることができないので。

その点、IDispatchは、メソッド名を問われた時点で考えれば
いいからやりやすい。

VBは開発環境で実行してもこっそりコンパイルしてコードを作って
動かしているような感じがするので、純粋ともいえないと思う。


3.「何にも考えなくてもマーシャリングできる」
(でもlongにポインタなんか入れたらダメだけど)
とも思いつつも、
カスタムインタフェースでも
ほぼ、自動的にマーシャラを用意できる。

結局、利点は2かな?


494 :デフォルトの名無しさん:02/04/25 11:24
何を理由かこつけてんの?IDispatchはVBのためにVBチームが作った
インターフェイス。以上。VBがIUnknownを扱えるようになったのは
ずっと後の話。

495 :IUnknown:02/04/25 12:13
>492
確かに。

VBScript の Class ステートメントの定義から作られる
オブジェクトなんかは内部的には IDispatchEx 経由で
アクセスするからね。正直このステートメントの実装を
可能にするために IDispatchEx は出来たんだろうね。
(いやまあ、推測だけど...。)

496 :475:02/04/25 18:02
>>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のサンプルもろくにビルドできずに困ってます。


498 :デフォルトの名無しさん:02/05/06 00:12
ちなみに、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が受け持つサービスを
自前で用意しなければならないからだとか書いてあったが正しくその通り。

501 :デフォルトの名無しさん:02/05/06 13:01
>>500
> VBとかで使う為に必要なんですよ

.NETもそういう決まりごとでがんじがらめになってるけど、
コードを書く側にとって見えなくなってる。それがCOMとの違い。
COMは負担が大きすぎた。

502 :497:02/05/06 13:47
>>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ではみんなうまくいかなくてあきらめちゃってるんじゃないかと思う次第であります。


503 :499:02/05/06 15:31
>>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;
}


504 :497:02/05/06 15:58
>>503
ウワーン
#includeを付けたりはずしたらりしてたらビルドできるようになったよー

手順はこうです

>>497をふつうのWin32 Console exeで作成

いろいろいじるがパーイ

2chに泣きつく

>>503を読んで、ATL COM AppWizardでexeサーバを作ってコンパイル

Σ(゚д゚lll)ガーン動くよ

#includeしてるヘッダが関係してるかと思って>>497に#include <atlcom.h>とか
#define STRICTとかいれてみる

Σ(゚д゚lll)ガーンコンパイル通るよ

元の>>497に戻してビルド

Σ(゚д゚lll)ガーンコンパイル通るよ

という次第です。
コンパイラが作成する tlhとかが壊れてたのかなーと思ってみたりして。


505 :497:02/05/06 16:01
というわけで野望に向けてようやく一歩前進です。

ところで、excel 97/98/2000/2002を同じようにC++側から操作したい場合、
ソースは一個で何とかなるんでしょうか?

それぞれのofficeのバージョンごとにolbとか取り込まなきゃいかんのでしょうか?


506 :499:02/05/06 17:47
>>505
折れはアマゲープログラマなんで
EXCELのことは全然わからんのですよ。( ´Д⊂
ただやっぱ、COMなんだから
EXCEL97〜EXCEL2002が
同じCLSIDを持つコーポネントを利用しているのなら
最新のOLD1つを対象に組むだけで良いんのではないかな?

507 :497:02/05/06 18:06
互換性に関しては
__uuidof( Excel::Application )
のところがポイントですかね。
Excel97で持っているUUIDを渡すべきかな?

場つなぎ的なサンプルしかないのでこれも試行錯誤するしかないですね。


508 :デフォルトの名無しさん:02/05/06 19:03
バージョンなしのProgIDを使えばいい。
が、97〜2002で全く挙動が一緒だという保証はないと思うが。

509 :497:02/05/06 19:53
"Excel.Application.9" みたいなのがバージョン付きで
"Excel.Application" みたいなのがバージョンなしのProgIDなんでしょうか。

やりたいことはセルの値の取得と設定、マクロの起動くらいなので
バージョンには依存しないと思われます。

最新のOLD+バージョン無しProgIDの線で攻めてみます。


510 :499:02/05/06 20:00
>>507
調べまくってわかりました。
EXCEL95がxl5jp32.olb、
EXCEL97がEXCEL8.olb、
ELECEL2000がEXCEL9.olbなんですね。
それで折れが調べた限り
xl5jp32.olbとEXCEL9.olbは
コーポネント上の互換性は無いみたいです。
インターフェイスやそのメソッドとかは
なんとなく似てるんですが。
自分のWin2000ではxl5jp32.olbのインターフェイスを呼ぶと
何故か失敗するので確かめることはできなかったんですけど。
EXCEL8.olbは手元に無いのでわかりませんでした。

511 :497:02/05/06 20:57
こりゃああきらめて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インターフェイスを取得する方法。

514 :デフォルトの名無しさん:02/05/07 20:51
一番古いバージョンのExcelのタイプライブラリをインポートして、
CLSIDFromProgID( "Excel.Application" )ではだめでしょうか?

だめなら、全てIDispatch経由でアクセスするしかないでしょうか...

515 :499:02/05/08 02:43
>>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経由以外ないと、
こうなると思います。

516 :499:02/05/08 02:48
>ただし、xl5jp32.olbへのアクセスはIDispatch経由以外ないと、
>こうなると思います。
xl5jp32.olbと互換性を持たせるなら、IDispatch経由以外ないと
の間違いです。


517 :514:02/05/08 22:29
>>515 497ではないですが(^^;)

古いexcel等は確かおっしゃるとおりdispinterfaceしか定義されていなかった
と記憶しています。

そこで >>497 さんは #import を使っているみたいですから、#import すれば
Dispatch経由でアクセスしてくれるラッパが自動的にできないかなーと思ったしだいです。

今手元に環境が無いのでおぼろげな記憶だけですが..

だめならやっぱり >>514 に書いたとおり、
せめて excel のクラスIDぐらいはバージョン非依存で取得して、
あとは自分で IDispatch 経由でアクセスするしかないかと..


518 :497:02/05/09 01:17
>>514-517
ありがとーございましし。

>xl5jp32.olbと互換性を持たせるなら、IDispatch経由以外ないと

コードレベルでの互換をとるなら、という意味ととってよいでしょうか。
OLBは今ある最新のものを使うとして、それがofficeのバージョンに
依存するかどうか、が一番の焦点だったのですが、問題なさそうですね。

とりあえず、バージョン非互換のクラスID+OLBのインポートで
テストしてみます。
2chで初めて人に感謝しました。


519 :sage:02/05/11 16:26
すんません質問です。DelphiでCOMを作る方法を探しています。

Delphi6 PersonalでCOMが作れるか調べていたのですが、
Personalにはウィザードがないようです。ベタに作る手は
あると思うのですが、Googleでもあまり情報がなく。

VC++は歯が立たないので、ほかの言語でCOM作って遊ぼうと
している次第で。WSC、VB6、.Net(C#)は実践済み。

520 :デフォルトの名無しさん:02/05/11 16:31
それだけできてVC++で作れないというのが信じられない

521 :デフォルトの名無しさん:02/05/11 18:35
hello worldだけとか?<実践済み

WSC(わんだーすわんからー?)/C# がCOMと関係あるとは思えない

522 :519:02/05/12 10:17
sage間違いすいません。

>>520
Cの経験がないのです。ニセモノです私(恥)

>>521
ASP/スクリプト環境で使うことを考えていたのです。
作ったものが呼べるとわかればあとは何とかなると思っています。

WSCはWindows Script Componentです。あまり流行ってませんが。
スクリプトのかたまりをCOMとして呼べる代物。
C#/.netはinterop経由でアセンブリをCOMとして呼べます。

VBならActiveX DLLでCOMのこと何も知らずに作れるので、
気楽なものかと思っていたのですが。このスレ読む限り
非常にレベル高そうですね。

ここまで書いてCOMの意味を誤解している気がしてきました。

523 :デフォルトの名無しさん:02/05/12 10:34
生COMの実装はカナーリつらいぞ。
知識として知っておくのはいいかもしれんが、自分でやることはないだろうなあ。
DelphiでのやりかたはDelphi関連のスレで聞いた方がいいとおもう。
なんらかのサポートがあったと思うがよく知らない。

524 :519:02/05/12 17:44
ありがとうございます。場所を変えて聞いてみます。

525 :デフォルトの名無しさん:02/05/13 03:21
今からCOMはかなりお勧めしない。
やるならオートメーションは意図的に省いて
それ以外のアーキテキチャを勉強を勉強すべき。
マーシャリングとかそこらへん。
俺は確信に至った。
IDispatchやIDispatchExなんてのは
明らかに死に行く技術だ。存在価値ゼロ。

526 :ななし:02/05/13 09:26
>>525

そこまで読み切れる判断力がうらやましい。(決して皮肉とかじゃないですよ)
VBがやっとな俺の頭脳では、高度な技術の是非までは残念ながら判定できない。(泣


527 :sage:02/05/13 13:15
497です。
なんとかうまいことC++からExcelを操作することができるようになりましし。

重ね重ねお礼を申し上げます。



528 :ななし:02/05/14 07:55
age

529 :デフォルトの名無しさん:02/05/14 12:12
>それ以外のアーキテキチャを勉強を勉強すべき。
君はまず日本語を勉強すべき。


530 :ななし:02/05/14 12:49
>>525
>>529
単に手が滑ったか、コピペミス程度のことと思われ。

531 :デフォルトの名無しさん:02/05/14 22:44
アーキテキチャ

532 :デフォルトの名無しさん:02/05/17 04:37
>Excelを操作することができるようになりましし
こういうのってIDispatchのおかげじゃないの?

533 :デフォルトの名無しさん:02/05/17 08:41
このスレでMFCアプリケーションからのMSHTMLの利用方法に関する質問をしてもいいですか?
Web制作板はscriptの話ばっかりで参考にならなくて。

534 :デフォルトの名無しさん:02/05/17 08:43
>>533
こんなスレもあるよ。
http://pc.2ch.net/test/read.cgi/tech/982930049/l50

535 :533:02/05/17 09:10
>>534 おおう。サンクス。とりあえずそっち全部読んでみるよ。それでもわからんかったら帰ってくるかも。

536 :デフォルトの名無しさん:02/06/05 20:44
age

537 :デフォルトの名無しさん:02/06/09 19:47
COMってEJBとかと比較されますけど、速度はどうなんでしょうか?単純に比較は
しにくいかもしれないですけどVBとVCで作ったCOMの比較とEJBを比較するとどの
程度の速度差になるのでしょうか?やはりATLなどでVCのCOMがあまりはやらない
のはVBなどでも満足いく速度だから?

538 :デフォルトの名無しさん:02/06/10 07:45
>>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で記述されたクライアントから参照することは可能でしょうか?

よろしくお願いいたします。


540 :COMビギナ:02/06/10 18:53
連続カキコでスマソ。

ちょっと誤解を招きそうな表現なので書き直します。

enum定義を含むタイプライブラリを、XMLで利用する際に、
その定義されたシンボルを参照することは可能でしょうか?

よろしくです。


541 :デフォルトの名無しさん:02/06/10 19:25
無理

542 :COMビギナ:02/06/11 03:43
>>541

レスどもです。
やっぱ無理ですか。
別な方法を考えます。

543 :デフォルトの名無しさん:02/06/18 15:49
COMってコールバック関数を引数に出来ないんだねぇ。
クライアントにコネクションポイント実装させるのもなあ。
しかし本気でこの型制限にはいらつくよ。何も出来やしねえじゃねえか。

544 :デフォルトの名無しさん:02/06/18 16:10
素直にインターフェイスポインタ渡せよ。

545 :デフォルトの名無しさん:02/06/23 05:39
まったくだ。コールバック関数よりはるかに柔軟だと思うが。

546 :デフォルトの名無しさん:02/06/29 11:58
COMにおける配列参照はいままでも話題になっては
いるのですが、私も文字列の配列をCOM<->VC++クラ
イアント間でやり取りする方法に悩んでいます。

どなたか以下の状況で実装されているソースをご存知
ありませんか?

(1)VC++クライアント側に配列のインスタンスがある。
これはCOleSafeArray

(2)配列はBSTRの一次元構造

(3)COM側で、受け取った配列の参照に対して操作を加える

よろしくお願いします。


547 :543:02/06/29 20:05
>>544-545
ピュアなCやC++の環境で使いたい場合どうすんの?
それだとCOMクライアント専用になっちゃうじゃん。
あと質問。
IDLでメンバのオーバーロードを定義すると怒るんだけど。
これって仕様?
だとしたら本当に糞だなCOMって。

548 :デフォルトの名無しさん:02/06/29 20:18
古い話してるね〜
COMなんてもうないだろ。
今はEXEだよ。

549 :デフォルトの名無しさん:02/06/29 20:20
コールバックされたいクラスの事だよな。
それなら、別にIUnknownから継承をうけて、実装を
いれたとしても、pureなC++でも使えると思うが。

550 :名前:デフォルトの名無しさん:02/06/29 20:22
>>548
意味不明。ネタにしても自殺を勧めたくなるほどつまらん。

551 :543:02/06/29 20:32
>>549
IUnknownから継承を受けるには
IUnknownの実装を入れなければならないと思うけど。
Release()とかダミーで実装させるの?

552 :デフォルトの名無しさん:02/06/29 20:44
真っ当に実装したらいいやん。

553 :543:02/06/29 22:43
>>552
それじゃ、COMで実装させることと変わりないじゃん。(笑
MSだって、DirectXとかの例があるし諦めろってことだな。
所詮過渡期の技術か。

554 :デフォルトの名無しさん:02/06/29 22:51
>553
でも、COMクライアント専用(この語もなんだか意味不明っぽいが)
というわけではないだろ。

555 :デフォルトの名無しさん:02/06/29 23:22
Cからタイプライブラリってどうやって使うんですか?
FreeのBCCでExcelの定数を認識させたいんですが、
さっぱりです。Invokeとかはなんとなくつくれるんですが。
Excelのタイプライブラリの参照例みたいなコードどこかに無いでしょうか

556 :デフォルトの名無しさん:02/06/30 00:14
>>553
お前、結局何が不服なんだ?
まぁ過渡期ってのは間違いないだろうな。といってもあるものすべて過渡期と言えるが。
安心しろ。いろんな欠点は.NETで解消されてるだろうから。

557 :543:02/06/30 03:08
>>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等で
安く作らせるための構図であると。


559 :ななし:02/06/30 10:17
>>558

ホンネなんだろうけど・・・正直過ぎ。(苦笑)

560 :デフォルトの名無しさん:02/06/30 11:39
あの構成を見てそう思わない奴は居ないと思う。
いまさら言ってるお前って・・・

561 :543:02/06/30 20:04
>>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)で初期化したときは正常に取得できます。

563 :デフォルトの名無しさん:02/07/12 20:01
IMarshalに答えない仕組みなんじゃない。あるいは、local属性つけてるか。

564 :デフォルトの名無しさん:02/07/12 20:28
>>558
ガーン、おれは残り99.9%の中のその他大勢だったのか・・・
0.1%の中にはいるにはどうすればいいんだ・・・(鬱

565 :デフォルトの名無しさん:02/07/12 20:31
>>564
0.1%なんて世紀末におけるサウザーぐらいな奴と思われ。
フハハハーとか言って、余興でジジイ殺しちゃうような。

566 :デフォルトの名無しさん:02/07/13 00:03
開発言語の格差をCOMで吸収しようという。
ただしオブジェクトはバイナリレベルで提供と。


161 KB
■ このスレッドは過去ログ倉庫に格納されています

 (   ";;  . l_.,)    l l l,二ニ,ヽ、_`´,ノ ヾ、 `´,ノ    ,..」 lL、   ,川,  ヾ,ヽ-´ノ
      ` ̄ ̄     ,」⊥L、 `~~~´   `~゙゙~        ̄ ̄´ -===-  ´~~
              ̄ ̄ ̄
日:2006/
862 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2006/08/22(火) 10:44:06 ID:QgX
3 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2006/08/22(火) 10:45:54 ID:QgXodIPB
862 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2006/08/22(火) 10:44:06 ID:QgXodIPodIP ォ e/1026180214/1" target="_blank">>>1
>>1
>>1 >>1 >>1 >>1 >>1 >>1 ★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)