ページ 11

IDispatchについて

Posted: 2007年5月27日(日) 00:41
by ゲスト
COMを使うため
メゾットを呼び出そうとしているのですが、ディスパッチIDが取得できず・・・

Posted: 2007年5月27日(日) 10:27
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

Posted: 2007年5月27日(日) 15:16
by ゲスト
> CLSIDFromProgIdは,IDispatch.GetIDsOfNames同様OLECHAR文字列を要求します。そのためMultiByteToWideCharで変換してやらないといけません。ただ,それは面倒なので,CLSIDを宣言することをお勧めします。

CLSIDはちゃっと取得出来ています
問題はIDispatch.GetIDsOfNamesの方で
MultiByteToWideCharで変換しているのですが、失敗するので
何故なのかなと思いまして…

Posted: 2007年5月27日(日) 18:05
by イグトランス
> CLSIDはちゃっと取得出来ています
そうですか,自分のところではAPI関数のCLSIDFromProgIDを使ってダメだったもので。

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

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

Posted: 2007年5月27日(日) 21:01
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を取得して呼び出すという手順が不要な分,場合によってはこちらのほうが単純にできるかもしれません。

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

Posted: 2007年5月29日(火) 10:53
by ゲスト
SysFreeString
SysAllocStringByteLen
を使用してメモリを確保した所、上手く行きました