タグ

ブックマーク / yamatyuu.net (2)

  • DLLファイルからLIBファイルを作成する(_stdcall宣言)

    DLLロードの仕方には、静的リンク(暗黙的)と動的リンクがあります。 静的リンクの場合は、LIBファイルが必要となりますが、例えば文字コードの変換を行うMLANG.DLL等は、ヘッダーファイルは存在しますが、なぜかMLANG.LIBは存在しません。 LIBファイルがない場合は、DLLファイルからDEFファイルを作成し、DEFファイルをもとにLIB.EXEによりLIBファイルを作成することができます。 ただし、extern "C" _stdcallで定義されている関数の場合、 DEFファイルのみでLIB.EXEを使用して作成すると32bitの場合コンパイラの名前修飾規則とLIB.EXEの名前検索方法の指定が一致しないためリンクエラーか実行時にエラーが発生します。(Windows 64bitでは__stdcallは無視されるのでLIB.EXEのみで正常なLIBファイルを作成可能) 32bit

    reboot_in
    reboot_in 2020/10/21
    “LIBファイルがない場合は、DLLファイルからDEFファイルを作成し、DEFファイルをもとにLIB.EXEによりLIBファイルを作成することができます。”
  • DLLを静的リンクで呼び出す

    DLLロードの仕方には、静的リンク(暗黙的)と動的リンクがあります。 このページでは静的リンクについて記述します。 リンカーでリンクするときにLIBファイルを指定して関数とDLLファイル名とを関連付けした情報を実行ファイルに埋め込みます。 DLLはプログラム(プロセス)が開始した時点で自動的に読み込まれます。 DLLを呼び出す側は関数のプロトタイプ宣言とLIBファイルの指定(コンパイラオプションでの指定または#pragma)のみで通常の関数の様に使えます。 動的リンク プログラマが明示的にDLLファイルのロード・解放および関数へのエントリーポイントの取得および関数の実行を行います。 動的リンクの場合、プログラムの実行時においてロードするDLLファイルを変えられます。 またDLLを読み込むタイミングはプログラマー任せです。 LIBファイル・ヘッダーファイルのないDLLに使用できます。 コンパ

    reboot_in
    reboot_in 2020/10/16
    “C++では仮想関数がありそれらの区別のため関数名の後ろが引数の型等で修飾されます。 呼び出すためには修飾後の正確な関数名が必要となります。 関数名が修飾されないようにDLL側の関数名に extern "C" を付加します。”
  • 1