COM の世界を斬る!

このエントリーをはてなブックマークに追加
>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みたいに、同じフォルダにあるだけでいきなり
使えるようになるには、どうしたらいいのかしらん。