Tips of VC++ > DLL > モジュール定義ファイル(.DEFファイル)を使ってエクスポート
前へ戻る次へ進む


このドキュメントにはサンプルプログラムが含まれています。
ワークスペース
ソースファイル(テキスト)
モジュール定義ファイル(テキスト)


モジュール定義ファイル(.DEFファイル)を使ってエクスポート

最初に「DLL概要」「エクスポートとインポートとリンク」を 読むと、すんなりと理解できるでしょう。

まず、DEFファイルってのは単なるテキストファイルです。 拡張子をDEFにして、ワークスペースに追加してください。 __declspec(dllexport)を使う場合と違って、 エクスポートするのに特別な宣言は要りません。 DEFファイルをワークスペースに追加するだけでいいです。

さてDEFファイルの書き方ですが、 エクスポートに必要なのは、次の構文ぐらいです。

コメント 行頭にセミコロンを付けます
LIBRARY DLLの内部名を指定します
VERSION DLLの"ImageVersion"をmajor.minorの形で指定できます
DESCRIPTION DLLの目的を指定できます。何を入力してもいいんですけど。
コメントとは違いますよ〜。 .rdata セクションに書き込まれるそうです。なんのこっちゃ(ぉぃ) シングルクォーツかダブルクォーツで囲んでください。
EXPORTS エクスポートしたいシンボルを羅列します。 改行を入れて複数行に渡っちゃってもオッケーです。書式は EXPORTS entryname[=internalname] [@ordinal[NONAME]] [DATA] [PRIVATE]
ordinalは序数です。好きな自然数を指定してもいいのです。 NONAMEはキーワード。 これをつけると名前を使わずに序数だけでエクスポートできます。 ホラ!あれですよ。エクスポート名がN/Aになってるシンボル。

ではサンプルを書いてみます。まず、スケルトン作成♪
[AppWizard]-[Win32 Dynamic-Link Library]-[単純なDLLプロジェクト]
プロジェクト名は"test"でいきます。 こうしてできたソースファイルに適当な関数を追加しといて下さい。 下記の例ではaverageというヘボ関数。(笑

// test.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
//

#include "stdafx.h"

BOOL APIENTRY DllMain(HANDLE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved)
{
    return TRUE;
}

// 出た!ヘボ関数
int average(int n1,int n2)
{
    return (n1+n2)/2;
}

さらに、もう一つワークスペースにファイルを追加します。 テキストファイルを追加して、ファイル名は"test.def"としてください。 ま、なんでもいいんですが。

; test.def

LIBRARY test
DESCRIPTION "モジュール定義ファイル"
VERSION 1.1 ; とりあえず適当に
EXPORTS
    average @100 NONAME

ビルドして完了!
簡単ですね。本来ならインポート用のヘッダーとか、 関数のプロタイプの説明を書いたドキュメントを追加しないといけませんよ〜。 これじゃ、説明書のない電化製品です。(笑

Jun. 29, 2002