[ 新規に投稿する ]

関数SelectFolderとScripting.Dictionaryの問題についてNo.13029
ラフ さん 24/11/23 08:31 [ コメントを投稿する ]
  アカウントが多いのでアカウントグループごとのアカウントリストを作成するマクロを書こうとして、
取得したアカウントグループの格納にScripting.Dictionaryを使おうとしています。

で、下記テストマクロを実行すると、Scripting.DictionaryのExistsメソッドでエラーが出たり出なかったりします。
一つ目と二つ目のアカウントは同じアカウントグループです。

現象1:実行1回目は二つ目のExistsでエラー(0x80004005)になる(一つ目は正常)
現象2:もう一度実行すると今度は一つ目のExistsでエラー(0x80004005)になる
現象3:実行を続けると上記を繰り返す(一つ目ばかりになったり二つ目ばかりになったりはしない)
現象4:二つ目のSelectFolderをコメントアウトするとエラーは出ない。
当然取得されるグループは一つ目のアカウントの物ですが同じグループ名です。

なお、まだAddはしていないのでハッシュの中は空のままです。
あと、現象1が一つ目のExistsでエラーの時もあります。
呼び出し方など問題があれば指摘してください。
Scripting.Dictionary自体は秀丸エディタのマクロで普通に使えてますので、
秀丸メール側で使った時、しかもSelectFolderとの組み合わせでのみ(それ以外にもあるかもしれませんが)起こる現象のようです。


==環境==
[Windows]
エディション:Windows 10 Pro 64bit
バージョン:22H2
OSビルド:19045.5131

[秀丸メール]
バージョン:7.33 64bit


//テストマクロ
//テストマクロ
 loaddll "TKInfo.dll";
 if( !result ) {
  message "TKInfoがロードできませんでした\n";
  endmacro;
 }

 call CreateDictionary;
 #objHash = ##return;
 if(#objHash == 0) {
  message "createobjectエラーになりました(Scripting.Dictionary):"+hex(#comErr);
  endmacro;
 }

call debugon;
 $$account = dllfuncstr("Account", 0);
call deb_output  "$$account:" + $$account;
 if($$account != "") {
  ##n = dllfunc( "SelectFolder", $$account, "");
call deb_output  "SelectFolder:" + str(##n);
  if(##n == 1) {
   $$account_group = dllfuncstr( "CurrentAccountGroup");
call deb_output  "$$account_group:" + $$account_group;
   ##ret = callmethod_returnnum(#objHash, "Exists", $$account_group);
call deb_output  "Exists:" + $$account_group + "=" + str(##ret);
   if( getresultex(10) == false ) { // 失敗
    #comErr = getresultex(11);
    $$txt = "Existsメソッドがエラーになりました:"+$$account_group+":"+hex(#comErr);
call deb_output  $$txt;
    message $$txt;
call debugoff;
    goto macro_end;
   }
  }
 }

 $$account = dllfuncstr("Account", 1);
call deb_output  "$$account:" + $$account;
 if($$account != "") {
  ##n = dllfunc( "SelectFolder", $$account, "");
call deb_output  "SelectFolder:" + str(##n);
  if(##n == 1) {
   $$account_group = dllfuncstr( "CurrentAccountGroup");
call deb_output  "$$account_group:" + $$account_group;
   ##ret = callmethod_returnnum(#objHash, "Exists", $$account_group);
call deb_output  "Exists:" + $$account_group + "=" + str(##ret);
   if( getresultex(10) == false ) { // 失敗
    #comErr = getresultex(11);
    $$txt = "Existsメソッドがエラーになりました:"+$$account_group+":"+hex(#comErr);
call deb_output  $$txt;
    message $$txt;
call debugoff;
    goto macro_end;
   }
  }
 }

call debugoff;
 message "終了";

macro_end:
 freedll;
 releaseobject #objHash;
 endmacro;

CreateDictionary:
 #comErr = 0;
 ##objHash = createobject("Scripting.Dictionary");
 if( getresultex(10) == false ) { // エラー
  #comErr = getresultex(11);
  return 0;
 }
 setpropnum ##objHash, "CompareMode", 1; // テキストモード
 if( getresultex(10) == false ) { // 失敗
  #comErr = getresultex(11);
  return 0;
 }
return ##objHash;

debugon:
 setclipboard "Start Debug\n";
return;

debugoff:
 addclipboard "Stop Debug\n";
return;

deb_output:
 addclipboard $$1 + "\n";
return;


[ ]
RE:13029 関数SelectFolderとScripting.Dictionaryの問題につNo.13032
秀まるお2 さん 24/11/25 09:13 [ コメントを投稿する ]
  マクロの動作がおかしいようで、お手数かけてすみません。

Scripting.Directoryについて全然知識が無いので、その辺の勉強も含めてテストさせていただきます。少々お時間ください。
[ ]
RE:13032 関数SelectFolderとScripting.Dictionaryの問題につNo.13033
秀まるお2 さん 24/11/25 15:15 [ コメントを投稿する ]
  調べてみたら、createobjectしたオブジェクトがSelectFolder関数呼び出しのタイミングで勝手にreleaseobjectされてしまってました。

実は秀丸エディタの最近のバージョンで、「closenew」とか「loadfile」とかを実行した時に、JavaScript関係の情報やcreateobjectしたオブジェクト類を全部リセットするように仕様変更してしまったようです。秀丸メールがメールの表示内容を切り替えるとclosenewしたのと同じことが起きてしまってて、それで全部リセットされてしまってたようです。

秀丸メールのVersion 7.20からおかしくなってしまってたようです。

秀丸メール側ではその辺のリセットをしないようにまた修正して、β版を早めにアップロードさせていただきます。

あと、とりあえずの回避策として、keepobjectを使う作戦があるにはあるようです。

#a=createobject("Scripting.Dictionary");
keepobject #a,2;
closenew;
keepobject #a,0;

みたいな感じでclosenewしても勝手にreleaseobjectされないように出来るそうなので、SelectFolderの前後をkeepobjectで囲む作戦で回避が可能なんじゃないかとは思います。ただ、メールを選択する処理全部にこれを入れないといけないので、ちょっと現実的では無いです。

お手数かけてすみません。
[ ]
RE:13033 関数SelectFolderとScripting.Dictionaryの問題につNo.13034
秀まるお2 さん 24/11/25 16:29 [ コメントを投稿する ]
  今アップロードしました。

32bit版:
https://hide.maruo.co.jp/software/bin3/hmmail734b12_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hmmail734b12_x64_signed.exe

よろしくお願いします。
[ ]
RE:13034 関数SelectFolderとScripting.Dictionaryの問題につNo.13036
ラフ さん 24/11/25 23:04 [ コメントを投稿する ]
  >今アップロードしました。
>
ありがとうございます。
テストプロ正しく動く事を確認しました。
[ ]
RE:13036 関数SelectFolderとScripting.Dictionaryの問題につNo.13037
秀まるお2 さん 24/11/28 11:48 [ コメントを投稿する ]
  確認ありがとうございます。

その後、秀丸エディタでもやはり問題ということで、そっちの方で別の形で修正しつつ、その修正を秀丸メールにも反映する形にしました。一応その修正でも正しく動作することを確認したので、次のバージョンも大丈夫な予定です。

正式版も今年中にはアップロードしたいと思います。
[ ]

[ 新規に投稿する ]