COM の世界を斬る!

このエントリーをはてなブックマークに追加
497デフォルトの名無しさん
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は負担が大きすぎた。
502497: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ではみんなうまくいかなくてあきらめちゃってるんじゃないかと思う次第であります。
503499: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;
}
504497: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とかが壊れてたのかなーと思ってみたりして。
505497:02/05/06 16:01
というわけで野望に向けてようやく一歩前進です。

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

それぞれのofficeのバージョンごとにolbとか取り込まなきゃいかんのでしょうか?
506499:02/05/06 17:47
>>505
折れはアマゲープログラマなんで
EXCELのことは全然わからんのですよ。( ´Д⊂
ただやっぱ、COMなんだから
EXCEL97〜EXCEL2002が
同じCLSIDを持つコーポネントを利用しているのなら
最新のOLD1つを対象に組むだけで良いんのではないかな?
507497:02/05/06 18:06
互換性に関しては
__uuidof( Excel::Application )
のところがポイントですかね。
Excel97で持っているUUIDを渡すべきかな?

場つなぎ的なサンプルしかないのでこれも試行錯誤するしかないですね。
バージョンなしのProgIDを使えばいい。
が、97〜2002で全く挙動が一緒だという保証はないと思うが。
509497:02/05/06 19:53
"Excel.Application.9" みたいなのがバージョン付きで
"Excel.Application" みたいなのがバージョンなしのProgIDなんでしょうか。

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

最新のOLD+バージョン無しProgIDの線で攻めてみます。
510499:02/05/06 20:00
>>507
調べまくってわかりました。
EXCEL95がxl5jp32.olb、
EXCEL97がEXCEL8.olb、
ELECEL2000がEXCEL9.olbなんですね。
それで折れが調べた限り
xl5jp32.olbとEXCEL9.olbは
コーポネント上の互換性は無いみたいです。
インターフェイスやそのメソッドとかは
なんとなく似てるんですが。
自分のWin2000ではxl5jp32.olbのインターフェイスを呼ぶと
何故か失敗するので確かめることはできなかったんですけど。
EXCEL8.olbは手元に無いのでわかりませんでした。
511497: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インターフェイスを取得する方法。
一番古いバージョンのExcelのタイプライブラリをインポートして、
CLSIDFromProgID( "Excel.Application" )ではだめでしょうか?

だめなら、全てIDispatch経由でアクセスするしかないでしょうか...
515499: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経由以外ないと、
こうなると思います。
516499:02/05/08 02:48
>ただし、xl5jp32.olbへのアクセスはIDispatch経由以外ないと、
>こうなると思います。
xl5jp32.olbと互換性を持たせるなら、IDispatch経由以外ないと
の間違いです。
517514:02/05/08 22:29
>>515 497ではないですが(^^;)

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

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

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

だめならやっぱり >>514 に書いたとおり、
せめて excel のクラスIDぐらいはバージョン非依存で取得して、
あとは自分で IDispatch 経由でアクセスするしかないかと..
518497:02/05/09 01:17
>>514-517
ありがとーございましし。

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

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

とりあえず、バージョン非互換のクラスID+OLBのインポートで
テストしてみます。
2chで初めて人に感謝しました。
519sage:02/05/11 16:26
すんません質問です。DelphiでCOMを作る方法を探しています。

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

VC++は歯が立たないので、ほかの言語でCOM作って遊ぼうと
している次第で。WSC、VB6、.Net(C#)は実践済み。
それだけできてVC++で作れないというのが信じられない
hello worldだけとか?<実践済み

WSC(わんだーすわんからー?)/C# がCOMと関係あるとは思えない
522519:02/05/12 10:17
sage間違いすいません。

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

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

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

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

ここまで書いてCOMの意味を誤解している気がしてきました。
生COMの実装はカナーリつらいぞ。
知識として知っておくのはいいかもしれんが、自分でやることはないだろうなあ。
DelphiでのやりかたはDelphi関連のスレで聞いた方がいいとおもう。
なんらかのサポートがあったと思うがよく知らない。
524519:02/05/12 17:44
ありがとうございます。場所を変えて聞いてみます。
525デフォルトの名無しさん:02/05/13 03:21
今からCOMはかなりお勧めしない。
やるならオートメーションは意図的に省いて
それ以外のアーキテキチャを勉強を勉強すべき。
マーシャリングとかそこらへん。
俺は確信に至った。
IDispatchやIDispatchExなんてのは
明らかに死に行く技術だ。存在価値ゼロ。
526ななし:02/05/13 09:26
>>525

そこまで読み切れる判断力がうらやましい。(決して皮肉とかじゃないですよ)
VBがやっとな俺の頭脳では、高度な技術の是非までは残念ながら判定できない。(泣
527sage:02/05/13 13:15
497です。
なんとかうまいことC++からExcelを操作することができるようになりましし。

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

528ななし:02/05/14 07:55
age
>それ以外のアーキテキチャを勉強を勉強すべき。
君はまず日本語を勉強すべき。
530ななし:02/05/14 12:49
>>525
>>529
単に手が滑ったか、コピペミス程度のことと思われ。
アーキテキチャ
>Excelを操作することができるようになりましし
こういうのってIDispatchのおかげじゃないの?
533デフォルトの名無しさん:02/05/17 08:41
このスレでMFCアプリケーションからのMSHTMLの利用方法に関する質問をしてもいいですか?
Web制作板はscriptの話ばっかりで参考にならなくて。
535533:02/05/17 09:10
>>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は元々遅いから、それで満足する様なやつらからは
文句はでないってだけだと思う。速いマシンに換えるとかね。
それで満足しないやつらは他の手段を模索するでしょう。
539COMビギナ:02/06/10 18:44
どうかご教授を。

タイプライブラリにenumで定義した定数シンボルを、
XMLで記述されたクライアントから参照することは可能でしょうか?

よろしくお願いいたします。
540COMビギナ:02/06/10 18:53
連続カキコでスマソ。

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

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

よろしくです。
541デフォルトの名無しさん:02/06/10 19:25
無理
542COMビギナ:02/06/11 03:43
>>541

レスどもです。
やっぱ無理ですか。
別な方法を考えます。
543デフォルトの名無しさん:02/06/18 15:49
COMってコールバック関数を引数に出来ないんだねぇ。
クライアントにコネクションポイント実装させるのもなあ。
しかし本気でこの型制限にはいらつくよ。何も出来やしねえじゃねえか。
素直にインターフェイスポインタ渡せよ。
まったくだ。コールバック関数よりはるかに柔軟だと思うが。
546デフォルトの名無しさん:02/06/29 11:58
COMにおける配列参照はいままでも話題になっては
いるのですが、私も文字列の配列をCOM<->VC++クラ
イアント間でやり取りする方法に悩んでいます。

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

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

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

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

よろしくお願いします。
547543:02/06/29 20:05
>>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
意味不明。ネタにしても自殺を勧めたくなるほどつまらん。
551543:02/06/29 20:32
>>549
IUnknownから継承を受けるには
IUnknownの実装を入れなければならないと思うけど。
Release()とかダミーで実装させるの?
真っ当に実装したらいいやん。
553543:02/06/29 22:43
>>552
それじゃ、COMで実装させることと変わりないじゃん。(笑
MSだって、DirectXとかの例があるし諦めろってことだな。
所詮過渡期の技術か。
>553
でも、COMクライアント専用(この語もなんだか意味不明っぽいが)
というわけではないだろ。
555デフォルトの名無しさん:02/06/29 23:22
Cからタイプライブラリってどうやって使うんですか?
FreeのBCCでExcelの定数を認識させたいんですが、
さっぱりです。Invokeとかはなんとなくつくれるんですが。
Excelのタイプライブラリの参照例みたいなコードどこかに無いでしょうか
>>553
お前、結局何が不服なんだ?
まぁ過渡期ってのは間違いないだろうな。といってもあるものすべて過渡期と言えるが。
安心しろ。いろんな欠点は.NETで解消されてるだろうから。
557543: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

ホンネなんだろうけど・・・正直過ぎ。(苦笑)
あの構成を見てそう思わない奴は居ないと思う。
いまさら言ってるお前って・・・
561543: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)で初期化したときは正常に取得できます。
IMarshalに答えない仕組みなんじゃない。あるいは、local属性つけてるか。
564デフォルトの名無しさん:02/07/12 20:28
>>558
ガーン、おれは残り99.9%の中のその他大勢だったのか・・・
0.1%の中にはいるにはどうすればいいんだ・・・(鬱
>>564
0.1%なんて世紀末におけるサウザーぐらいな奴と思われ。
フハハハーとか言って、余興でジジイ殺しちゃうような。
開発言語の格差をCOMで吸収しようという。
ただしオブジェクトはバイナリレベルで提供と。
567ななし:02/07/23 19:47
age
568デフォルトの名無しさん:02/07/25 18:45
マーシャリングの質問。
メインSTAで作成したインターフェイスポインタを別のMTAなスレッドで
マーシャリングせずに使ったら、普通に使えてしまったんだがこれって
このまま使っても問題でないんだろうか?
その逆で、MTAなスレッドで取得したインターフェイスポインタをメインSTAで
使用しても同じように問題なく使えました。

ちなみにマーシャリングしようとするとエラーが出て、マーシャリングが
できないんで、そのまま使ってみたんだけど…。

う〜ん、COMは良く分からん(;´д⊂
C++のセマンティクでは使えて当然。STA側のオブジェクトがクリティカルセクションの
保護してなくて、かつ同時に複数のMTAからさわるなら、やめといたが無難。
MTAの生ポインタをSTAが使うのは、別に構わない。
>>568
インターフェイスポインタをどうやって渡したのかによるね。
インターフェイスのメソッドパラメータで渡してるなら、COMが勝手に
マーシャリングしてくれるから問題なし。問題なのはグローバル変数とかで
共有している場合だけ。
571568:02/07/26 10:05
レスありがとう。

>>569
「アパートメント境界を越えての使用はマーシャリングする必要がある」
って各所に書かれてるんだけど、それは気にしなくてもいいの?
普通のコードと同じ扱いで、そのコードがスレッドセーフ(ThreadingModel=both)なら
そのまま使えて、そうでなければ(ThreadingModel=Apartment)クリティカルセクション
とかで保護すればいいだけ?

>>570
グローバル変数で共有してます…。

そもそも、何故マーシャリングできないのかが不明なんですよね。
マーシャリングするには[HKEY_CLASSES_ROOT\Interface]あたりのレジストリ
に何か登録されてないと駄目とかあります?
>>571
それならマーシャリングが必要。マーシャリングするには、マーシャリング用のコードが必要。
TLBがあるならユニバーサルマーシャラを使う。IDLがあるならMIDLでマーシャリングコードを作れる。

ちなみに、CriticalSectionを使うとかいう問題ではないのでご注意。
573568:02/07/26 16:18
>>571
ってことは、マーシャリングできないのはマーシャリングコードが無いからか。
ちなみに元発言のMTAなCOMコンポーネントはDirectPlayなんでtlbもidlもないです。
STAの方はidlならあったんだけど、こっちもMS提供な代物なのでいじってもしょうがないしな。
idlがあるからそれを継承してマーシャリング機能だけ追加したものを作るってのは可能?

一番手っ取り早い解決方法は、パフォーマンスを犠牲にして全スレッドをSTAで
やればいいんだろうけど、なんか悔しいし…。

>ちなみに、CriticalSectionを使うとかいう問題ではないのでご注意。
アパートメント境界を越えたアクセスは何かしらの方法でマーシャリングは必須。
ただ、マーシャリングした結果が生ポインタの場合もある。
と言う認識でいいのかな?
>>573
That's correct.
575569:02/07/26 20:34
なんか、盛り上がってるが……。STA用のコンポーネントの代表はOCX.こいつは、HWNDを
使ったりする。当然、作成したスレッドで動く必要がある。マーシャリングすると、
Windowsメッセージ経由でリクエストされるから、DefWndProcからの呼び出しとなる
ってことは、そのSTAで動くから問題なし。だから、569はちょっと乱暴で、572が正しい。
でも、ユーティリティクラス(引数同志の演算とか。ハッシュ計算するとかさ)をVBで作っちゃった
ような場合(だからSTA)で、TLS使ってないことがわかりきってれば、別にマーシャリング
しなくたって構わないわけ(だが、透過性を無視してる=COMの原理破壊)。
その他、MTAでCoCreateInstanceするとブルブルとか、いろいろあって、おもしろい。
576569:02/07/26 20:46
>>573
あと、STAだからパフォーマンス犠牲というのは必ずしも正しくはない。並行動作
に意味がないのであれば、STAはひたすら同一スレッドのスタックを使いながら
突っ走るから、実は高速な動作が1番期待可能。(アウトプロセスサーバがSTAだと
リクエスト1個づつしか処理できないから、パフォーマンスは低くなるけど)
577568:02/07/29 18:54
また、レスありがとう。
まず訂正。前発言の>>571>>572でした…。

>>573
全部「That's correct.」と解釈してもいいんだろうか…。
説明が無いだけにちょっと不安(^^;

>>569さん
COMの手順に則る限りはマーシャリングは必要なんですね。
「そうでなければ自己責任で…」って感じでしょうか。(^^;
もう一つのパフォーマンス犠牲の話ですが、今回はDiretPlay使っているので
たぶんパフォーマンス落ちます。測っては無いので、どれぐらい落ちるかは不明ですが。
それに、DirectPlayがスレッドを乱立してる感じなんで並行動作してるでしょうし。

う〜ん、どうにも解決手段が見つからない。こう言う時こそMSDNのインシデント使うべきか…。
578568:02/07/29 18:55
ごめん、また間違えてる。>>573>>574です…。
579569:02/07/29 20:02
DirectPlay使ったことないから、わかんないなぁ(使ってる人、尊敬する)。
STA側ってなに? バイナリの内側の処理を勘案してMTAから使っても平気とか考えるって
のがCOM違反なだけで、使って問題なければ別にOKなわけだから、そっちでごまかすって
手もあるよね。
STAをMTA(のランダムなスレッド)から生アクセスする問題は、次の点
1.レースコンディション(そりゃそうでしょ?)
2.HWNDの取り扱い(これ違うスレッドから呼ぶとエラー食らうWin32APIもあるから当然)
3.規約違反(気にすればってことで)
4.TLS(スレッドローカルストレージ)使われてるとクラッシュ
#1.については、STAで作ってるんだからクリティカルセクション保護は当然してない。
これらに問題なければ3.に抵触するってだけの話。
580569:02/07/30 00:57
5.中で上の1,2,4を持ったSTAのオブジェクトを作って使っている場合もまずい
ということもあるから、基本はマーシャリング必須。しかし、5.についても実は
雰囲気でわかったりもするし(そもそもデバッガで動かせばロードしたDLLがわかる
から、把握できるし。
581568:02/07/30 18:39
>>569さん
STAなコンポーネントはActiveIMMっていうGlobalIMEを使うのに必要な
ActiveXコンポーネントです。

で、
>STAをMTA(のランダムなスレッド)から生アクセス
してみたんだけど、駄目でした。クラッシュはしなかったけど、どうにも
メッセージ処理が上手く言ってないっぽい。
[OnDefWindowProc()]←こんなメソッドもあるんでかなり怪しいし。
あと、クラッシュはしなかったんでTLSは使ってなさそう。ってな感じかな。
こっちはもうちょっと探ってみるけど…。

という事で、解決策は
・STA一本で行く
・何とか完全分離してみる
・マーシャリングコードを自分で用意してみる(できるのか?)
・MSDNのサポートで聞いてみる(「できません」と答えてきそう…)
・その他、あれば募集中w
ってな所?
582569:02/07/30 20:08
では、自力マーシャリングでいくのがいいかな? MTAからSTAへのマーシャリングの
問題点は、SendMessageしてSTAで処理が完了するまで待たされることにあるから、
STAで動いてる側に対してPostMessageで処理を行えと通知する。(ようするに、自分で
非同期COM呼び出しをするってこと)そもそも、STA側のインターフェイスポインタを
マーシャリングできないわけだから、いずれにしても自分でやるしかないし。
つまり、ActiveMMを貼り付け?てるウィンドウのHWNDをグローバルに可視状態にして、
MTAはそこめがけてPostMessage(WM_APP、wParam, lParam)してやるわけ。
応答が必要な場合は、Eventで待つか、グローバル変数に状態を入れてポールするしか
ないけど(SendMessageで応答を待つのも悪くはないが)。
注意点は、wParamやlParamに自動変数のポインタを渡すのは禁物って(あたりまえだけど)
ことぐらい。
583569:02/07/30 22:01
もしかしたらダブルかも知れないが……
上のは中途半端だからもう少し付け加えると、COMにマーシャリングさせられないわけだから、
STA側のウィンドウハンドラで、WM_APPを受け取ったら、wParamとかから、ActiveMMの適切
なメソッドを呼び出してやる(=自分でプロクシ/スタブをやってやる)という意味です。
584568:02/08/02 10:52
>>569さん
いろいろとありがとう。ちと忙しくなってきたのですぐには試せないけど
とりあえず、手動マーシャリングの方向で作ってみます。
なんだか難しいこと書いてるけど、CoMarshalInterfaceでダメな理由がなにかあるのか?
586568:02/08/02 18:34
>>585
DirectPlayにもActiveIMMにもマーシャリングコードが用意されてないらしいのですよ。
なんで、CoMarshalInterface()を使ってもマーシャリングできないのです。
それで、>>581の解決策のうち手動マーシャリングという話になったのですよ。

まぁ実際使ってるのは
CoMarshalInterThreadInterfaceInStream()
↑こっちですけど、中身は一緒ですし。
ちなみに返ってくるエラーはREGDB_E_IIDNOTREG(0x80040155L)です。
このエラーはMSDNに具体的な内容が記述されていないので、
「マーシャリングコードがないからマーシャリングできないらしい」
と言う不確かな結論になっているのですよ。
587569:02/08/02 19:56
ちなみに、pActiveIMM->QueryInterface(IID_IMarshal, (void**)&nannka);
して、HRESULT確かめてみるってのが、最初にすべきことだったかも。
ところで、ActiveIMMってのはどこの製品? なぜ、typelibマーシャリングを禁止
してるんだろ? (MFCのDLLで作ったのかな?)
588568:02/08/05 11:02
見返すと>>586って「ですよ」だらけで変な言葉遣いだな(^^;

>>569さん
QueryInterface()やってみました。結果はE_NOINTERFACE(0x8004002)。
idlではIUnknownを継承してたのでやっぱりと言う感じ…。
それと、idlに「tlbは全く使用しません」ってなことも書いてありました。

ちなみにActiveIMMはMSの製品(のはず)で、Win9x系での多言語入力をサポートする
ActiveXコンポーネント。所定のSDK入れればWin2kでもコンパイルだけなら出来ます。

う〜む、これ作った人がIUnknownから継承させたのが全ての元凶?(-_-;
589569:02/08/05 20:40
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を
返すこと。ワケワカな書き方だけど、まあそんな感じ。
590569:02/08/05 20:59
今、dimm.idlを見たけど、オートメーションコンパチ型で作られてないから、TypeLibマーシャラは利用できない。
で、見るからに、MessagePumpどうしたとか、スレッドべったりだから、これはすっぱりMTAからの利用は
あきらめて、ホストしているSTAに対してメッセージ投げてSTAで処理させるしかないっす。582の方法。
591568:02/08/06 21:24
>>569さん
ふむふむ、要はCOMサーバ内に目的のインターフェイスが実装されてて
それをQIで返してくれれば、継承しようがしまいが問題ないと言うことですね。
もちろん、IUnknownは必須でしょうけど。
で、やっぱり手動マーシャリングしかないのですね。うむ、それで頑張ろう。

いろいろ聞いたついでにもう一つ聞いておきたいんですが、STA側からMTA側の
インターフェイスをグローバルで共有して扱う場合は、規約違反とパフォーマンス
ペナルティがあるだけで特に問題ない?
実際にコードを走らせた時は問題なく動いてるけど、どうなんでしょう?
592569:02/08/07 03:58
STAからMTA使うのって、全然問題なしと思ってるけど。そもそもMTAってのは、特定の
スレッドに結びつかないってことなんだから。じゃあなぜ、BothとFreeに分かれてるか
といえば、STAでCoCreateInstanceしたときに、どこに作られるかって点がひとつ。
(Bothは呼び出したSTAに作られるけどFreeは「どこか」に作られる)
ちなみに、Inside COM日本語版309ページに「つまり、フリースレッドのコンポーネント
は、同じプロセス内のアパートメントスレッドに対してポインタを直接渡せるのである」
って書ききってるよ、今、初めてそのへん読んだけど。いや、実はなぜ、STA->MTAに
マーシャリングが必要かそっちがわからん……
593569:02/08/07 04:03
あと、その場合、パフォーマンスペナルティは無いよ。同時に2つのSTAからMTAの
オブジェクトを(デュアルCPUで)使うとしたって、MTAでレースコンディションに
対するクリティカルセクションでひっかかるとかはあるにしても、両方のSTAは、
単にcallで自分のとこのスタックを走ってくだけだから。(生ポインタだから、プロクシ
を通さない、つまりC++での関数呼び出しと変わらないわけ)
594568:02/08/08 14:21
>>569さん
ん?BothはSTAでもMTAでもどっちでも利用可能ってことじゃないんですか?
実際は作成したスレッドが所属する方に入って、STAならCOMの機構により順番に
処理されてMTAならリアルタイムに処理される。
そこで、普通にスレッドセーフに作ればBothでいけるんだけど、STAに使われる
メッセージポンプを壊すような作りにしてるとか、STAで使うのがまずい場合だけ
Freeになると
http://support.microsoft.com/default.aspx?scid=%2Fisapi%2Fgomscom%2Easp%3Ftarget%3D%2Fjapan%2Fsupport%2Fkb%2Farticles%2Fjp150%2F7%2F77%2Easp&LN=JA#
↑ここらへん読んでそう思ってました。

STAからMTAなインターフェイスを使う時にマーシャリングする理由は
カスタムマーシャリングを考慮してるからじゃないんでしょうか?
普通は必要ないけれども、カスタムマーシャリングをする時としない時とを
場合わけするとややこしいから、とりあえずしとけ。みたいな
595569:02/08/08 23:02
>カスタムマーシャリングを考慮してるからじゃないんでしょうか
あっ、そうか。それはすごく納得。
>メッセージポンプを壊すような作りにしてるとか
確かに引用ページにもそう書いてあるけど、これは意味不明。
でも、その後にある、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を設計する上で
仕様上の規約なのかどうかをはっきりさせたいのですが

皆様のご意見をお願いします
Interfaces are immutable. Once assigned an IID and published, no element of the interface definition may change.
超訳)インターフェイスはイミュータブルに決まってんだろ。IIDを割り当てて公開しちまったら、何ひとつたりとも変えんじゃねぇ。ゴルァ。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncomg/html/msdn_therules.asp

とは言ったって、使ってるのが自分だけとかだったら、思う存分変えても誰も困らないのもこれ自明。
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にぶっこむのパターンが多いと
思う これもインストーラまかせ
607602:02/09/24 01:10
>>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
624VB房:02/11/02 12:03
質問です。

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するためのインターフェース。
リフレクションみたいなそういう感じ・・・
629628:02/11/02 12:54
蛇足しちゃうとtypelibをメタデータと読み替えれば.NET。
630VB房:02/11/02 13:06
>>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するのは不満か?それとも知らないだけか。
パスワード知っているならそれができるだろうが。

管理者以外でもインストールしうるから現状に色々な問題があるんだろ。
マシンが正常に動き続けないんだったらインストールすることに何の
意味があるんだよ。勘違いは君だよ。もっと広い視野で物事考えないと
人間として成長できないぞ。
647元質問者じゃないが:02/11/03 14:40
>>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でオブジェクトを継承って???
アグリゲーションのこと?
マルチです
661658:02/11/06 00:41
アグリゲーションでもコンテイメントでも構いません.
アグリゲーションでできれば楽かな通っているのですが^^;
age
663デフォルトの名無しさん:02/11/08 02:28
>>656
>読むべき書籍を提示して頂けると嬉しいです。
純粋にCOMって何?
ということなら,「Inside Com」がお勧め。
OLEも含めてなら,「Inside OLE」かな?

664デフォルトの名無しさん:02/11/08 08:39
>>663
感謝。
「Essential COM」 ってどうですか?
666デフォルトの名無しさん:02/11/15 19:41
MicrosoftのSOAP使ってサーバーCOMモジュール作ったんだが、
リクエストがある度に、インスタンスの生成・破棄が起きている。
何とかならんもんか。

スレ違いならスマソ
>>665
名著だが、今となって読む価値があるかは、絶妙に微妙
>>666
VC++のBothスレッドモデルでステートレスなCOMを作っているなら、
IObjectControlインターフェイスを実装してCOM+ Component Serviceに登録。


669 :02/11/17 21:02
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から呼び出される
ぷっ
676専門バカにうんざり:02/11/29 20:58
>ぷっ
ぷっ
ネタにマジレス
regsvr32.exeは、%SYSTEMROOT%\system32の下にいるから、当然、OSの構成要素ですが何か?
678専門バカにうんざり:02/11/29 22:58
MODESET MODE=SUP,KEY=ZERO
679デフォルトの名無しさん:02/12/02 10:47
>>677
freecell.exeも、%SYSTEMROOT%\system32の下にいるから、当然、OSの構成要素ですが何か?
つーかregsvr32.exeは必ず入っているとは限らないのだが。
OSでなきゃ何だと言いたいんだよ
カーネルモード以外はアプリとか言ってのける手合いか?
682??:02/12/02 15:12
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*/------//実装略
みたいなのあるんですけど
683??:02/12/02 15:16
これで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
エクスポートはどうやってるの?
685??:02/12/02 15:54
>>684 ifaststring.h をインクルードするだけじゃダメですか?
というか、本にはそう書いてあるので・・・

exportって「_declspec(dllexport)」のことですか?
一応、class IFastString や class FastString の間に挟んでみたりもしたのだが・・・

素人丸出しの質問で申し訳無いス。
686デフォルトの名無しさん:02/12/02 15:55
リンカに、dllを作ったときにできたlibファイルを、教えておかないと逝けない。
それがいやなら、LoadLibraryからGetProcAddressの流れを。
688??:02/12/02 16:12
>>687
使う側のアプリのプロジェクトの設定で
「リンク」タブのところの「オブジェクト/ライブラリモジュール」に
libファイル名を入れておけばOKですよね?(パスもちゃんと通ってる)
>>685
うん、ダメ。
ちょっとスレ違いになってきたな

http://pc3.2ch.net/test/read.cgi/tech/1036897197/
あたりでどうだ?
690??:02/12/02 16:42
>>689 誘導されますた。thx!
691デフォルトの名無しさん:02/12/03 12:52
IWebBrowserApp って何?
IWebBrowser2とはどう違うの?

IWebBrowserAppを取得する時は、IServiceProvider::QueryService
を使うというのも意味が分からないし。
サービス?なんじゃらほい。
それはもう古い
>>693
> IWebBrowserとIWebBrowserAppがそれであり、前者はコントロール、
> 後者はアプリケーションである。
つまり、サービス=アプリケーション、ってこと?
695初心者:02/12/04 11:02
所望のサーバーとか所望のインターフェースってどうやって探してますか

今のところ↓とか使ってます
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で使うものだと思います。
699697:02/12/11 15:46
うんとですね。
オープン配列/オープン構造体を
カスタムマーシャリングしようとしてるんです。
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は未だに必要だし、理解しておくべき技術でもある。
こんな風に単純に思ってますがどうでしょうか?
>>703
OpenDocを使いましょう。
706703:02/12/17 22:34
>>704 同意.
コンポーネント作る簡便さは.NETに多くの点で軍パイがあがるのでしょうか?
COMでないとという必要があれば知りたいので…お願いします.
>>706
>COMでないとという必要
おれの知る限りじゃ、ない
708デフォルトの名無しさん:02/12/18 10:57
RogersenのCOMの参考書には、VBAからC++で書かれたDLL内の関数を呼び出せ
る、とありましたけど、どなたかいい参考書ご存知ありませんか?よろしくおながいし
ます。
>>708
超マルチうざい
710デフォルトの名無しさん:02/12/18 15:35
>>709
ごめんね。でも、情報を得るには仕方がない・・・・・
> でも、情報を得るには仕方がない・・・・・
ハァ?
>>710
氏ね。
>>710
何いってんの?
中学生?
それにしても、マルチポストとか目ざとくよく見つけるよな…。
>>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で見比べてみるとよくわかるよ。
716674:02/12/21 18:03
>>715
>厳密にはDllRegisterServer, DllUnregisterServerはCOM DLLにとって必須ではない。

御意
717デフォルトの名無しさん:02/12/21 22:44
>>715
>>710です。なんか、思い出しました。2年前にそんなことしてました。なつかしや〜。
結局、一番単純な古典的DLLを作って、VBAから呼ぶ路線にしたいと思います。
VBAからWin32APIを使うために必要は知識を網羅した(?)参考書も、他スレで教えてもらいました。
一番単純な古典的DLLで作ったほうが、Solarisなんかに計算エンジンを移すときに、楽そう。
それにしても、やっぱりみなさん詳しいですね。ぼくは、ホントアマチュアだから。
これからも時々お邪魔します。
(^ー^)ノ ヨロシク オネガイシマス
718bloom:02/12/21 22:51
719COM初心者:02/12/23 21:28
素朴な疑問なのですが、コンポーネントサービスでアプリケーションを
右クリックし、詳細設定タブを開くとデバッグという項目があってデバッ
ガ内で実行するというチェックボックスとデバッガパスという入力フィー
ルドがあります。これはどのように使うのでしょうか?これを使ってCOM+
のデバッグがもっと的確にできるようになるといいのですが。
720デフォルトの名無しさん:02/12/24 02:35
>>693
>Internet Explorerのイベントを処理する (検討中)
のところが知りたいんだけど
どっか参考資料ない?
721名無し@沢村:02/12/24 04:16
>>720
MFCのCHtmlViewのソース。
722720:02/12/24 15:22
>>721
見たけど使ってないぞ
723名無し@沢村:02/12/24 22:56
>>722
どこ見てるんだ。
BEGIN_EVENTSINK_MAPのあたりを見ればだいたい分かるだろ。
724名無し@沢村:02/12/24 23:24
>>722
おとなしく、ここでも見とけ。
ttp://www.nitoyon.com/vc/tips/ie_component.htm
725722:02/12/25 13:56
>>723,724
すいません。
comってcommand.com とかのcomということで委員ですか
激しく既出。
>>727
→同じ
 違う

?


?
730COM初心者:02/12/26 00:07
どなたか教えてください〜
Component Object Model
732デフォルトの名無しさん:03/01/07 22:50
あげ
733名無し@沢村:03/01/07 23:05
俺はCOMに真剣に取り組もうとしたことがあったが、レジストリに登録云々のことろで面倒くさくなってやめたね。
>>733
関数化すればいいやん
ただそれだけのことを何で?
あれ、沢村じゃん
いかん、容易に釣られてもた

鬱だ氏のう
736IP記録実験:03/01/08 21:34
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買って参入してくるから。老人はもともと少ないからなかなか自然減少しないし。
鯖のほうで制限しない限り。
>>326
ネタですよね?
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鯖
>>552
ご愁傷様。
つまらないね。

トリップだってさ
全然ボツ。
>>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化だ、過去ログが読める
がんばってください
773山崎渉:03/01/13 19:01
(^^)
4nd・・・天然ですか?>1
775山崎渉:03/01/15 18:14
(^^)
776デフォルトの名無しさん:03/01/19 12:47
浮上!!
777山崎渉:03/01/23 20:10
(^^)
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使う事もあるでしょ?

#...ま、必ず覚える必要があるって訳でも無いが。
まあいわゆるひとつの「必要になるまでほっとく」というやつですな
暇つぶしにはなるだろうけど、必要に駆られないと身にならんと思う
782778:03/01/26 22:05
みなさんありがとうございました.
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を行うのでしょうか?

すいません、ご教授願います。

http://msdn.microsoft.com/library/en-us/com/com_3rub.asp
HogeA(BSTR host);
呼び出し側が解放
HogeB(BSTR* hoge);
返送するなら、呼ばれた側が解放、確保。呼び出し側で解放
801800:03/02/11 00:29
HogeBはIDLに依存だった。
[out]BSTR* hoge
なら、呼ばれた側は解放せずに確保
[in,out]BSTR* hoge
なら、解放してから確保。
802799:03/02/11 01:43
>>800,>>801

レスありがとうございます。
大変参考になりました、これで安心して作成できます。

しかし皆さんMSDNの解説ソースをよく発見できますねぇ(失礼な言い方ですが変な意味じゃないです)
自分なんかは膨大な情報量ですぐにソースが発見できません。
やっぱり英語力とかでしょうか・・・・

ありがとうございました。


http://bdn.borland.com/article/0,1410,29779,00.html

The problem was, when Microsoft added support for IClassFactory2, they added the QueryInterface for IClassFactory2 after the existing code that queried for IClassFactory.

・・・
804デフォルトの名無しさん:03/02/22 16:51
COM+
macross+
age
807デフォルトの名無しさん:03/03/13 16:24

BC++5.5 でCOM関連のプログラミングってできますか?
最新の音楽情報満載。音楽ファン必見のサイト
音楽ギフト券の全プレあり
http://camellia16.fc2web.com/ongakudb.html
809 :03/03/15 10:20
保守&質問です。
Win32 API質問スレからこちらを紹介されました。

COM で QI して得たポインタが サスペンド/ハイバネーションを行なうと、無効になる
ことがあります。色々調べたら 6分通信がされなかったらポインタを無効にする仕様だ
そうですが、うまい回避策(workaround)を知っていたら教えて下さい。

ちなみに QI したポインタを全部覚えておいて、レジュームメッセージを受けとって、
Release() -> QI しても、先にポインタを使われることがあって、だめみたい。
(´・ω・`)
>>809
誘導されてきた場合、その旨伝えたほうが良いらしいよ

とりあえず
WM_POWERBROADCAST / PBT_APMSUSPEND
などでサスペンドを検知して対処するとか

811 :03/03/15 12:45
>>810
ああ、向うでもこっちでも伝えましたよ?

それから、メッセージで処理すると
> ちなみに QI したポインタを全部覚えておいて、レジュームメッセージを受けとって、
> Release() -> QI しても、先にポインタを使われることがあって、だめみたい。
と書いた通り。もちろん、サスペンドする直前に Release() しちゃっても、レジューム
する時に、レジュームハンドラの処理以前にポインタに触られると落ちます。

で、困ってます。

812デフォルトの名無しさん:03/03/15 16:12
RegisterServerやUnRegisterServerをインストーラ無しで自動化する
方法ってないですか?
インストーラだとサイズがでかくなるし、手動だと初心者は門前払いになって
しまうし、なによりめんどくさい思いをさせてしまう。
>>812
アウトプロセスサーバにして、起動するだけで登録するようにする。
削除は-uオプションにでもすればいいんじゃない。
>>812
inprocDLLをCPLにしてコントロールパネルでインストール/アンインストール可能にする
そのオブジェクトを使うexe側が、dllを探してきてRegisterServerする。
(何のためのCOMや、、、)
816813:03/03/15 22:18
>>813>>815
それは、毎回exeを起動するたびにRegisterServerするってことですか?
確かにそれは良さそうなんだけど、なんか不安感が拭えないですね。
重くなりそうだし、レジストリ毎回書き換えることになりませんかね?
でも、やっぱり、それしか方法は無いのかな・・・
817812:03/03/15 22:19
816の名前は813ではなく、812です。すいません。
本当に切られちゃったという洒落にならない話
>>816
レジストリに書き込むタイミングぐらい、自分の好きなようにすればええやん。
>>813,816
んなこと無いよ。事実MFCのEXE系COMサーバは、そうやってるし。(逆に、/regserver
は自力でやらにゃならんかった。VC4の頃の話だけどな)
821デフォルトの名無しさん:03/03/16 13:40
レジストリに登録した後、DLLを別のフォルダにコピーしたら、
また登録が必要ですか?
レジストリにはコンポーネントのパスが記録されているから
コピーしても元のファイルを参照しに行くだけで問題はないです。
もちろんコピー先のファイルは何も意味はもちませんが。
移動したのであれば再登録が必要です。
>>822
なるほど。
では、パスを変えて再登録した場合、二重に登録されますか?
それとも、上書きされてしまうのですか?
>>823
自分で試してみろよ
825 :03/03/16 14:27
>>823
GUID が同じものが別々登録されたとすると COM の概念から言ってどうなると思いますか?
と答えておきます。
>>824
なるほど。やってみたら、上書きされるみたいですね。
>>825
上書きされないとバイナリが一つに絞れないということでしょうか。

ありがとうございました。
827nanasi:03/03/16 19:55
    / ̄ ̄ ̄ ̄ ̄ ̄
     | フサでーす
     \ ______
      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の中でメッセージハンドラが受けてて見やすい。
838836:03/03/28 11:58
>>837
CBuilderでつか?
すんません、もってないんですよ・・・・・・
VisualStudio.Netしか・・・・。
しかも、IdispachされてないCOMなので、オートメーションは
つかえないんでつ・・・・
>>838
COMを作る側と使う側とわけわかになる、まさにCOMの弊害。
BCBにしてCOMを捨てるべき
840836:03/03/28 16:30
ふむふむありがとうございます。
しかし、VCLって情報が少ない??ですね。
どんなクラスがあるのか知りたくても、ほとんど情報がない。
英語ならあるのかな・・・・
自分が欲しい機能がないのに試しに購入するのも
バカらしいので、調べてみまつ。
ま、平行して.netで開発を続けるわけですが・・・・
>>840
.NETよりはコンポーネント多いよ。
ソース付のフリーのコンポが無限にある。
>>836
ATLがやってることを解析しる!
ちなみにATLだとこんなのあり
ttp://www.s34.co.jp/cpptechdoc/misc/comevent/
>>839
うざい
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)
の文字列を調べるにはどうすればよいのでしょうか?
856IUnknown:03/04/01 23:33
>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
860山崎渉:03/04/17 15:46
(^^)
861デフォルトの名無しさん:03/04/18 04:02

Essential COM を読み始めたんですが、
Visual C++でコンパイルしたDLLが、他のコンパイラで
利用できないってのはホントなんですか?

DLLって使ったこと無いから、よく分からないんですが。
それはたしか、「C++クラスをエクスポートしたDLLは、
ほかのコンパイラでは利用できない」、って話だろ。
そのとおり。
863山崎渉:03/04/20 03:10
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
864山崎渉:03/04/20 03:45
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
865まりも:03/04/26 12:28
はじめましてこんにちわ、いま、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コントロールって貼り付けられますか?
一体どうやればいいのでしょうか。
貼り付けたらダイアログが出てこなくなってしまうんです。
868867:03/05/27 17:23
まじでわかんないですけど。誰か助けてください。
ちなみにMFCです。
カスタムコントロールやActiveXを貼り付けるとダイアログが消失します。
869デフォルトの名無しさん:03/05/27 17:32
あ、あと、参考にしたページはここです。
ttp://www.tomosan.org/dev/vs/activex.html
コレで作ったダイアログにActiveXコントロールを貼ると
ダイアログが消えてしまいます。
870山崎渉:03/05/28 12:38
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
871867:03/05/30 13:59
はぁ、やっぱり誰も回答してくれない。
もうActiveXなんて廃れてるよな。
COMなんて今さら勉強したくないのに。
会社辞めてやる!
廃れてるけど情報源はちゃんとあると思うよ。
それを探せないなら辞めたほうがいいんじゃないかな。
COMアゲ
874デフォルトの名無しさん:03/05/31 04:41
http://www.yomiuri.co.jp/entertainment/tv/tv03051401.htm
“電波少年的”異色FM番組 3局共同制作「OLEっち」
875 :03/05/31 11:55
未だに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からプロパティとして見えることが重要かどうかによる
878若葉:03/06/05 17:35
インターネットエクスプローラーにオリジナルのツールバーを作りたいのですが、
何を勉強したら良いでしょうか。または参考になるサイト、お勧めの書籍などございましたら、
教えてください。
879乙葉:03/06/05 17:39
880若葉:03/06/05 20:31
>>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
タイプラブラリを見るとDispatchインタフェース(dispinterface)のみ備わっている
MFCで作成されたCOMサーバに

「シンクインタフェースを実装し、COMサーバとコネクションを確立することで、
 サーバ側で発生した各種イベントを取得することができます。」

という機能がある場合、COMクライアント側のシンクインタフェースの実装(MFC)は

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q181/8/45.asp&NoWebContent=1

だけを行えば良いのでしょうか?

試しにこの例を参照して実装し、 AfxConnectionAdvise() も正常に完了したので、もうイベントは
取得可能(この例だと CCmdTarget 派生クラスにあるイベントハンドラ関数が呼び出される)のかと
思いきや、取得できていないようです。

> Establish a connection between source and sink.

とはあっても、実際にはまだ必要な手続きが足りないのでしょうか・・・。
891デフォルトの名無しさん:03/07/27 09:11
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★☆                       
☆★ 送料激安!!  送料激安!!  送料激安!!
★☆      http://www.get-dvd.com      
☆★  激安アダルトDVDショップ        
★☆    お買い得セール1枚500円〜980円!急げ!
☆★    インターネット初!「きたぐに割引」  
★☆    北海道・東北の皆様は送料も激安!   
☆★      http://www.get-dvd.com      
★☆        スピード発送!        
☆★      http://www.get-dvd.com      
★☆        商品が豊富!         
☆★      http://www.get-dvd.com      
★☆                       
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
>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でしか戻ってきません。

なにか足りない点がありましたらご教示ください。
(具体的なコードが必要でしたらその都度晒します)
895山崎 渉:03/08/02 02:12
(^^)
896tim:03/08/12 08:53
VB6でEXCELのCOMアドイン登録方法について教えてください。
システムアドインとして登録(HKEY_LOCAL_MACHINE に書き込み)せずに、
システム上の全てのユーザーで使用できるようにしたいのですが、
誰かご存知の方いらっしゃいますでしょうか?
http://support.microsoft.com/default.aspx?scid=kb;ja;290868
MSサポート↑では、HKEY_USERS\.DEFAULT・・・・に書き込むことで可能だと書いてあるのですが、
うまくいきません。
実装したいことは、「COMアドイン」ダイアログで、ユーザーが必要に応じて
アドインを有効にしたり無効にしたり出来るようにしたいのですが・・・・。
よろしくお願いします。
897山崎 渉:03/08/15 15:41
    (⌒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がないだけでも便利さを感じられるだろう。
>>910
thx
>>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つの言葉にまるめるの好きだよね、たぶん社内用と社外用を使い分けてるね
>>922
とりあえず首吊って市ね
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の世界を斬っても何の価値もないぞ!!ザコよ!!
>>929
沢ちゃんだ〜♪
931デフォルトの名無しさん:04/02/23 10:10
DrCOM MonitorのラインでCOMのどのメソッドにアクセスしてる、どのイベントが返ってきてる
とかいうレベルまでわかるツールない?ないだろうな。
Spy+は問題外。TracePlusもDrCOMには勝てないという結論。
932928:04/02/23 21:41
>>928
自己解決したかも?
でも、ビミョーに違うんだけどなあ。

http://support.microsoft.com/default.aspx?scid=kb;en-us;287087
933デフォルトの名無しさん:04/03/07 22:53
COMの関数のアドレスはどうやったら取得できるのですか?
APIフックと同じように、COMの関数呼び出しにフックかけたいのですが、
関数のアドレスがわからないとどうしようもないので…。
>>933
QueryInterface
935デフォルトの名無しさん:04/03/08 00:19
インターフェイスへのポインタを取得したいわけじゃないんです。
別の言い方すると、インターフェイスを介して関数を呼び出したいわけではなくて、
関数の呼び出しを監視するために関数のアドレスそのものが欲しいのです。
舌足らずで申し訳ないっす。
APIの場合は関数のアドレスはインポートセクションのアドレステーブルにあるので
フックは簡単だったのですけど…。
>>935
vtable
>APIの場合は関数のアドレスはインポートセクションのアドレステーブルにあるので

単純にGetProcAddrしたらいい話じゃなくて?
もっと静的な話?オフセットを定数で持ちたいとか。
>>937
COMにどうやってGetProcAddresを使うんだ?
>>938
脊髄反射カコワルイ
>>939
はぁ?
そもそもGetProcAddresはDLLにしか使えないじゃん。
>>937
APIが呼ばれる前に自分の関数を呼び出してもらうために(つまりAPIフック)
インポートセクションのAPI関数のアドレステーブルを自分の関数の
アドレスで上書きするんです。ほんと、舌足らずで申し訳ないですw

>>936
vtable書き換えればいいような気がするんですが、
インターフェイスを介してvtableにアクセスできるのですか?
そしてvtableの仕組みってどうなってるんでしょ。どうやって関数名の参照の
解決してるのかご存知ですか?
>>942
デバッガでもつくる気かよw
>>942
あのさ、あおりでも攻撃でもないんだけど、vtable の仕組みがわかんない人に
COM のインタフェイスのフックの仕方なんて説明できると思う?
このスレで C++ の基礎について説明求めるのって非常識だし非効率っぽくない?

C++ 勉強してから、Universal (Anonymous) Delegator とか調べてみるといいよ。
>>944
つかの間の優越感ですね。
>>942
アクリゲージョンを使って継承っぽいことをすればよい。
COMのvtableとC++のvtableが同じだと思ってるやつがいるな
いくらC++のお勉強したところで、COMのvtableには辿り着かないよ
>>947
C++ の勉強をしないでもたどり着けるとでも言いたげな書き込みに見える・・・

とにかく 942 のやりたいことなら APIhook + universal delegator で簡単にできる。
(別に universal じゃなくてもいいけど)。漏れはキミより頭いいよ、ってだけでなんらの
情報の無いカキコは・・・2ch の花なのでいいのか orz
それしかストレス解消の手段が無いんだよ。見逃してよ。
950942:04/03/11 22:49
Delegatorすごい役に立ちそうです。どうもありがとうございました。
>>948
>>942ではないですがメモらせて頂きました。
952デフォルトの名無しさん:04/03/31 22:15
モニカがよく分かりません。参考になる本やサイトはありますか?
>>952
そんな名前の恋人もいました。
↑ユリアソ発見。
955デフォルトの名無しさん:04/04/04 15:47
age
あげとこう。
957デフォルトの名無しさん:04/05/30 01:44
純粋に C だけで COM コンポーネントを書いてみた。
楽しかった。

チンコ
958デフォルトの名無しさん:04/06/13 13:06
DllRegisterServer で登録する具体的なレジストリの値がわからないんですけど
どこかに書いてありましたっけ?
>>958 どういう COM サーバかによると思うけど。
インプロセスサーバかどうか、とか。
COMにはやられた...
http://pc5.2ch.net/test/read.cgi/tech/1044457085/
こっちのスレもよろしく。
961958:04/06/13 15:28
>>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 {~ ならわかるけど。
980977:04/06/29 16:16
>>979
前置きのソースが半ページくらい割いて載ってるんですけども、
写し間違いとかやらかすとまた大変なんで写すのはやめました。
そっちを見てもやっぱり多重継承には見えないんすよね。
errataも見たけど出てないんでここはこういうもんだと思ってスルーします。
>>980
単にミスプリじゃない?
p68の中ほどに「実装では可能」と
  class CatDog : public ICat, public iDog {
なんていう例が出てるから
  interface ICatDog : ICat, IDog { // 基底を複数持つのは違反
としたかったのではないかと想像してみる。
>>981
その本知らないけど、「基底を複数持つのは違反(なので単一継承にする)」という
意味なのでは?
>>981
IDLとC++がごっちゃになってませんか?まったく別の言語ですよ。
984981:04/06/30 19:31
>>983
ごっちゃになんてなってない。
持ってるんだったらEssential COMの68ページを見てくれ。
それで >>981 に書いた意味がわかると思う。
>>984
っていうか、このスレを少し遡って読むだけでも状況は分かるよね。
COMってかならずレジストリに登録しなきゃいけないの?
WindowScriptComponentみたいに、同じフォルダにあるだけでいきなり
使えるようになるには、どうしたらいいのかしらん。