COMインターフェースを構造体から呼び出す

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: COMインターフェースを構造体から呼び出す

by ノッチ » 2006年5月31日(水) 17:16

貴重な意見、ありがとうございます。
これから仕事で外に出るのですぐには試せないのですが、時間のある時に四苦八苦してみます。

> 話を簡単にするため、IUnknownを扱うことにします。
> また、これを応用してます。
> http://www.activebasic.com/forum/viewto ... =1076#4806
>
> COMのメソッド(というよりクラスのメンバ関数全般)はThisに相当する引数を隠し持っています。
> それを渡すようにすればうまくいくはずです。
> > > punk->vtable->Release(ByVal punk)
> これが大事です。ByRef引数だったものを流用しているのでByValを指定していますが,
> 初めからメソッドの宣言をByValにするほうが楽でしょう。
>
> しかしこれではインターフェイスへのポインタであるpunkを2度も書かなければならない上,ポインタからさらにポインタを辿っていくので式も一見複雑そうに見えてしまいます。
> そこで,このように関数化しておくと楽かもしれません。
> > クラスの無いCではこんなことをするマクロがあったのでそれを参考にしました。
>
> ショートカットを作りたいだけなら,(クラスを使っていますが)ここに私の例があります。
> あれこれ書いていますが,CreateShortcut関数はCOMの概念を隠すように作ってあります。
> それが使い物にならないとしても,その中身は少しは参考になるかと思います。
> http://www.activebasic.com/forum/viewtopic.php?t=774

by イグトランス » 2006年5月31日(水) 17:03

話を簡単にするため、IUnknownを扱うことにします。
また、これを応用してます。
http://www.activebasic.com/forum/viewto ... =1076#4806

COMのメソッド(というよりクラスのメンバ関数全般)はThisに相当する引数を隠し持っています。
それを渡すようにすればうまくいくはずです。 > punk->vtable->Release(ByVal punk)
これが大事です。ByRef引数だったものを流用しているのでByValを指定していますが,
初めからメソッドの宣言をByValにするほうが楽でしょう。

しかしこれではインターフェイスへのポインタであるpunkを2度も書かなければならない上,ポインタからさらにポインタを辿っていくので式も一見複雑そうに見えてしまいます。
そこで,このように関数化しておくと楽かもしれません。 クラスの無いCではこんなことをするマクロがあったのでそれを参考にしました。

ショートカットを作りたいだけなら,(クラスを使っていますが)ここに私の例があります。
あれこれ書いていますが,CreateShortcut関数はCOMの概念を隠すように作ってあります。
それが使い物にならないとしても,その中身は少しは参考になるかと思います。
http://www.activebasic.com/forum/viewtopic.php?t=774

Re: COMインターフェースを構造体から呼び出す

by ノッチ » 2006年5月31日(水) 15:57

少し先に進んだんで自己レスです。
CoCreateInstanceで取得したアドレスは、関数構造体(っていうのかな?)への
ポインタへのポインタらしく構造体を参照する構造体を宣言することで対応しました。
ですが、QueryInterfaceやReleaseがうまく動いてくれないです。
関数アドレスの取得はうまくいっているように見えるのですが。。。
最終的にはショートカットを作成しようとしているのですが、どうすればよいでしょうか?

COMインターフェースを構造体から呼び出す

by ノッチ » 2006年5月31日(水) 13:28

COMインターフェースの呼び出しを行うのに通常はクラスを使用して呼び出しますが、
クラスの代わりに構造体を使用して呼び出すことは可能でしょうか?
試しでIShellLinkのインターフェースを取得してみたつもりなんですけど、
DebugしてもShellLinkの後半のアドレスが取得できてないようで・・・。
どこか根本的に間違っていますでしょうか?
クラスを使えばすぐ済むかもしれませんが、クラスがなんとなく嫌いなもので。

ページトップ