マクロエラーNo.05018
ひろ さん 01/05/16 18:06
 
 秀まるおさん今日は、ひろです。
 マクロの書き方が悪いという可能性があるのですが、DDE 機能を利用した
マクロ起動中に ddeinitiate で失敗したり、「apDdesub が足りません」と
なり ddepoke に失敗します。dump.txt のそれらしき部分は以下に示す通り
ですが、ダンプは出力されていません。

17:42:06.750 (3082) エディタコマンド: 40056
17:42:06.750 (6175) BeginNewAtachList
17:42:12.080 (4079) ProcessCommand 40038
17:42:12.080 (7132) ThreadFunc: HmCreate
17:42:12.080 (2390) call WinMainSub
17:42:12.130 (2390) FrameWndProc: WM_CREATE
17:42:12.130 (2390) ClientWndProc: WM_CREATE
17:42:12.130 (2390) return WinMainSub
17:42:12.130 (7134) HmCreate return
17:42:17.570 (2390) apDdesub[0] reserved, this=016A88CE
17:42:21.300 (2390) apDdesub full this=016A88CE
17:42:22.400 (2390) apDdesub full this=016A88CE
17:42:25.590 (2390) apDdesub[0] released, this=016A88CE
17:42:31.360 (3082) エディタコマンド: 40056
17:42:31.360 (6175) BeginNewAtachList
17:42:35.420 (3082) エディタコマンド: 40056
17:42:35.420 (6175) BeginNewAtachList

[ ]
RE:05018 マクロエラーNo.05022
秀まるお さん 01/05/16 18:54
 
> 17:42:17.570 (2390) apDdesub[0] reserved, this=016A88CE
> 17:42:21.300 (2390) apDdesub full this=016A88CE
> 17:42:22.400 (2390) apDdesub full this=016A88CE
> 17:42:25.590 (2390) apDdesub[0] released, this=016A88CE

 エラーになる原因は2つあります。

 1つは、ddeを終了させないまま別のウィンドウ上でddeを開始するようなことを、
3重にやった場合です。2重までならエラーにならないはずです。

 もう1つは、鶴亀メール側でのddeの終了処理がうまくいってないケースで、この
場合に相当するかどうかは、dump.txt中の

 apDdesub[0] reserved

 と

 apDdesub[0] released

 の対応が合ってるかどうか確認すれば分かります。

 ログを見るかぎりは2重に起動してはいますが、3重にはなってないように思いま
す。しかし、エラーになっているということは、どこかでrelease漏れが起きた可能
性が高いです。

 ってことで、まずは前者に相当するのか、それとも後者か教えて欲しいです。

 前者だとしたら、3重、4重にも対応できるように修正すれば済みますが、後者だ
としたら修正は面倒です。(一応、昔直したはずの処理なのですが)

[ ]
RE:05022 マクロエラーNo.05026
秀まるお さん 01/05/16 19:11
 
>  1つは、ddeを終了させないまま別のウィンドウ上でddeを開始するようなことを、
> 3重にやった場合です。2重までならエラーにならないはずです。

 間違いでした。ddeterminateしても内部的にはマクロ終了時まで解放してないので、
とにかく一連のマクロの中で、複数の秀丸に渡ってddeを使う場合、そのddeを使う秀
丸の合計が2つを越えてしまうとエラーになるようです。

 ddeterminateのタイミングで解放(DdeUninitialize関数を呼ぶ)と、これはこれ
で都合が悪いそうな…。

 あー面倒だけど、修正しないとまずいです。

[ ]
RE:05022 マクロエラーNo.05027
ひろ さん 01/05/16 19:46
 
 秀まるおさん今日は、ひろです。
 hidesoft.8:01565 は、送信直前に読みましたが、それを考慮してもおか
しな事があるので、読む以前の原稿をほぼそのまま投稿します。

>  1つは、ddeを終了させないまま別のウィンドウ上でddeを開始するようなことを、
> 3重にやった場合です。2重までならエラーにならないはずです。
 別ウィンドでは DDE をやっていません。つまりログに 2 重に残っている
時点で実際とはズレがあります。              ^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^
 また頻繁に再現する操作 (別のマクロ実行直後に、問題となっている DDE
マクロを使用する) をしていたら、落ちてしまうことあります。ログは、
> 19:12:18.060 (3082) エディタコマンド: 40056
> 19:12:18.060 (6175) BeginNewAtachList
> 19:12:18.120 (3082) エディタコマンド: 40095
> 19:12:18.120 (4079) ProcessCommand 40095
> 19:12:22.180 (4079) ProcessCommand 40038
> 19:12:22.240 (7132) ThreadFunc: HmCreate
> 19:12:22.240 (2390) call WinMainSub
> 19:12:22.240 (2390) FrameWndProc: WM_CREATE
> 19:12:22.240 (2390) ClientWndProc: WM_CREATE
> 19:12:22.240 (2390) return WinMainSub
> 19:12:22.240 (7134) HmCreate return
> 19:12:28.940 (2390) apDdesub[0] reserved, this=017088CE
> 19:12:33.110 (2390) apDdesub[0] released, this=017088CE
> 19:12:35.640 (2390) apDdesub[0] reserved, this=017088CE
となっており、dump.txt への出力はなく、エラーメッセージの詳細は、
> TURUKAME のページ違反です。
> モジュール : HIDECTL2.DLL、アドレス : 0167:0156cb32
> Registers:
> EAX=00000001 CS=0167 EIP=0156cb32 EFLGS=00010246
> EBX=00000000 SS=016f ESP=0286f448 EBP=0286f4d0
> ECX=cd26a940 DS=016f ESI=017088ce FS=4b67
> EDX=00001577 ES=016f EDI=00000000 GS=0000
> Bytes at CS:EIP:
> 89 7e 0c 89 7e 04 39 35 78 f6 5c 01 75 1f 56 8d
> Stack dump:
> 000012d2 0170ca8a 00035a70 4b67016f 0c370000 00000000 03698470
> bff713e2 00000167 bff742f2 000294c4 000294c4 bff728a2 bff728a2
> bfc02526 02867000
です。

 なお直前に使用するマクロとは、
if(filename == ""){
  loaddll "tkinfo.dll";
  if(!result){
    message "ファイルを保存してから実行してください";
    goto End;
  }
  if(dllfunc("IsTuruKame")){
    goto TuruKame;
  }
}
else goto Hidemaru;

TuruKame:
  ##main = dllfunc("MainWnd");
  if(##main == 0){
    ##open = 1;
    ##handle = hidemaruhandle(0);
    if(dllfunc("IsTrayIcon")){
      ##main=sendmessage(findwindowclass("TuruKameFrame"),0x0112, 0xF120, 0 );
      setactivehidemaru ##handle;
      ##main = dllfunc("MainWnd");
    }
    else{
      message "本体が起動していないと、実行できません。";
      goto End;
    }
  }
  $$account = dllfuncstr("ExecAt",##main,"CurrentAccount");
  $$folder = dllfuncstr("ExecAt",##main,"CurrentFolder");
  ##mailType = dllfunc("MailType");
  if(##mailType != 0 && ##mailType != 5){
    message "「草稿」「未送信」に保存された送信メールしか実行できません";
    goto End;
  }
  if(!readonly)execmacro macrodir + "\\turukame\\OverWrite.mac";
  loaddll "tkinfo.dll";
  $$draftAccount = dllfuncstr("CurrentAccount");
  $$draftFolder = dllfuncstr("CurrentFolder");
  if($$draftFolder != "草稿" && $$draftFolder != "未送信"){
    message "送信メールしか実行できません";
    goto End;
  }
  ##handle = hidemaruhandle(0);
  $fileName = dllfuncstr("MailFilePath");
  if(##handle != ##main){
    if(!dllfunc("Sync"))goto Error;
  }
  else{
    message "エディタ・ウィンドでしか動作しません。";
    goto End;
  }
  if(!dllfunc("SetMainWndTop"))goto Error;
  closehidemaru ##handle;
  if(!dllfunc("ExecAt",##main,"SelectFolder",$$account,""))goto Error;
  runsync2 "ispell -L20 -M -j -de:/usr/local/share/ispell/US-xlg.hash -x \""
     + $fileName + "\"";
  if(!dllfunc("ExecAt",##main,"RemakeList",$$draftAccount,$$draftFolder))
    goto Error;
  if(!dllfunc("ExecAt",##main,"SelectFolder",$$draftAccount,$$draftFolder))
    goto Error;
  if(!dllfunc("OpenMail"))goto Error;
  if(!dllfunc("ExecAt",##main,"SelectFolder",$$account,$$folder))goto Error;
  if(##open)##tmp = dllfunc("ExecAt",##main,"Exit");
  goto End;

Error:
  message "DLL error";
End:
  freedll;
  endmacro;

Hidemaru:
  freedll;
  if(!readonly)save;
  if((charset & 64) & (!(charset & 128)))##lf = 1;
  ##charset = charset & 63;
  if(##charset == 2 || ##charset == 5 || ##charset == 6){
    message "非対応文字コードです";
    endmacro;
  }
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  ##Timestamp = getregnum("Timestamp");
  ##Sharing = getregnum("Sharing");
  ##DupOpen = getregnum("DupOpen");
  writeregnum "Sharing",0;
  writeregnum "DupOpen",0;
  writeregnum "Timestamp",0;
  closereg;
  envchanged;
  reopen;
  runsync2 "ispell -L20 -M -j -de:/usr/local/share/ispell/US-xlg.hash \""
     + filename2 + "\"";
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  writeregnum "Sharing",##Sharing;
  writeregnum "DupOpen",##DupOpen;
  writeregnum "Timestamp",##Timestamp;
  closereg;
  envchanged;
  reopen;
  if(!##lf){
    if(##charset == 1)saveas filename2, sjis;
    else if(##charset == 3)saveas filename2, euc;
    else if(##charset == 4)saveas filename2, jis;
  }
  endmacro;
という内容のマクロで、DOS アプリケーションと連携しています。ただしこ
のマクロは、単独で何度利用してもエラーで落ちるようなことはなかったと
記憶しています。
 また DDE を利用しているマクロとは、ライブラリに登録してある「PDICW
DDE Popup Search macro for 秀丸」です。このマクロは私の環境では、浮
動小数点版秀丸で何故上手く動作しないのですが、秀丸担当さんのところで
再現せず (hidesoft.2:08278 のスレッド)、問題先送りの状態です。この様
なことからひょっとすると (通常版の) 秀丸で顕在化しないもんだいが、鶴
亀や浮動小数点版秀丸で顕在化しているのかもしれません。

[ ]
RE:05027 マクロエラーNo.05031
秀まるお さん 01/05/17 09:26
 
 死んでる場所が、DDEの後始末処理ってことだけは判明しました。

 詳しい事情説明は省略させていただきまして、次のバージョンで秀丸V3.05相当の
状態に戻してみます。それで一応直ると思います。

 それで直ればついでに浮動小数点数バージョンもDDEの処理をV3.05相当に戻してや
ることで直る可能性が高いです。

 (V3.05ではDDEの終了処理をしてません)

[ ]
RE:05027 マクロエラーNo.05037
秀まるお さん 01/05/17 12:14
 
 秀丸浮動小数点数バージョンでPDICWのマクロがうまく動かない件ですが、こ
ちらのWindowsMeの環境で再現しました。

 さらに、鶴亀V1.16での修正を秀丸浮動小数点数バージョンに反映した所、こ
の問題が解決してしまいました。

[ ]
RE:05031 マクロエラーNo.05038
ひろ さん 01/05/17 12:48
 
 秀まるおさん今日は、ひろです。
>  詳しい事情説明は省略させていただきまして、次のバージョンで秀丸V3.05相当の
> 状態に戻してみます。それで一応直ると思います。
 よろしくお願いします。

[ ]
RE:05037 マクロエラーNo.05043
ひろ さん 01/05/17 18:46
 
 秀まるおさん今日は、ひろです。
>  秀丸浮動小数点数バージョンでPDICWのマクロがうまく動かない件ですが、こ
> ちらのWindowsMeの環境で再現しました。
 これを読まずに直前のメールを送ってしまいました。
 私の環境は、Windows98+浮動小数点版秀丸 Ver.3.08 なのに何故この問題
が顕在化したか不明ですが、取り敢えず無事 Ver.1.16 で動作することを確
認しました。

>  さらに、鶴亀V1.16での修正を秀丸浮動小数点数バージョンに反映した所、こ
> の問題が解決してしまいました。
 それでは秀丸の浮動小数点版でも Ver.3.09 で直りそうですね(^^)。

[ ]