IDispatchについて

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ゲスト

IDispatchについて

#1 投稿記事 by ゲスト »

COMを使うため
メゾットを呼び出そうとしているのですが、ディスパッチIDが取得できず・・・
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

CLSIDFromProgIdは,IDispatch.GetIDsOfNames同様OLECHAR文字列を要求します。そのためMultiByteToWideCharで変換してやらないといけません。ただ,それは面倒なので,CLSIDを宣言することをお勧めします。

コード: 全て選択

TypeDef CLSID = GUID
Dim CLSID_InternetExplorer = [&H0002DF01, &h0000, &h0000, [&hC0, &h00, &h00, &h00, &h00, &h00, &h00, &h46]] As CLSID
ゲスト

#3 投稿記事 by ゲスト »

> CLSIDFromProgIdは,IDispatch.GetIDsOfNames同様OLECHAR文字列を要求します。そのためMultiByteToWideCharで変換してやらないといけません。ただ,それは面倒なので,CLSIDを宣言することをお勧めします。

CLSIDはちゃっと取得出来ています
問題はIDispatch.GetIDsOfNamesの方で
MultiByteToWideCharで変換しているのですが、失敗するので
何故なのかなと思いまして…
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

> CLSIDはちゃっと取得出来ています
そうですか,自分のところではAPI関数のCLSIDFromProgIDを使ってダメだったもので。

では,IDispatch.GetIDsOfNamesの2番目の引数が気になります。これは文字列へのポインタの配列を渡すところです。どう宣言しているかによりますが,VarPtr(wszName)とするとどうでしょうか?

また,ABからブラウザを操作したければIDispatchだけでなく,IWebBrowser2も使えます。DISPIDを取得して呼び出すという手順が不要な分,場合によってはこちらのほうが単純にできるかもしれません。
ゲスト

#5 投稿記事 by ゲスト »

> > CLSIDはちゃっと取得出来ています
> そうですか,自分のところではAPI関数のCLSIDFromProgIDを使ってダメだったもので。

_CLSIDFromProgIDは自作関数でして、変換などの処理を入れてます
大変すみません

> では,IDispatch.GetIDsOfNamesの2番目の引数が気になります。これは文字列へのポインタの配列を渡すところです。どう宣言しているかによりますが,VarPtr(wszName)とするとどうでしょうか?

VarPtrを使用しましたが結果は同じでした、
宣言はVirtual Function GetIDsOfNames(ByRef riid As GUID,rgszNames As *Byte,cNames As DWord,lcid As DWord,ByRef rgDispId As Long) As LRESULT
ちなみに、エラーメッセージはDISP_E_UNKNOWNNAMEです

> また,ABからブラウザを操作したければIDispatchだけでなく,IWebBrowser2も使えます。DISPIDを取得して呼び出すという手順が不要な分,場合によってはこちらのほうが単純にできるかもしれません。

そちらの方やってみたいと思います
お手数お掛けして申し訳ありませんでした
ゲスト

#6 投稿記事 by ゲスト »

SysFreeString
SysAllocStringByteLen
を使用してメモリを確保した所、上手く行きました
返信する