C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: _com_dispatch_methodの使い方


(過去ログ 92 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■54842 / inTopicNo.1)  _com_dispatch_methodの使い方
  
□投稿者/ 雲 (29回)-(2010/11/06(Sat) 10:56:09)

分類:[C/C++] 

最近、何となく、COM の使い方を調べていたのですが、一つわからないことがあります。

良く、VBS で使う FileSystemObject を C++ から使ってみよう。としたのですが、以下のところがどうしてもわかりません。


_COM_SMARTPTR_TYPEDEF( IDispatch, __uuidof(IDispatch) );

IDispatchPtr fileSystsemObject;
fileSystsemObject.CreateInstance( L"Scripting.FileSystemObject" );


DISPID id;
_bstr_t str(L"FileExists");
fileSystsemObject->GetIDsOfNames( IID_NULL, &str.GetBSTR(), 1, LOCALE_USER_DEFAULT, &id );

// これは OK
_variant_t argc(L"d:\\abc.tif");
DISPPARAMS arg = { 0 };
arg.cArgs = 1;
arg.rgvarg = &argc;
fileSystsemObject->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &arg, &aaa, nullptr, nullptr );

// これは、NG
BOOL b;
_com_dispatch_method( fileSystsemObject, id, DISPATCH_METHOD, VT_BOOL, &b, L"d:\\abc.tif" );

何かを誤解しているとは思うのですが。。。

参考:
http://support.microsoft.com/kb/178845/ja
引用返信 編集キー/
■54853 / inTopicNo.2)  Re[1]: _com_dispatch_methodの使い方
□投稿者/ 雲 (31回)-(2010/11/06(Sat) 23:36:23)
自己解決しました。

間違っていたところは、_com_dispatch_method の6番目の引数に、 L"\x0008" を与えていないことでした。
でも、ここに、この値を入れると言うことはどこにも明示的に書かれている資料は見つからず、この値を(即値で)
入れることで、何となく動いたので良い。と思う羽目になっています。ちなみに、即値にしないのであれば、

http://msdn.microsoft.com/ja-jp/library/04y6h44d(VS.80).aspx

このあたりを見ればいいのでしょうが、残念ながら(VTS_BSTRとかは)MFC の定義みたいです。

【解決版】
IDispatchPtr fileSystsemObject;

fileSystsemObject.CreateInstance( L"Scripting.FileSystemObject" );

HRESULT result;
DISPID id;
VARIANT_BOOL ret = VARIANT_FALSE;
wchar_t *name[] = { L"FileExists" };
_bstr_t path(L"d:\\abc.tif");

result = fileSystsemObject->GetIDsOfNames( IID_NULL, name, _countof(name), LOCALE_USER_DEFAULT, &id );
if( FAILED(result) ){
// ERROR
}

result = ::_com_dispatch_method( fileSystsemObject, id, DISPATCH_METHOD, VT_BOOL, &ret, L"\x0008", path.GetBSTR() );
if( FAILED(result) ){
// ERROR
}

if( ret == VARIANT_TRUE ){
int d = 100;
}

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -