関数SelectFolderとScripting.DictionaryNo.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(#c
omErr);
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(#c
omErr);
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.DiNo.13032
秀まるお2 さん 24/11/25 09:13
 
マクロの動作がおかしいようで、お手数かけてすみません。

Scripting.Directoryについて全然知識が無いので、その辺の勉強も含めてテストさ
せていただきます。少々お時間ください。

[ ]
RE:13032 関数SelectFolderとScripting.DiNo.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.DiNo.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.DiNo.13036
ラフ さん 24/11/25 23:04
 
>今アップロードしました。
>
ありがとうございます。
テストプロ正しく動く事を確認しました。


[ ]
RE:13036 関数SelectFolderとScripting.DiNo.13037
秀まるお2 さん 24/11/28 11:48
 
確認ありがとうございます。

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

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

[ ]