HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0229
ぶっちCOMについて15解決


ぶっち

リンク

2008/2/29(Fri) 11:00:41|NO.13826

COMについて質問です。

mcallで呼び出す際、引数を使用しているのですが
その引数に値が戻ってくるようなCOMの場合、
値が設定されていないようですが、
引数が戻り値の場合どうすれば良いのでしょうか?

ご教示願います。



この記事に返信する


pizza

リンク

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では戻ってくる)戻ってこないのですが、
 どうすれば値の取得ができるのでしょうか?
 
 再度、ご教示願います。



A

リンク

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



root

リンク

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



a

リンク

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



a

リンク

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



a

リンク

2008/3/5(Wed) 19:52:38|NO.13935

それ、戻り値を設定する処理が抜けてますよ。
SearchText = sText
を付け足してみてください。

それでも、動かないなら
SC->"Run" の直後で、statの値を確認。
statがゼロでないならエラー終了したという事です。
スクリプトが間違ってないか再確認!

それでも動かないなら、正常に動作しているVBScriptのソースを見せてください。
正しい使い方が判らないままでは、答えようがないので…。



root

リンク

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メソッドにどんな引数を渡せば良いか分かると解決が早そうです ;)



pizza

リンク

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が使えるインターフェースがあれば、もっと簡単に出来ると思うのですが・・・。



pizza

リンク

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



a

リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.