COMのメソッドが実行できていない?No.05017
たけとり さん 10/01/18 17:57
 
こんにちは。
ベータ版の開発お疲れ様です。

ヴァージョン8になってからCOM関係を多用するようになったのですが、わかっている
範囲では以下に示すコードで想定の結果が帰ってこないばあいがあります。
ちなみに、いずれの場合であってもオブジェクトは確保されます(if文の中身が実行
されている)。
さらに、「帰ってこない環境」であっても、他のオブジェクト(たとえばhmnetast.h
mnetexなど)では想定した結果は帰ってきています。
私の環境だけの問題だったらすみません....。

想定した結果が帰ってきた環境:
PC 1  ・XP SP2, 浮動小数点数版β35
      ・XP SP3, 浮動小数点数版β36
    (上記の状態からOS、秀丸をバージョンアップ)

帰ってこない環境:
PC 1  ・XP SP3, 浮動小数点数版β36+持ち出しきっと
    (上記の状態からHmRegIni.dllをコピーし秀丸を再起動)
PC 2  ・XP SP2, 浮動小数点数版β35+持ち出しきっと
    (別PC)


・以下のコードで、結果が""になる。
 ##objSC = createobject("ScriptControl");
 if(##objSC){
  setpropstr ##objSC, "Language", "JScript";
  message callmethod_returnstr(##objSC, "Run", "encodeURIComponent", "日本語");
  releaseobject ##objSC;
 }

・以下のコードで、「全て選択」が起きない場合がある(毎回起きないというわけで
はありません。)*
ただし、$$a = "a"ではどの環境であっても想定の結果("a"が挿入される)になる。
 $$a = "^a";  // Ctrl +Aに「全て選択」を割り当て済み
 ##objShell = createobject("WScript.Shell");
 if(##objShell){
  callmethod ##objShell, "SendKeys", $$a;
  releaseobject ##objShell;
 }
* 起きる場合と起きない場合があるのですが、こちらではまだ条件がわわかってない
です。

よろしくお願いします。

[ ]
RE:05017 COMのメソッドが実行できていなNo.05018
秀丸担当 さん 10/01/19 10:01
 

>ヴァージョン8になってからCOM関係を多用するようになったのですが、わかっている
>範囲では以下に示すコードで想定の結果が帰ってこないばあいがあります。
>ちなみに、いずれの場合であってもオブジェクトは確保されます(if文の中身が実行
>されている)。

報告ありがとうございます。
WindowsXPでβ36の持ち出しキットで同じマクロを実行して試してみましたが、持
ち出しキットでないときとの差は見られず、再現できませんでした。

失敗している場合、getresultexで10か11を指定して結果の値を教えてもらえると
何かわかるかもしれません。

ソースを確認してみたところ、プログラミング的なことですがCOMの初期化に
CoInitialize を呼んでいて、OleInitialize は呼んでいませんでした。もしかし
たら OleInitialize を呼ぶようにすると何か変化があるかもしれないです。
ちなみにエクスプローラ枠では、一部のシェルの機能が動いたり動かなかったり
したことがあってOleInitializeを呼んで解決したということがありました。

"ScriptControl"というのはOCXのようで、もしかしたら関係あるかもしれません。
直るかどうかわかりませんが、試しにOleInitializeを呼ぶように次のバージョン
で修正してみようと思います。

>・以下のコードで、「全て選択」が起きない場合がある(毎回起きないというわけで
>はありません。)*

こちらも再現はできませんでしたが、SendKeys を使う方法は秀丸エディタに限ら
ず不安定な方法かもしれません。
実際のキーの状態やタイミングなどによって挙動が変わる可能性があるのかもし
れないです。

[ ]
RE:05018 COMのメソッドが実行できていなNo.05019
たけとり さん 10/01/19 14:33
 
ちょっと時間がとれないので簡単なテストしかできていません。
詳細なテストは明日以降にしてみます。
すみません (o_ _)o

>失敗している場合、getresultexで10か11を指定して結果の値を教えてもらえると
>何かわかるかもしれません。
>
わかりました。(^^;
"ScriptControl"の例は、私のミスでした。
(#objSCと##objSCとが混在していました。)
大域変数・局所変数のミスを直したら、所望の動作をしました。
すみません。

SendKeysの例ですが、先のコードに1行ごと10,11を引数にして実行させたところ、結
果はそれぞれ1(引数が10の時)と0(引数が11の時)でした。(PC2で試しています)
(具体的には以下のような感じです)
createobject 〜
$er = $er + hex(getresultex(10)) + ":" + hex(getresultex(11)) + "\n";
callmethod 〜
$er = $er + hex(getresultex(10)) + ":" + hex(getresultex(11)) + "\n";
releaseobject 〜
$er = $er + hex(getresultex(10)) + ":" + hex(getresultex(11)) + "\n";
title $er;
title -1;

>実際のキーの状態やタイミングなどによって挙動が変わる可能性があるのかもし
>れないです。

これで思い当たるのは、SendKeysする直前までアウトプット枠を表示させています。
(関係あるのかどうかわかりませんが)
ただ、アウトプット枠をloaddllする前にhidemaruhandle(0)で取得したハンドルで、
アウトプット枠を解放した後にsetactivehidemaruしても変わりないような...かんじ
です。
(これ以外の枠・バーは元々表示していません)

もう少しこちらでテストしてみます。
取り急ぎ。

[ ]
RE:05019 COMのメソッドが実行できていなNo.05020
秀丸担当 さん 10/01/19 16:06
 

>わかりました。(^^;
>"ScriptControl"の例は、私のミスでした。
>(#objSCと##objSCとが混在していました。)
>大域変数・局所変数のミスを直したら、所望の動作をしました。
>すみません。

そうでしたか。
ということはOleInitializeとかは関係ないようでよかったです。

>SendKeysの例ですが、先のコードに1行ごと10,11を引数にして実行させたところ、結
>果はそれぞれ1(引数が10の時)と0(引数が11の時)でした。(PC2で試しています)

ということは、SendKeysの件は呼び出し自体はうまくいっているようで、あとは
オブジェクト側の処理なので、秀丸エディタとしては関知するところではないと
いうことになってしまいます。
秀丸エディタに限らず、SendKeysを使う方法はもともと不安定だと思うので、あ
まり積極的に使わないほうがいいかもしれないです。

もしアウトプット枠にフォーカスがある場合にうまくいかないとかそういうこと
であれば、事前にsetfocus文でフォーカス移動してからやるなどをするとうまく
いくのかもしれないです。

[ ]