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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ノッチ
記事: 82
登録日時: 2005年6月01日(水) 23:27
お住まい: 北海道札幌市

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

#1 投稿記事 by ノッチ »

COMインターフェースの呼び出しを行うのに通常はクラスを使用して呼び出しますが、
クラスの代わりに構造体を使用して呼び出すことは可能でしょうか?
試しでIShellLinkのインターフェースを取得してみたつもりなんですけど、
DebugしてもShellLinkの後半のアドレスが取得できてないようで・・・。
どこか根本的に間違っていますでしょうか?
クラスを使えばすぐ済むかもしれませんが、クラスがなんとなく嫌いなもので。
ノッチ
記事: 82
登録日時: 2005年6月01日(水) 23:27
お住まい: 北海道札幌市

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

#2 投稿記事 by ノッチ »

少し先に進んだんで自己レスです。
CoCreateInstanceで取得したアドレスは、関数構造体(っていうのかな?)への
ポインタへのポインタらしく構造体を参照する構造体を宣言することで対応しました。
ですが、QueryInterfaceやReleaseがうまく動いてくれないです。
関数アドレスの取得はうまくいっているように見えるのですが。。。
最終的にはショートカットを作成しようとしているのですが、どうすればよいでしょうか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#3 投稿記事 by イグトランス »

話を簡単にするため、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
ノッチ
記事: 82
登録日時: 2005年6月01日(水) 23:27
お住まい: 北海道札幌市

#4 投稿記事 by ノッチ »

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

> 話を簡単にするため、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
返信する