13,040
回編集
編集の要約なし |
|||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
MFC DLLには、以下の2つの種類がある。<br> | |||
* 拡張DLL | |||
*: DLLを使用するEXEやDLLもMFCで作成する時にのみ使用する。 | |||
* MFCの共有DLL(Regular DLL) | |||
*: 内部的にMFCそのものを持っているため、DLLを使用するEXEやDLLをMFCで作成しない時でも使用できる。 | |||
<br><br> | <br><br> | ||
== DLLの作成方法 | == DLLの作成方法 == | ||
==== defファイルを使用する ==== | |||
defファイルを作成する方法を記載する。<br> | defファイルを作成する方法を記載する。<br> | ||
<br> | <br> | ||
| 18行目: | 21行目: | ||
<br> | <br> | ||
<u>※注意</u><br> | <u>※注意</u><br> | ||
<u>C# | <u>C#にて作成したモジュール(EXEまたはDLL)からC++ DLLを呼び出す場合、C++ DLLではdefファイルを使用すること。</u><br> | ||
<br> | <br> | ||
defファイルを作成して、以下のようにエクスポートする関数を記載する。<br> | |||
'''※但し、"@1"等の序数値は記載しなくてもよい'''。<br> | '''※但し、"@1"等の序数値は記載しなくてもよい'''。<br> | ||
<source lang="c++"> | <source lang="c++"> | ||
| 65行目: | 68行目: | ||
} | } | ||
</source> | </source> | ||
<br> | |||
==== defファイルを使用しない ==== | |||
== | |||
defファイルを作成しない方法を記載する。<br> | defファイルを作成しない方法を記載する。<br> | ||
<br> | <br> | ||
| 126行目: | 128行目: | ||
<br><br> | <br><br> | ||
== Visual | == 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]] | ||