| 
 | 
 
 
 
 
 |  | 
2008/2/29(Fri) 11:00:41|NO.13826 
COMについて質問です。
 mcallで呼び出す際、引数を使用しているのですが
 その引数に値が戻ってくるようなCOMの場合、
 値が設定されていないようですが、
 引数が戻り値の場合どうすれば良いのでしょうか?
 
 ご教示願います。
 
 | 
 
 
 
 |  | 
2008/3/1(Sat) 04:29:53|NO.13842 
comresで指定した変数にも値が設定されていませんか?
 どのオブジェクトのどのメソッド(プロパティ)を使いたいのかがわかれば、
 使い方を知っている人もいるのでは?
 
 | 
 
 
 |  | 
2008/3/3(Mon) 11:51:11|NO.13876 
質問の仕方がまずかったですね。すみません。オブジェクトは
 newcom ECLC, "PCOMM.autECLConnMgr"
 newcom ECLS, "PCOMM.autECLSession"
 
 ECLPS = ECLS("autECLPS")
 
 です。
 
 メソッドは
 
 //==================================================================================================
 // サブモジュール名:SearchText
 //  書式      :searchtext@pcomm p1, p2, p3, p4
 // 処理説明    :文字列p1が画面内に存在するかチェック
 // 入力引数    :p1=検索値, p2=検索方向, p3=検索初期位置(row), p4=検索初期位置(col)
 // 戻り値     :(1:存在), (0:無し)
 //==================================================================================================
 #defcfunc searchtext@pcomm str p1, int p2, int p3, int p4
 /* <初期処理> */
 /* <メイン処理> */
 mcall ECLPS, "SearchText", p1, p2, p3, p4
 comres rtn
 
 return rtn
 
 
 ※ メソッドの機能
 画面上にある文字列(複数行、複数列)から、引数「p1」で渡した文字列を探し
 存在すれば"1"を戻り値で戻す。
 また、存在した場合は「p3」と「p4」にその位置を戻す。
 
 です。
 
 comresでメソッドの戻り値は戻ってくるのですが。
 引数で渡している、「p3」、「p4」にも
 値が戻ってくるはずなんですが(VBScriptでは戻ってくる)戻ってこないのですが、
 どうすれば値の取得ができるのでしょうか?
 
 再度、ご教示願います。
 
 | 
 
 
 |  | 
2008/3/3(Mon) 15:19:34|NO.13877 
int → var
 | 
 
 
 |  | 
2008/3/3(Mon) 17:30:03|NO.13878 
>int → var自分もそれが関係するかなと思って下記のようにしてみたんですが、
 変わりませんでした。
 
 Row = p3
 Col = p4
 dialog "Row : " + Row + " Col : " + Col
 mcall ECLPS, "SearchText", p1, p2, Row, Col
 comres rtn
 
 dialog "Row : " + Row + " Col : " + Col
 
 | 
 
 
 |  | 
2008/3/3(Mon) 19:18:00|NO.13886 
動作確認のできる環境がないので違うかも知れませんが、以下のような感じではないですか? #defcfunc searchtext@pcomm str p1, int p2, var p3, var p4
	_p1 = p1
	comres rtn
	mcall ECLPS, "SearchText", varptr(_p1), p2, varptr(p3), varptr(p4)
	return rtn
 | 
 
 
 |  | 
2008/3/3(Mon) 20:03:36|NO.13888 
同じく、動作確認のできる環境がないので違うかも知れませんが 
variant型だとどうでしょうか
 dimtype v1, vartype("variant")
dimtype v2, vartype("variant")
v1("") = row
v2("") = col
comres rtn
ECLPS->"SearchText" p1, p2, v1, v2
row = v1("")
col = v2("")
 
あとは、ScriptControlでVBScript使うとかw 
普段VBScript使わないので、コードが間違ってないか心配だけど…
 p1 = "hoge"
p2 = 0
newcom SC, "ScriptControl"
if( varuse(SC) == 0 ) {  dialog "ScriptControl の初期化に失敗"   :  stop  }
SC("Language") = "VBScript"
SC->"ExecuteStatement" {"
	Function SearchText( eclps, s, i, dic )
		Dim row, col
		row = dic.Item(\"row\")
		col = dic.Item(\"col\")
		SearchText = eclps.SearchText( s, i, row, col )
		dic.Item(\"row\") = row
		dic.Item(\"col\") = col
	End Function
"}
newcom DIC, "Scripting.Dictionary"
if( varuse(DIC) == 0 ) {  dialog "Scripting.Dictionary の初期化に失敗"   :  stop  }
DIC->"Add" "row", row
DIC->"Add" "col", col
comres rtn
SC->"Run" "SearchText", ECLPS, p1, p2, DIC
row = DIC("Item", "row")
col = DIC("Item", "col")
delcom DIC
delcom SC
 | 
 
 
 |  | 
2008/3/3(Mon) 23:16:16|NO.13894 
あ、わざわざScripting.Dictionary経由する必要ないんだった。orz 
たぶん、こうかな?
 p1 = "hoge"
p2 = 0
newcom SC, "ScriptControl"
if( varuse(SC) == 0 ) {  dialog "ScriptControl の初期化に失敗"   :  stop  }
SC("Language") = "VBScript"
SC->"ExecuteStatement" {"
	Dim row, col
	Function SearchText( eclps, s, i, _row, _col )
		row = _row
		col = _col
		SearchText = eclps.SearchText( s, i, row, col )
	End Function
"}
rtn = SC("Run", "SearchText", ECLPS, p1, p2, row, col)
row = SC("Eval", "row")
col = SC("Eval", "col")
delcom SC
 | 
 
 
 |  | 
2008/3/5(Wed) 11:53:51|NO.13922 
色々とアドバイスありがとうございます。 
全て試してみたのですが、どうしても取得できませんでした。 
aさんのアドバイスの2つ目は、自分の技量が足りないのか、 
戻り値も帰って来ないみたいでした。
 
rootさんのアドバイス
 #defcfunc searchtext@pcomm str p1, int p2, var p3, var p4
	_p1 = p1
	dialog "Row : " + p3 + " Col : " + p4
	comres rtn
	mcall ECLPS, "SearchText", varptr(_p1), p2, varptr(p3), varptr(p4)
	dialog "Row : " + p3 + " Col : " + p4
	return rtn
 
aさんのアドバイス1
 #defcfunc searchtext@pcomm str p1, int p2, var p3, var p4
dimtype v1, vartype("variant")
dimtype v2, vartype("variant")
	dialog "Row : " + p3 + " Col : " + p4
v1("") = p3
v2("") = p4
comres rtn
ECLPS->"SearchText" p1, p2, v1, v2
p3 = v1("")
p4 = v2("")
	dialog "Row : " + p3 + " Col : " + p4
	return rtn
 
aさんのアドバイス2
 #defcfunc searchtext@pcomm str p1, int p2, var p3, var p4
	row = p3
	col = p4
newcom SC, "ScriptControl"
if( varuse(SC) == 0 ) {  dialog "ScriptControl の初期化に失敗"   :  stop  }
SC("Language") = "VBScript"
SC->"ExecuteStatement" {"
	Dim row, col
	Function SearchText(eclps, s, i, _row, _col)
		row = _row
		col = _col
		sText = eclps.SearchText(s, i, row, col )
	End Function
"}
comres rtn
SC->"Run"  "SearchText", ECLPS, p1, p2, row, col 
	dialog "Rtn : " + rtn
comres row
SC->"Eval" "row"
comres col
SC->"Eval" "col"
delcom SC
	dialog "Row : " + row + " Col : " + col
	
	return rtn
|  
 |  | 
 
 
 |  | 
2008/3/5(Wed) 19:52:38|NO.13935 
それ、戻り値を設定する処理が抜けてますよ。SearchText = sText
 を付け足してみてください。
 
 それでも、動かないなら
 SC->"Run" の直後で、statの値を確認。
 statがゼロでないならエラー終了したという事です。
 スクリプトが間違ってないか再確認!
 
 それでも動かないなら、正常に動作しているVBScriptのソースを見せてください。
 正しい使い方が判らないままでは、答えようがないので…。
 
 | 
 
 
 |  | 
2008/3/5(Wed) 23:11:26|NO.13940 
ああ、私のレス、間違えてました。これでどうでしょう? #defcfunc searchtext@pcomm str p1, int p2, var p3, var p4
	comres rtn
	mcall ECLPS, "SearchText", p1, p2, varptr(p3), varptr(p4)
	return rtn
 
興味があったのでWeb上のドキュメントを探してみたのですが、IBM本家にもオートメーションに 
関してはVBSのリファレンスしかない様子... 
OLE Object Viewerの使える環境でしたら、PCOMMの実装がどうなっているか調べていただけないでしょうか? 
このSearchTextメソッドにどんな引数を渡せば良いか分かると解決が早そうです ;)
 | 
 
 
 |  | 
2008/3/6(Thu) 04:55:38|NO.13961 
IDispatch::Invokeを使ってみてください。 
(↓のmcall2命令)
 //==============================================================
#define global VT_EMPTY	0
#define global VT_I4	3
#define global VT_BSTR	8
#define global VT_DISPATCH 9
#define global VT_BYREF	0x4000
#module "MDispParams" dispParams, vArgs
#uselib "oleaut32.dll"
#func VariantInit "VariantInit" int
#func VariantClear "VariantClear" int
// モジュール初期化時に引数の数を指定
#modinit int cArgs
	dim dispParams, 4
	dim vArgs, cArgs*4
	dispParams(2) = cArgs
	dispParams(0) = varptr(vArgs)	
	return
#modfunc disp_setarg int index, int vt, int val
	if dispParams(2) <= 0 : return 0
	i = dispParams(2)*4-((index+1)*4)
	VariantInit varptr(vArgs(i))
	vArgs(i) = vt
	vArgs(i+2) = val
	return 1
// DISPPARAMS構造体のポインタ取得
#modfunc disp_getptr var v
	v = varptr(dispParams)
	return
#modterm
	repeat dispParams(2)
		VariantClear varptr(vArgs(cnt*4))
	loop
	return
#global
#module
#define IID_IDispatch              "{00020400-0000-0000-C000-000000000046}"
#usecom IDispatch IID_IDispatch
#comfunc IDispatch_GetIDsOfNames 5 int, int, int, int, int
#comfunc IDispatch_Invoke 6 int, int, int, int, int, int, int, int
#define LOCALE_SYSTEM_DEFAULT	0x800
#define DISPATCH_METHOD			0x1
#define DISP_E_TYPEMISMATCH		0x80020005
#deffunc mcall2 var obj, str name, int argc, array argv, array vartypes, var result
// obj COMオブジェクト
// name メソッド名
// argc 引数の数
// argv 引数を格納した配列
// vartypes VARTYPE配列
// result 戻り値を受け取る変数
// stat エラー時は0 成功時は1
	dim iid_null, 4
	dimtype vResult, vartype("variant")
	dimtype v, vartype("variant")
	dim excepInfo, 8
	v("vt") = VT_BSTR
	v("val") = name
	bstr = v("bstrptr")
	IDispatch_GetIDsOfNames obj, varptr(iid_null), varptr(bstr), 1, LOCALE_SYSTEM_DEFAULT, varptr(dispId)
	if stat : return 0
	newmod dp, MDispParams, argc
	repeat argc
		disp_setarg dp, cnt, vartypes(cnt), argv(cnt)
	loop
	disp_getptr dp, pDispParams
	ret = 1
	IDispatch_Invoke obj, dispId, varptr(iid_null), LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, pDispParams, varptr(vResult), varptr(excepInfo), varptr(argErr)
	if stat {
		ret = 0
		switch stat
			case DISP_E_TYPEMISMATCH
				dialog ""+(argc-argErr)+"番目の引数の型が違います。\nmethod="+name
				swbreak
			default
				dialog "error "+strf("%X", stat)
				swbreak
		swend
	}
	delmod dp
	if vResult("vt") != VT_EMPTY : result = vResult("val")
	return ret
#global
//==============================================================
#defcfunc searchtext@pcomm str p1, int p2, var p3, var p4
	dimtype v, vartype("variant")
	v("vt") = VT_BSTR
	v("val") = p1
	prm = v("bstrptr"), p2, varptr(p3), varptr(p4)
	vt = VT_BSTR, VT_I4, VT_I4|VT_BYREF, VT_I4|VT_BYREF
	mcall2 ECLPS, "SearchText", 4, prm, vt, rtn
	return rtn
 
試せる環境も資料もないので、型(vt)が間違っているかも。
 
#comfuncが使えるインターフェースがあれば、もっと簡単に出来ると思うのですが・・・。
|  
 |  | 
 
 
 |  | 
2008/3/6(Thu) 17:51:02|NO.13978 
dupptrを使えばvariant型変数のvtにVT_BYREFを指定してもエラーにならないみたいですね。 #defcfunc searchtext@pcomm str p1, int p2, var p3, var p4
	dimtype v1, vartype("variant")
	dimtype v2, vartype("variant")
	// 数値型のクローン作成
	dupptr _v1, varptr(v1), 16
	dupptr _v2, varptr(v2), 16
	_v1 = 0x4003	// VT_I4|VT_BYREF
	_v2 = 0x4003
	dialog "Row : " + p3 + " Col : " + p4
	_v1(2) = varptr(p3)
	_v2(2) = varptr(p4)
	comres rtn
	ECLPS->"SearchText" p1, p2, v1, v2
	dialog "Row : " + p3 + " Col : " + p4
	return rtn
 | 
 
 
 |  | 
2008/3/6(Thu) 19:37:12|NO.13979 
うはっ! pizzaさんIDispatchから直接行った〜〜っ。 ヽ(´∇`)ノ 
VT_BYREF にするの忘れてた。 
こうかな?
 #const VT_I4      3
#const VT_BYREF   0x4000
dimtype v1, vartype("variant")
wpoke v1, 0, VT_I4 | VT_BYREF
lpoke v1, 8, varptr(row)
dimtype v2, vartype("variant")
wpoke v2, 0, VT_I4 | VT_BYREF
lpoke v2, 8, varptr(col)
comres rtn
ECLPS->"SearchText" p1, p2, v1, v2
mes "rtn = "+rtn
mes "row = "+row
mes "col = "+col
 | 
 
 
 |  | 
2008/3/7(Fri) 10:29:07|NO.14011 
ちゃんと取得出来ました。すごいです。
 あまり理解は出来ていないのですが、mcall命令を引数戻り値にしたってことでしょうか。
 ちょっと勉強してみます。
 
 みなさん色々とありがとうございました。
 
 | 
 
 
 |  | 
2008/3/7(Fri) 11:22:55|NO.14012 
rootさんOLE Object Viewerは初めて使うので、
 もしかすると使い方が間違っているかもしれませんが
 タイプライブラリはあるのですが、
 インターフェイスが見つかりませんでした。
 色々と調べて頂いたみたいでありがとうございました。
 
 pizzaさん
 無事「mcall2」も「ByRef」でも取得できることを確認しました。
 「mcall2」の方は勉強不足のため、理解出来ていないのでこれから勉強してみます。
 「ByRef」の方は、Variant型のタイプを変更して渡していると言うことでしょうか。
 HSPのVariant型はByRefではないと言うことなんですね。
 勉強になりましたありがとうございます。
 
 aさん
 色々なアイデアありがとうございます。
 aさんの「ByRef」でも無事取得することが出来ました。
 
 
 | 
 
 
 |