64bit版秀丸メールでのdllfunc/dllfuncstrNo.42855
緒方聡 さん 12/06/15 10:24
 
お世話になっています。

秀丸メール64bit版 5.70で、あとで送信・今すぐ送信時に以下のようなマクロを設定
しました。


loaddll "tkinfo.dll";
message dllfuncstr( "HomeDir" );
message "OK";


メール送信前にダイアログが二度表示されることを期待しているのですが、ダイアロ
グが一度も表示されずにメールが送信されてしまいます。

最後のmessage文も実行されていないように見えることから、dllfuncstrでマクロプ
ロセスが終了してしまっているのではないかと思い、投稿させてもらいました。

[ ]
RE:42855 64bit版秀丸メールでのdllfunc/dNo.42856
緒方聡 さん 12/06/15 11:09
 
すみません、再現条件がありました。

拙作の検索マクロを起動した後で問題が発生します。

http://hide.maruo.co.jp/lib/tkmacro/hidemarumailsearch.html

このマクロは64bit環境では正常に起動しないのですが、それがdllfunc/dllfuncstr
が動作しないことと関係しているようです。

[ ]
RE:42856 64bit版秀丸メールでのdllfunc/dNo.42857
秀まるお2 さん 12/06/15 11:38
 
 毎度バグ情報ありがとうございます。こちらでもテストしたら簡単に再現でき
ました。

 64bit版の秀丸メールから32bit版のdllをロードしようとした時は、
HmDll64x32.binってプログラム(.binとなってるけども実際は実行可能
ファイル)を経由してdllを呼び出す仕組みになってまして、それが何か誤動作
してるようです。

 マクロ自体は実行されてて"HomeDir"の関数呼び出しもされてるようではあり
ますが、メッセージボックスが出ないようです。

 32bit版のdllfunc呼び出しがうまくいかない所も含めて詳しく調べてみます。

[ ]
RE:42857 64bit版秀丸メールでのdllfunc/dNo.42858
緒方聡 さん 12/06/15 12:12
 
調査の方、よろしくお願いします。

> 64bit版の秀丸メールから32bit版のdllをロードしようとした時は、
>HmDll64x32.binってプログラム(.binとなってるけども実際は実行可能
>ファイル)を経由してdllを呼び出す仕組みになってまして、それが何か誤動作
>してるようです。

話が少しそれてしまうのですが、64bit版から32bit DLLは呼び出せる仕組みがあって、
64bit用にDLLを準備しなくてもよい、ということなのでしょうか?


[ ]
RE:42858 64bit版秀丸メールでのdllfunc/dNo.42859
秀まるお2 さん 12/06/15 13:24
 
 64bit版から32bit版のdll呼び出しをする場合、32bitのダミープロセスを1つ
起動して、そこで32bit版のdllをロードして関数呼び出しするだけになります。
そういう仕組みのために、ロードされたdllの動作によってはまともに動作しな
いようです。

 例えばMessageBoxとかDialogBoxとか表示しようとしても、秀丸エディタ/秀
丸メールのプロセスとは別の所でウィンドウを出そうとしてしまうとか、いろい
ろおかしいことが起こってしまうようです。

 今回のケースもそれでうまくdllが動いてないようです。

 そういう、うまくdll呼び出しが出来ない現象が起きた後に、内部的に「32bit
版のdllがうまく動かなくなった」ってフラグを持っていて、それがずっとONの
ままになっていて、結果、後のマクロでのdllfunc呼び出しが全部中断してしま
う(マクロがその時点でエラーも出さずに終了してしまう)ようになるようでし
た。

 ということで、とにかくバグはバグで修正させていただきますが、それで
hidemmarumailsearchのマクロがうまく動くようになることは無いです。

 64bit版から32bit版dllをロードした場合にうまいかない可能性があることは、
ヘルプか設定ダイアログボックス上に注意書きを追加しようと思います。

[ ]
RE:42859 64bit版秀丸メールでのdllfunc/dNo.42860
緒方聡 さん 12/06/15 13:42
 
ご説明ありがとうございました。

徐々に64bitにも対応してみようと思います。

[ ]
RE:42860 64bit版秀丸メールでのdllfunc/dNo.42861
秀まるお2 さん 12/06/15 15:03
 
 Visua Studio 2010のProfessional版以上があれば64bit版は簡単に作成出来る
と思います。

 Express版以下の場合はちょっと難しいです。別途Windows SDKをダウンロード
してコンパイラーのPATHをそっちにするとか、いろいろ工夫が必要です。

 うちの会社では32bit版は未だにVisual C++ 5.0でビルドしてまして、64bit版
は、Visual C++ 2008 ExpressにWindows SDKの64bit版コンパイラのpathを
セットしてビルドしています。

[ ]
RE:42861 64bit版秀丸メールでのdllfunc/dNo.42862
緒方聡 さん 12/06/16 00:35
 
情報ありがとうございます。
64bit 版は何とかなりました。

HmDll64x32.bin で DLL がエラーになる原因(のひとつ)ですが、どうやらレジスト
リを参照するところに問題があるようです。

マクロフォルダの場所を特定するために、秀丸のインストール状況を調べているので
すが、HmDll64x32.bin 経由の DLL だと RegOpenKeyEx で HKLM にアクセスしようと
すると ERROR_FILE_NOT_FOUND が返されてエラーになります。ただし、HKCU だとエ
ラーになりません。

以下ファイルの getMacroDir という関数で get_reg_value に失敗します。

https://github.com/satosystems/HidemaruMailSearch/blob/master/HidemaruMailSe
arch/HidemaruMailSearch.cpp

呼び出されている関数は以下にあります。

https://github.com/satosystems/HidemaruMailSearch/blob/master/HidemaruMailSe
arch/registory.cpp


書いていて気がついたのですが、getMacroDir という関数内では、以下のような条件
でマクロディレクトリを特定しています。

- 秀丸がインストールされていないなら秀丸メールインストールディレクトリ
- 秀丸がインストールされているなら、マクロパスを調べる
- マクロパスが存在しなければ秀丸のインストールディレクトリ

このコードを書いたのが 4 年ぐらい前で、それから Windows Vista/7 も登場し、イ
ンストールディレクトリにマクロを置くのはさすがにないのかなと思いましたが、秀
丸メール単体でインストールされている場合、マクロディレクトリはどこになるので
しょうか?

[ ]
RE:42862 64bit版秀丸メールでのdllfunc/dNo.42863
秀まるお2 さん 12/06/16 12:36
 
 HmDll64x32.binのプロセス内からレジストリ参照しようとすると、32bit
アプリ用のレジストリにバイパスされてしまうんだと思います。

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\...

 の方にバイパスされたように思います。

 RegOpenKeyExする時にKEY_WOW64_64KEYを指定すれば直るかなぁと思いますけ
ども、動作確認まではしてないのでどうだか分かりません。

 それよりも、マクロ用のフォルダを自分で調べるのは大変なので、マクロ用
フォルダはマクロからdllfuncで渡してもらうのがいいんじゃないかと思います。

 INT_PTR _cdecl GiveMacroPath( char* pszMacroPath ) {
     strcpy_s( szMacroPath, ARRAYSIZE(szMacroPath), pszMacroPath );
     return 1;
 }

 みたいな関数を用意しておいて、マクロ側から

    loaddll ".......dll";
    #n = dllfunc("GiveMacroPath", macrodir );

 とかしてもらうとか。それが一番簡単で確実だと思います。

[ ]