[ 新規に投稿する ]

LoadUnlhaDll に失敗するNo.02680
dszhm さん 17/12/22 11:05 [ コメントを投稿する ]
  OS:Win 7 Pro SP1 64bit
エディタ:8.75 64bit Float
メール:6.75 64bit
です。

題記の通り、LoadUnlhaDll に失敗します。
おそらく、Win 7 が 64bit 版ということで、インストーラが

C:\Windows\SysWow64

にインストールするのですが、
LoadUnlhaDll は、

C:\Windows\System32

を検索するのだと思います。
どう対策したらいいでしょうか?

64bit の win 下で、32bit の DLL を

C:\Windows\System32

に入れるのは、少し?怖いので避けたいです。
[ ]
RE:02680 LoadUnlhaDll に失敗するNo.02682
秀まるお2 さん 17/12/22 12:57 [ コメントを投稿する ]
   調べてみたら、LoadUnlhaDllの中でやってるのは、WindowsのAPIである「LoadLibrary」関数に、普通に"Unlha32.dll"を渡してロードしてるだけでした。

        hmodUnlha = LoadLibrary( "unlha32.dll" );

 みたいな処理になってました。この場合、環境変数の"path"が通ってるフォルダか、Windowsのシステムフォルダかにdllが無いとロードに失敗するようです。

 Windows7の64bit版だと、環境変数のpathには"c:\Windows\SysWow64"は入ってないようで、それでエラーになるようです。たしかに32bitのdllがpathの中にあることは普通無いので、これはこれでそういう物になってしまいます。

 回避策としてどうするかですが・・・

 とりあえず、Unlha32.dllの存在してるはずのフォルダをちゃんと特定してロードするように直してみます。

 次、たぶん正式版になると思うんですが、一応その正式版に入れてしまおうと思います。(もしかしたらまたβ出すかもしれませんが)
[ ]
RE:02682 LoadUnlhaDll に失敗するNo.02684
秀まるお2 さん 17/12/23 16:00 [ コメントを投稿する ]
   こちらでテストしてみたら、こちらのWindows7 64bit環境だとエラーにならないようでした。

 LoadLibraryで、C:\windows\syswow64のフォルダをちゃんと探して、そこにあるdllをロードしてるれるようです。

 うまくいかない理由として考えられるのは、C:\Windows\SysWOW64配下にUNLHA32.DLLが無いケースくらいしか無さそうな気がします。

 64bit版Windows上で32bit版アプリを動かして、その中で、例えば極端な話、

    hmod = LoadLibrary( "C:\\Windows\\system32\\xxxx.dll";

 みたいにやっても、自動的に「system32」から「SysWOW64」に変換されたdllをロードするような、そういう仕組みがあるようです。なので普通は大丈夫なはずだと思います。


 たしかにC:\Windows\SysWOW64配下にUNLHA32.DLLがあるかどうか、今一度確認してみて欲しいです。

 あと、テストする方法として、たとえば

    loaddll "c:\\windows\\system32\\unlha32.dll";
    if( !result ) {
        message "ロード失敗";
    } else {
        message "ロード成功";
    }

 みたいなマクロで確認できます。僕の所では上記マクロも成功します。

 秀丸メールは32bit版です。もしかして64bit版だとダメですけども。
[ ]
RE:02684 LoadUnlhaDll に失敗するNo.02685
dszhm さん 17/12/24 18:34 [ コメントを投稿する ]
  >うまくいかない理由として考えられるのは、
>C:\Windows\SysWOW64配下にUNLHA32.DLLが無いケースくらいしか無さそうな気がします。

エクプローラーで、開いて目視での確認ですが、有ります。

> 64bit版Windows上で32bit版アプリを動かして、その中で、例えば極端な話、
>
>    hmod = LoadLibrary( "C:\\Windows\\system32\\xxxx.dll";
>
> みたいにやっても、自動的に「system32」から「SysWOW64」に変換されたdllをロードするような、そういう仕組みがあるようです。なので普通は大丈夫なはずだと思います。

えっと、最初の投稿に書きましたが、
>64bit版Windows上で32bit版アプリ
ではなく、
64bit版Windows上で、
秀丸(エディタ、メール、共)64bit版
なのです。
> たしかにC:\Windows\SysWOW64配下にUNLHA32.DLLがあるかどうか、今一度確認してみて欲しいです。

 $msgs = "";
 loaddll "c:\\windows\\system32\\unlha32.dll";
 if( !result ) 
 {
  $msgs = $msgs + "System32 ロード失敗";
 } 
 else 
 {
  $msgs = $msgs + "System32 ロード成功";
 }

 $msgs = $msgs + "\n";
 loaddll "c:\\windows\\syswow64\\unlha32.dll";
 if( !result ) 
 {
  $msgs = $msgs + "SysWow64 ロード失敗";
 } 
 else 
 {
  $msgs = $msgs + "SysWow64 ロード成功";
 }

 message $msgs;

で、テストしてみると、
---------------------------
秀丸エディタ
---------------------------
System32 ロード失敗
SysWow64 ロード成功
---------------------------
OK   
---------------------------
となります。
[ ]
RE:02685 LoadUnlhaDllに失敗するNo.02686
h-tom さん 17/12/24 20:41 [ コメントを投稿する ]
 
h-tom です。

ようは、
> 秀丸メールは32bit版です。もしかして64bit版だとダメですけども。
と言うことです。

Unlha32.DLL, Zip32J.DLL の 64bit版は存在していませんし、
64bit版 TKInfo.dll から、32bit版 Unlha32.DLL はロードできません。

現状、64bit版では、
「Unlha32.DLL, Zip32J.DLL呼び出し関数」
は実行出来ないと言うことです。

64bit DLLで、32bitプロセス起動し、統合アーカイバ系の32bit DLL を
呼び出すものもありますけどね。
64bit版の場合、run文で、外部ソフト使った方が手っ取り早いでしょう。
[ ]
RE:02686 LoadUnlhaDllに失敗するNo.02687
秀まるお2 さん 17/12/24 22:51 [ コメントを投稿する ]
   最初にちゃんと、秀丸メールが64bit版と書いてありました。完全に見てませんでした。大変失礼しました。

 ヘルプの記述が32bit/64bitのことについて何も書いてないのが悪いですが、h-tomさんの話の通りでして、64bit版の秀丸メールでは32bit版のUNLHA32.DLLをロードすることは出来ないです。

 基本的に、「DLL」については、32bit版アプリからは32bit版のDLLしかロードできないです。

> 64bit版の場合、run文で、外部ソフト使った方が手っ取り早いでしょう。

 現状で、秀丸メールの種類が32bitでも64bitでも関係無く圧縮する手段として一番お勧めなのは、7zipを呼び出すやり方になりまして、

    http://hide.maruo.co.jp/lib/tkmacro/attachcompress-7zip-v3.html

 が一番お勧めです。

 あと、ヘルプの方は、64bit版の秀丸メールからは現状(UNLHA32.DLLの64bit版が出ない限り)使えないって記述を追加させていただきます。
[ ]
RE:02687 LoadUnlhaDllに失敗するNo.02688
秀まるお2 さん 17/12/24 22:55 [ コメントを投稿する ]
  補足ですが、

> 基本的に、「DLL」については、32bit版アプリからは32bit版のDLLしかロードできないです。

 32bit版アプリからは32bit版のDLLのみ、
 64bit版アプリからは64bit版のDLLのみしかロードできない。

です。

 ちなみに秀丸エディタの64bit版のloaddllでは32bit版のDLLが制限付きながらロードできるので話がややこしいのですが、こっちの場合は、64bit版から別途32bitのダミープロセスを1つ起動して、そこでDLLをロードして、64bit版の秀丸エディタから32bitのダミープロセスに関数呼び出しパラメータをプロセス間通信で渡す、みたいな非常にややこしいことをしていたりします。その辺の機能は、すみませんが秀丸メール側では対応してないです。
[ ]

[ 新規に投稿する ]