last updated:2022/12/06

←前へ 次へ→ 機能別Q&A 質問番号順Q&A


[HMM0083A]

●外部DLLのロードに失敗する

Q.
マクロを実行すると、「DLLのロードに失敗しました」という内容のメッセージが表示されるのですが?

A.

まずはマクロからロードする DLL 自体が存在するか、確認してみましょう。

DLL がない場合は、マクロの説明書に入手方法が書かれていると思うので、確認し DLL を入手してください。

DLL があるのに読み込みに失敗する原因としては、以下の内容が考えられます。

  • デスクトップ版の場合

    • マクロが期待している位置にDLLがない。

      ロードしたい DLLを、

      • 実行するマクロと同じ場所
      • マクロフォルダ
      • 秀丸エディタ本体と同じ場所

      など、何処に配置するかは、マクロの説明書等に記載されているはずなので、確認してください。

    • マクロが期待している位置に DLL がある場合、マクロの DLL ロード部分を確認・見直してみてください。単純にファイル名が間違っている場合もあります。(マクロフィル内にある、loaddll 文 または loaddll 関数を検索してみましょう)

    • 64bit版秀丸エディタを使用しているのに、32bitの DLL をロードしようとしている。
      基本的に、使用できるのは秀丸エディタ本体と同じ bit の DLLだけです。

      • 32bit版秀丸エディタの場合は、32bitの DLL
      • 64bit版秀丸エディタの場合は、64bitの DLL

      64bit版秀丸エディタの場合、「その他」-「動作環境」-「64bit版」にある、「32bit版との互換性」の設定で 32bit DLLを使用する事も出来ますが、正常に動作する保証はありません。

      32bit版の互換性

      [補足]も参照の事。

    • DLL を実行するためのファイルが足りない。 VC のランタイムライブラリ等、DLL の実行に必要なファイルがない場合も DLL のロードに失敗します。 DLL 本体の他に、必要なファイルがあるかどうか確認してください。

  • ストアアプリ版の場合

    基本的にはデスクトップ版と同じですが、以下の制限があります。

    • デスクトップ版と違い、外部 DLL を秀丸エディタ本体と同じ場所に配置することは出来ません。その為、マクロフォルダ等「秀丸エディタ本体」とは別の場所にDLLを配置する必要があります。

    • ストアアプリ版は、2022/12/06現在、32bit版しかないので、DLL は32bitを使用する必要があります。

    使用するマクロがストアアプリ版で使用する事を考慮していない場合は、マクロを修正する必要があります。

    例えば、田楽DLLを使用するマクロが、

    loaddll hidemarudir + "\\DengakuDLL.dll";

    となっていた場合、ストアアプリ版では秀丸エディタ本体と同じ場所にDLLを配置できないので、 DLL のロードに失敗することになります。

    田楽DLL がマクロフォルダにある場合は、以下のようにマクロを修正します。

    loaddll macrodir + "\\DengakuDLL.dll";

    デスクトップ版でもストアアプリ版でも、問題なく動くようにするには、DLLのロード部分を以下のようにする方法もあります。ただし、ロードが成功するまで繰り返すのでマクロの起動が遅くなります。

    //田楽DLLのロード
    loaddll currentmacrodirectory + "\\DengakuDLL.dll";     //実行するマクロと同じ場所
    if (!result) loaddll macrodir + "\\DengakuDLL.dll";     //マクロフォルダ
    if (!result) loaddll hidemarudir + "\\DengakuDLL.dll";  //秀丸エディタ本体と同じ場所
    if (!result) loaddll "DengakuDLL.dll";
    if (!result){
        message "田楽DLLの読み込みに失敗しました。";
        endmacro;
    }

    実行環境を判別し、デスクトップ版なら秀丸エディタ本体と同じ場所、ストアアプリ版ならマクロフォルダからロードするには以下のようにします。

    //田楽DLLのロード
    //デスクトップ版の場合
    $DLL_PATH = hidemarudir;
    if((platform & 0x02000000) == 0x02000000){
        //ストアアプリ版の場合
        $DLL_PATH = macrodir;
    }
    loaddll $DLL_PATH + "\\DengakuDLL.dll";
    if (!result){
        message "田楽DLLの読み込みに失敗しました。";
        endmacro;
    }
[補足]

64bit版秀丸エディタで、32bit DLL をマクロで動作可能にした場合、 32bit DLL から"hmjre.dll"を使う時には注意が必要です。

外部DLLには、正規表現を使うために"hmjre.dll"をロードして使う物もあります。

64bit版秀丸エディタに添付される "hmjre.dll" は 64bit の DLL です。 bit数の異なるDLLは、お互いにロードすることができないので、 32bit DLLから、64bit DLL の hmjre.dll をロードしようとしても必ず失敗することになります。

「32bit版との互換性」で「32bit DLL をマクロの loaddll で動作可能にする」を有効にするのは、あまりおすすめしません。秀丸エディタや使用する外部 DLL を含め、32bit または 64bit で統一するほうが面倒が少ないです。


←前へ次へ→ 機能別Q&A 質問番号順Q&A