|
|
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」でも無事取得することが出来ました。
|
|