[HMM0081A]
●「DLLがロードされてないのにdllfunc関数が使われました」と表示される
- マクロを実行すると、「DLLがロードされてないのにdllfunc関数が使われました」 と表示されるのですが?
原因としては 以下の内容が考えられます。
loaddll文/関数で、dllの読み込みに失敗しているのに、dllfunc/dllfuncstrを呼び出している
DLLの読み込みに失敗する原因としては、DLLが適切な位置に配置されていない等が考えられます。 実行するマクロと同じ場所か、マクロフォルダか、秀丸エディタ本体と同じ場所に配置するかは、 マクロの説明書等に記載されているはずなので、確認してください。
マクロとDLLが、同じ場所にあるにも関わらず、動作しない場合は、DLLのロード部分を確認見直してみてください。 単純にファイル名が間違っている場合もあります。
64bit版秀丸エディタを使用しているのに、32bit版のDLLをロードしようとしている。
基本的に、64bit版秀丸エディタで使用できるのは、64bit版DLLだけです。 オプションの設定で、32bit版DLLを使用する事も出来ますが、正常に動作する保証はありません。
DLLを実行するためのファイルが足りない。 VCのランタイムライブラリ等、DLLの実行に必要なファイルがない場合にもDLLのロードに失敗します。 DLL本体の他に、必要なファイルがあるかどうか確認してください。
loaddll文/loaddll関数の有効範囲の問題
秀丸エディタではVer.3.02以降、外部DLLを使用できるようになりましたが、 以下の制限が存在します。
dllfunc等の関数呼び出しは、loaddll文/loaddll関数 を実行した秀丸エディタのみ可能。 dllをロードした秀丸エディタ以外では、dllfunc等の関数呼び出しは失敗する。
マクロヘルプのDLL呼び出し機能 を参照の事。
その為、ウィンドウの切り替えに失敗していたり、意図しないウィンドウの切り替えが発生してしまい、 DLLをロードしたウィンドウ以外でdllfunc等を呼び出すと、 「DLLがロードされてないのにdllfunc関数が使われました」 と表示されてしまいます。
動作確認用マクロ(意図的にウィンドウを切り替えて、エラーを発生させている。)
//新しいファイルを2個開く newfile; #window1 = hidemaruhandle(0); newfile; #window2 = hidemaruhandle(0); //1番目の秀丸エディタ上で、hmjre.dllをロードする setactivehidemaru #window1; loaddll "hmjre.dll"; if(!result){ message "hmjre.dllのロードに失敗しました。"; endmacro; } //関数の実行(問題なし) $version1 = hex(dllfunc("JreGetVersion") & 0xFFFF); message $version1; //2番目の秀丸エディタに移動 setactivehidemaru #window2; //関数の実行(ここでエラーになるはず。) // --> DLLがロードされてないのにdllfunc関数が使われました $version2 = hex(dllfunc("JreGetVersion") & 0xFFFF); message $version2; freedll; endmacro;