closehidemaruで保護違反No.04750
たるっぱ さん 02/02/17 02:35
 
たるっぱです、質問させてください。

本体ウィンドウはそのままで、エディタウィンドウのみを全て閉じるマクロを
作りました。どなたか既に作っていそうですが・・・

----------------------------------------------------------------------
    setactivehidemaru #handle[#i];
    #dmy = dllfunc( "SetMainWndTop" );
----------------------------------------------------------------------
この2行は無駄に思えますが、入れておかないと、6つ以上エディタウィンドウが
出ていた場合に、何度目かのclosehidemaruで保護違反が起こるんです。
これには、仕様上の理由があるんでしょうか?

マクロ自体は目的の通り動いているのでいいんですが、今後の参考のために、
確認しておきたいと思ったんです。

     OS : Windows2000 SP2
鶴亀Ver : 1.61
秀丸Ver : 3.15

必要でしたら、障害時のdump.txtをお見せします。以下、問題のマクロです。

----------------------------------------------------------------------
// エディタウィンドウのみを全終了する

// #handle  ウィンドウハンドルの配列
// #i       ウィンドウハンドル配列のインデックス
// #dmy     ステータスチェックをしない場合の戻り値
// #allwin  エディタウィンドウの総数
// #winnum  処理対象エディタウィンドウの数

loaddll "tkinfo.dll";
if( !result ) {
    message "tkinfo.dllが使えません";
    endmacro;
}
if( !dllfunc("IsTuruKame") ) {
    endmacro;
}

// 本体ウィンドウをactiveに
if(!dllfunc( "SetMainWndTop" )) {
    exitall;
    endmacro;
}

// エディタウィンドウのハンドル収集
#allwin = hidemarucount;
#i = 1;
while( #i < #allwin ) {
    #handle[#i] = hidemaruhandle(#i);
    #i = #i + 1;
//if (#i > 5) break;
}

// エディタウィンドウを閉じる
#winnum = #i - 1;
#i = 1;
while( #i <= #winnum ) {
    setactivehidemaru #handle[#i];
    #dmy = dllfunc( "SetMainWndTop" );
    closehidemaru #handle[#i];
    if(!result ) {
        setactivehidemaru #handle[#i];
        question "保存されていません、閉じてもいいですか";
        if(result == yes ){
            #dmy = dllfunc( "SetMainWndTop" );
            closehidemaruforced  #handle[#i];
        }
    }
    #i = #i + 1;
}

// 終了
endmacro;

[ ]
RE:04750 closehidemaruで保護違反No.04751
ひろ さん 02/02/17 18:16
 
 たるっぱさん今日は、ひろです。
> closehidemaruで保護違反が起こるん
 この理由は分かりませんが、

> 本体ウィンドウはそのままで、エディタウィンドウのみを全て閉じるマクロを
> 作りました。どなたか既に作っていそうですが・・・
これだけのことで、更新していても無視してよいのなら、末尾のマクロでよ
いでしょう。
//------------ close editor window ----------------------------------
loaddll "tkinfo.dll";
#handle = dllfunc( "SetMainWndTop" );
while( hidemarucount != 1 )closehidemaruforced 1;
freedll;

[ ]
RE:04751 closehidemaruで保護違反No.04753
たるっぱ さん 02/02/17 20:52
 
ひろさん こんにちは。

>> 本体ウィンドウはそのままで、エディタウィンドウのみを全て閉じるマクロを
>> 作りました。どなたか既に作っていそうですが・・・
>これだけのことで、更新していても無視してよいのなら、末尾のマクロでよ
>いでしょう。

>//------------ close editor window ----------------------------------
>loaddll "tkinfo.dll";
>#handle = dllfunc( "SetMainWndTop" );
>while( hidemarucount != 1 )closehidemaruforced 1;
>freedll;

をを、さすがひろさん、シンプルですね。

しかしながら、未保存のメールは閉じる前に確認して、閉じないままにして
おくことができて欲しいので、このロジックでは目的の動作となりません。

コメントありがとうございました。

[ ]
RE:04750 closehidemaruで保護違反No.04754
秀まるお さん 02/02/18 00:08
 
 調べてみたたしかにバグってました。さっそく修正させていただきます。

 (hidemac.dllの解放タイミングが狂ってました)

[ ]
RE:04753 closehidemaruで保護違反No.04755
ひろ さん 02/02/18 00:18
 
 たるっぱさん今日は、ひろです。
> 未保存のメールは閉じる前に確認して、閉じないままにして
> おくことができて欲しい
 それでは次のマクロは?
>//------------ close editor window ----------------------------------
loaddll "tkinfo.dll";
#tmp = dllfunc( "SetMainWndTop" );
##i = 1;
while( ##i < hidemarucount ){
  #handle[##i] = hidemaruhandle( ##i );
  ##i = ##i + 1;
}
##j = 1;
while( ##j < ##i  ){
  closehidemaru #handle[##j];
  if( !result ){
    setactivehidemaru #handle[##j];
    question "未保存です。保存しますか?\n" +
      "[はい]で保存後ウィンドウを閉じる。\n" +
      "[いいえ]でウィンドウそのまま。";
    if( result ){
      if( dllfuncstr( "CurrentFolder" ) == "未送信")
        #tmp = dllfunc( "SendLater" );
      else save;
      #tmp = dllfunc( "SetMainWndTop" );
      closehidemaru #handle[##j];
    }
  }
  ##j = ##j + 1;
}
freedll;

[ ]
RE:04755 closehidemaruで保護違反No.04761
たるっぱ さん 02/02/18 19:00
 
たるっぱです。

----------------------------------------------------------------------
>    question "未保存です。保存しますか?\n" +
>      "[はい]で保存後ウィンドウを閉じる。\n" +
>      "[いいえ]でウィンドウそのまま。";
>    if( result ){
>      if( dllfuncstr( "CurrentFolder" ) == "未送信")
>        #tmp = dllfunc( "SendLater" );
>      else save;
----------------------------------------------------------------------

特にこの辺、参考にさせていただきます。
# Bypass_MessageBoxを使って、動作のバリエーションを増やしてみよっと

ただ、残念ながら、頂いたままのマクロイメージでは、やはりclosehidemaruで
保護違反が・・・

って書いてる間に、おおっ、V1.62でFIXされている。
うん、問題なく動作します。これで例の余分な2行は削除できます。
はるかに高速になりました。

ひろさん、開発担当の方々、ありがとうございました。

[ ]