「ライブラリの基礎 - DLLの作成(C/C++/MFC)」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
1行目: 1行目:
== 概要 ==
== 概要 ==
MFCを使ったDLLには、以下の2つの種類がある。<br>
MFC DLLには、以下の2つの種類がある。<br>
# 1つ目は"拡張DLL"で、DLLを使用するEXEやDLLもMFCで作成する時にのみ使うことができる。
* 拡張DLL
# 2つ目は"MFCの共有DLLを使用"(Regular DLL)で、これは内部的にMFCそのものを持っているため、DLLを使用するEXEやDLLをMFCで作成しなくても使用できる。
*: DLLを使用するEXEやDLLもMFCで作成する時にのみ使用する。
* MFCの共有DLL(Regular DLL)
*: 内部的にMFCそのものを持っているため、DLLを使用するEXEやDLLをMFCで作成しない時でも使用できる。
<br><br>
<br><br>


== DLLの作成方法(defファイルを作成する) ==
== DLLの作成方法 ==
==== defファイルを使用する ====
defファイルを作成する方法を記載する。<br>
defファイルを作成する方法を記載する。<br>
<br>
<br>
18行目: 21行目:
<br>
<br>
<u>※注意</u><br>
<u>※注意</u><br>
<u>C#で作成したモジュール(EXEまたはDLL)からMFC DLLを呼び出す場合、MFC DLLではdefファイルを使用すること。</u><br>
<u>C#にて作成したモジュール(EXEまたはDLL)からC++ DLLを呼び出す場合、C++ DLLではdefファイルを使用すること。</u><br>
<br>
<br>
defファイルを作成して、以下のようにエクスポートしたい関数を記載する。<br>
defファイルを作成して、以下のようにエクスポートする関数を記載する。<br>
'''※但し、"@1"等の序数値は記載しなくてもよい'''。<br>
'''※但し、"@1"等の序数値は記載しなくてもよい'''。<br>
  <source lang="c++">
  <source lang="c++">
65行目: 68行目:
  }
  }
  </source>
  </source>
<br><br>
<br>
 
==== defファイルを使用しない ====
== DLLの作成方法(defファイルを作成しない方法) ==
defファイルを作成しない方法を記載する。<br>
defファイルを作成しない方法を記載する。<br>
<br>
<br>
126行目: 128行目:
<br><br>
<br><br>


== Visual StudioでDLLを暗黙的リンクする方法 ==
== DLLの使用 ==
Visual StudioでDLLを作成している場合、プロジェクトから参照に追加することで使用できる。<br>
他のIDE等でDLLを作成している場合、共有ライブラリとして使用するには、コンパイル時に以下の3つが必要となる。<br>
* ヘッダーファイル (.h)
* インポートライブラリ (.lib)
* DLL
<br>
また、外部から呼び出せる関数が存在しない場合、インポートライブラリ(.lib)は作成されない。<br>
<br><br>
 
== インポートライブラリの作成 ==
インポートライブラリ(.lib)が提供されていない場合、DLLファイルから作成できる。<br>
<br>
まず、dumpbinを実行して、エクスポートされた全ての定義をファイルに出力する。<br>
dumpbin /exports target.dll > exports.txt
<br>
1行目にLIBRARY DLL名、2行目にEXPORTSを記述をしたDEFファイルを作成する。<br>
echo LIBRARY <Dllファイル名> > target.def
echo EXPORTS >> target.def
<br>
DEFファイルに、最初に出力したファイルから関数の定義部分だけを追記する。<br>
for /f "skip=19 tokens=4" %A in (exports.txt) do echo %A >> target.def
<br>
libコマンドを実行して、DEFファイルからインポートライブラリを作成する。<br>
# 32bitを対象とする場合
lib /def:target.def /out:target.lib /machine:x86
# 64bitを対象とする場合
lib /def:target.def /out:target.lib /machine:x64
<br>
インポートライブラリを参照するには、リンカーのオプションにて、[追加の依存ファイル]で指定する。<br>
これは、/DYNAMICBASEオプションを指定することと同じことである。<br>
または、ソースコード内において、#pragmaディレクティブで指定する。<br>
<br><br>
 
== DLLの暗黙的リンク ==
EXEファイルのプロジェクトに、DLLファイルを暗黙的リンクする方法を記載する。<br>
EXEファイルのプロジェクトに、DLLファイルを暗黙的リンクする方法を記載する。<br>
例として、CppEXE.exeとCppDLL.dllが存在するものとして設定している。<br>
例として、CppEXE.exeとCppDLL.dllが存在するものとして設定している。<br>
155行目: 192行目:
|}
|}
</center>
</center>
<br><br>
== dumpbin ==
DLLファイルのエクスポートされた関数名は、dumpbinで確認することができる。<br>
<br>
PowerShellまたはコマンドプロンプトを起動して、以下のコマンドを実行する。<br>
この時、name項目に関数名が表示される。<br>
dumpbin.exe /EXPORTS <DLLファイル名>
# 出力
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.
Dump of file <DLLファイル名>
File Type: DLL
Section contains the following exports for sample.dll
    00000000 characteristics
    49A74D91 time date stamp Fri Feb 27 01:18:57 2009
        0.00 version
          1 ordinal base
          1 number of functions
          1 number of names
    ordinal hint RVA      name
          1    0 00001034 FunctionName
  Summary
        1000 .data
        1000 .pdata
        1000 .rdata
        1000 .reloc
        1000 .text
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]]
[[カテゴリ:C]][[カテゴリ:C++]][[カテゴリ:MFC]]

案内メニュー