////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2005 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2005/07/11(Mon) No.315
    配信数： 1901
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// NEW!!
http://www.kab-studio.biz/index.html

2005/07/11 (Mon)
　ほとはー外伝３にP.26を追加！
[ 三人合体ホットハーブ 外伝３ 【ワタシ の キロク】 ]
http://www.kab-studio.biz/Comic/HotHerbA3/index.html

2005/07/11 (Mon)
　#pragma twice ホームページ版にアーカイブ追加！
12.10 複数のバイナリーデータの読み書き
12.11 パディングとアライメント
[ #pragma twice ]
http://www.kab-studio.biz/Programing/PragmaTwice/index.html


////////////////////////////////////////////////////////////////////
// ちょお普通な日記
http://www.kab-studio.biz/nikki2/index.html

2005/07/03 (Sun)
　明日の分の更新と送信予約、それとカブカテキョ。それ以外はぐだーっ
と。テキスト書きも少し滞ってる……。そして軍用地買います？

2005/07/04 (Mon)
　配送目覚まし。カブカテキョとぷらとわ１話で終わり。夕方に横浜行って
歩いて帰ってきて疲れたり。歩いて帰ったのは失敗だった……。あとDVDの
ダビング。そして結構好き。

2005/07/05 (Tue)
　昨日の夜中はカブカテキョ書き。今日はテキスト書き。午後３時から
歯医者。１時間半も掛かった……。あとは６時台のアニメ観て AIR 観て
のんびり。「今日も夜中はこれ書いて」とか思っちゃう。

2005/07/06 (Wed)
　昨日深夜４時までガンｘソードのウェンディを描いてそれをかぶろぐの
トップイメージに。１０時半に起きて午後はテキスト書き。 JavaA2Z の
単語登録して以上。ひさびさにウイイレを。貯まってるゲームしないと。

2005/07/07 (Thu)
　１０時半に起きて午前中は洗濯。お昼に JavaA2Z 。もうすぐ６００単語。
寝過ぎ。夕方から夜に掛けての作業効率が悪い。洞窟物語を始める。そして
眠いのか眠くないのか。そして昼夜逆転？

2005/07/08 (Fri)
　午前中はテキスト書きとカブカテキョ。フォトショで挿絵を雑に描く。３
時に歯医者。そのあとヨドバシ川崎店へ。水〜金は緊張感切れる。今日で
カブカテキョ始めてから一週間。結構大変。

2005/07/09 (Sat)
　昨日は４時までカブカテキョのテキスト書き。今日は１０時半起きてまた
カブカテキョ。午後はテキスト書き。夜に洞窟物語。バランスのいい生活だ
なぁ。


////////////////////////////////////////////////////////////////////
// かぶろぐ。
http://d.hatena.ne.jp/kab_studio/

2005/07/03 (Sun)
http://d.hatena.ne.jp/kab_studio/20050703
起きたー。
[アニメ]おねがいマイメロディ 第14話「ライバルに勝てたらイイナ！」
[アニメ]ゾイド ジェネシス 第13話「支配」
[アニメ]魔法戦隊マジレンジャー 
　第19話「魔法のランプ〜メーザ・ザザレ〜」
[アニメ]交響詩篇エウレカセブン 第12話「アクペリエンス・１」
[Prog]ぷらとわ追加。
[ほとはー]ほとはー外伝３ P.25
[アニメ]D.C.〜ダ・カーポ〜 セカンドシーズン 第1話
[アニメ]おくさまは女子高生 第1話「みんなにはナイショだけど…」
WPC EXPO 2005

2005/07/04 (Mon)
http://d.hatena.ne.jp/kab_studio/20050704
起きだー！
sakusaku (新)
[アニメ]ぱにぽにだっしゅ 第1話「寒に帷子 土用に布子」
はてなという変な会社
[買]横浜で買ってきたもの。
[Machician]第８話 アイとコイと (16) [△ ▽]

2005/07/05 (Tue)
http://d.hatena.ne.jp/kab_studio/20050705
なんだか起きた。
[アニメ]奥さまは魔法少女 第1話「kissはだめよ、ということ」
[アニメ]ガン×ソード 第1話「タキシードは風に舞う」
これから歯医者。
[病気治療]歯医者
[JavaA2Z]単語追加。
[買][アニメ]テレビ版AIR DVD 第4巻 初回限定版
[Machician]第８話 アイとコイと (17) [△ ▽]

2005/07/06 (Wed)
http://d.hatena.ne.jp/kab_studio/20050706
起きた……。
[版権物イラスト]トップイメージ・ガン×ソード・ウェンディ
[アニメ]攻殻機動隊 S.A.C. 2nd GIG 第14話「機械たちの午後」
[アニメ]かみちゅ！ 第2話「神様お願い」
[JavaA2Z]単語追加。
ローソン、カレーパン頂上対決
[Machician]第８話 アイとコイと (18) [△ ▽]

2005/07/07 (Thu)
http://d.hatena.ne.jp/kab_studio/20050707
起きた。
[アニメ]フルメタル・パニック!The Second Raid 前夜祭
[アニメ]涼風 第1話「期待」
[アニメ]極上生徒会 第14話「極貧生徒会」
[アニメ]タイドライン・ブルー 第1話「浮上する亡霊」
とりあえず洗濯中。
[JavaA2Z]単語追加。
はてなマップベータ版の公開について
[Machician]第８話 アイとコイと (19) [△ ▽]

2005/07/08 (Fri)
http://d.hatena.ne.jp/kab_studio/20050708
起きた。
金が……。
[アニメ]SHUFFLE! 第1話「神にも悪魔にもなれる男」
そろそろ歯医者。
帰ってきた。
[病気治療]歯医者
[買]ヨドバシで買ってきたもの。
[Machician]第８話 アイとコイと (20) [△]

2005/07/09 (Sat)
http://d.hatena.ne.jp/kab_studio/20050709
うはー起きたー。
[買]まんがタイムきらら
[アニメ]ふしぎ星の☆ふたご姫 第15話「月の国☆謎の招待状」
[JavaA2Z]単語追加。


////////////////////////////////////////////////////////////////////
// 風雅、舞い
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第十二章　超越する存在　−２０−

「楽勝楽勝！」
　ソファにふんぞり返る雅樹に、舞は呆れる。
「……ホントに楽勝ね……彼にあっさり勝てるなんて信じられない」
「悪いけど俺、全勝すっから」
　それは、明日の舞との戦いにも勝つ自信があるということ。
「まぁはっきり言って、私勝てる気しないけど」
「張り合いないな」
「正直、今日のリシュネ戦も引き分けみたいなものだったし」
　腕をぐるぐる回して、脱臼がちゃんとはまっていることを確認する。
「お前の回復能力、本当に大丈夫なのか？」
「勉強はしてるんだけどね。回復は手動だから」
　雅樹はＡＰの回復能力は、受精卵が内臓を形作るように、自然に成るも
の。だが、舞の水分操作による回復は、手動操作とも呼べるものだった。
「ただ自動じゃないから自由度は高いと思うよ。アドレナリンのコントロー
ルとかもできるようにするから」
「無茶苦茶だな……将来は医者になる気か？」
「頭悪いから無理」
　即答だった。
「舞」
　リシュネが入ってくる。その腕には、俊雄。
「ちょっと、離してください！」
「どうしたの？　俊雄君抱えて」
「この人、うるさい。ＡＰのことしつこく訊いてくる」
「俊雄君……」
　リシュネが手を離し、俊雄が床に落ちる。
「いたっ」
「私も彼も負けて気が立ってるんだから、うるさくしないで」
「あはは……」
　舞は苦笑いする。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『でも』
　と、シーバリウとジャージの声がハモる。
「……言うと思った」
「あ……」

Machician 第８話 アイとコイと 好評連載中！
[ Machician ]
http://d.hatena.ne.jp/kab_studio/20040823#1093276416
[ Machician＋設定 最新一覧 ]
http://d.hatena.ne.jp/kab_studio/searchdiary?word=*%5BMachician
_______________________________________________________________[KCM]

////////////////////////////////////////////////////////////////////
// JavaA2Z
http://www.kab-studio.biz/Programing/JavaA2Z/index.html

■追加・更新単語

(
)
{
}
[
]
;
,
.
プロジェクト
検索
昇順
降順
安定ソート
リフレクション
Class
[L
アプリケーション


////////////////////////////////////////////////////////////////////
// #pragma twice
http://www.kab-studio.biz/Programing/PragmaTwice/index.html


　Version 15.15
さまざまなエクスポート

「前回は自分で作った DLL の関数を動的に呼び出してみました」
『っていうかあれあり得ない！！　なんであんな変な文字列使うの！？』

    // DLLTestEasy.dll の fnDLLTestEasy() 関数の関数ポインタを取得。
    type_pfnDLLTestEasy pfnDLLTestEasy 
        = (type_pfnDLLTestEasy)GetProcAddress
            ( hInstanceDll, "?fnDLLTestEasy@@YAHXZ" );

『 Version 15.13 ( No.313 ) の時の MessageBox() 呼んだときは』

    // user32.dll の MessageBoxA() 関数の関数ポインタを取得します。
    type_pfnMessageBox pfnMessageBox
        = (type_pfnMessageBox)GetProcAddress
            ( hInstanceDll, "MessageBoxA" );

『って、普通の関数名だったのに』
「実は、これは関数のエクスポートの仕方が異なるからなんです」
『エクスポートっていくつもあるの？』
「大まかに分けてふたつの方法があるんです」

・__declspec(dllexport)を使用する
・.defファイルを使用する

『上のが Version 15.10 ( No.310 ) とかでやった方法だよね。でも下のは
教わってない……ってことは』
「そう、下の方法でエクスポートすれば、普通の関数名になるんです」
『それやってみよ、それ！』
「というわけでしてみましょう。使うのは DLLTestEasy プロジェクト。ま
ずはソースファイルの修正から」

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

// 略

// これはエクスポートされた関数の例です。
int fnDLLTestEasy(void)
{
    OutputDebugString( "fnDLLTestEasy()\n" );
    return 42;
}

// 略

『どこが違うの？』
「前はこうしてました」

DLLTESTEASY_API int fnDLLTestEasy(void)

『あ、 DLLTESTEASY_API を取ったんだ』
「このマクロが __declspec(dllexport) に置き換わってエクスポートして
いたからね。同様にヘッダーファイルも修正します」

// DLLTestEasy.h

// 略

int fnDLLTestEasy(void);

『ヘッダーファイルの方も取っちゃうわけね』
「これで __declspec(dllexport) によるエクスポートがされなくなりまし
た。代わりに .def ファイルでエクスポートします。まずメニューの
【ファイル】-【新規作成】で【ファイル】のページを開いて」
『ほい』
「【テキスト ファイル】を選択して、ファイル名を〈DLLTestEasy.def〉に
してOK押して」
『ほい。ファイル作られて、開いたよ』
「そこに、次のように書いてください」

; DLLTestEasy.def

LIBRARY      "DLLTestEasy"

EXPORTS
    fnDLLTestEasy @1

『……なんか、今まで見てきた感じと全然違う……』
「ファイルの形式が全然違うからね。この拡張子が def のファイルは
【モジュール定義ファイル】といって、エクスポートする関数を指定するた
めのファイルです」
『こんなものがあったんだ……』
「実際、 Visual C++ に限らず、プログラミングには様々なツールがあっ
て、そのツールごとにファイル形式が違うから」
『全部憶えろと？』
「っていうのは無理だから、ある程度のものだけ憶えて、それをなんとなく
使い回せる、っていうのがいいかな」
『それはそれで難しそうね……で、このファイルの説明』
「まず、【;】があったら、その行の;以降はコメントになります」
『 // と同じってことだよね』
「そういうこと。次に【LIBRARY】。これは DLL ファイルの指定。ただ、拡
張子はつけません」
『 DLL のファイル名が DLLTestEasy.dll だから "DLLTestEasy" ね』
「最後に【EXPORTS】。このあとの行で、エクスポートする関数の指定をしま
す。構文はこう」

    関数名 @序数

『じょすう？』
「ようするに関数に付ける番号。エクスポートする関数に番号をつけるんで
す。複数の関数をエクスポートする時には当然それぞれ別の数字を付けま
す」
『質問！』
「はい火美ちゃん」
『関数増えたら大変じゃない？』
「大変です。エクスポートする関数全部こうやって指定しなきゃいけないか
ら、関数が多い場合や、プログラムを作ってる途中で関数の増減が激しい場
合には向いていません」
『ならなんでこんな方法必要なの！？』
「だって動的にリンクするときには関数名が」
『あ……』
「そう、実際の所、普通に呼び出すのであれば __declspec(dllexport) が
最適な方法なんです。 __declspec(dllexport) なら関数の前に付けるだけ
だから」
『確かに……』
「ただ、 __declspec(dllexport) の方法だとエクスポートされる関数名、
正式には【装飾名】って言うんだけど、その装飾名が複雑な文字列になりま
す」
『ってことは、このモジュール定義ファイル使うと普通の文字列になるん
だ』
「うん、これでOKだからリビルドしてみて」
『ほい』
「完成した DLLTestEasy.dll を BuildTest.exe と同じフォルダにコピー」
『前のが残ってるから上書きコピーね』
「で、呼び出す側、 BuildTest.cpp の修正」

// Main.cpp
#include <Windows.h>

// 略
    
    // DLLTestEasy.dll の fnDLLTestEasy() 関数の関数ポインタを取得。
    type_pfnDLLTestEasy pfnDLLTestEasy 
        = (type_pfnDLLTestEasy)GetProcAddress
            ( hInstanceDll, "fnDLLTestEasy" );    // ←この関数名。

// 略

「一箇所、 GetProcAddress() で指定する関数名」

    // DLLTestEasy.dll の fnDLLTestEasy() 関数の関数ポインタを取得。
    type_pfnDLLTestEasy pfnDLLTestEasy 
        = (type_pfnDLLTestEasy)GetProcAddress
            ( hInstanceDll, "fnDLLTestEasy" );    // ←この関数名。

『お、関数名がへんてこじゃなくなった。ビルドして実行！　うん、
〈fnDLLTestEasy()〉って出た』
「このように、モジュール定義ファイルを使えば、エクスポート時の装飾名
がきれいになります」
『質問！　じゃあなんで __declspec(dllexport) はへんてこなの？』
「装飾名を見比べてみようか」

・__declspec(dllexport)  : ?fnDLLTestEasy@@YAHXZ
・モジュール定義ファイル : fnDLLTestEasy

『一番大きいのは @@YAHXZ って謎なのだよね』
「そう、そこが一番重要な点。そもそもの問題点として、関数は、関数名だ
け分かっていればいい、というわけじゃないというところ」
『？？？』
「つまり、 "fnDLLTestEasy" っていう関数名だけじゃ、情報量が足りない
んです。ほら、同じ関数名だけど引数が違う関数を作ることができるで
しょ」
『あ、オーバーロード！！』
「そう、 Version 11.19 ( No.219 ) でやったでしょ。引数さえ違えば、同
名の関数をたくさん作ることができるんです」
「そっか……関数のオーバーロードをして、同じ名前の関数がいっぱいあっ
たら、 "fnDLLTestEasy" って名前だけじゃどの関数かわからない……」
「実際にそれを試してみます。 DLLTestEasy.cpp に次の関数を追加して」

int fnDLLTestEasy(int i)
{
    OutputDebugString( "fnDLLTestEasy()\n" );
    return 42;
}

『あ！　関数名同じ、でも引数が違う』
「これをビルドすると、こんなリンクエラーが発生します」

\DLLTestEasy.def : 
　warning LNK4022: シンボル "fnDLLTestEasy" の unique match が
　見つかりません
.\DLLTestEasy.def : 
　warning LNK4002: "int __cdecl fnDLLTestEasy(int)" 
　(?fnDLLTestEasy@@YAHH@Z) は .\Debug\DLLTestEasy.obj 
　で定義されています
.\DLLTestEasy.def : 
　warning LNK4002: "int __cdecl fnDLLTestEasy(void)" 
　(?fnDLLTestEasy@@YAHXZ) は .\Debug\DLLTestEasy.obj 
　で定義されています
LINK : 
　fatal error LNK1152: 
　1 つ以上の装飾されていないシンボルを解決できません。
LINK : 
　fatal error LNK1141: 
　エクスポート ファイルのビルド中に障害が起こりました。

『うわ出まくり。あ、なんか重複してるっぽいね』
「このように、モジュール定義ファイルでは関数のオーバーロードに対応で
きません」
『でも __declspec(dllexport) ならできる、と』
「実際、 "?fnDLLTestEasy@@YAHXZ" の最後の "YAHXZ" の箇所は、引数の型
や数を示してるんです」
『これが！？』
「だから __declspec(dllexport) の方が一般的なんです」

/*
    Preview Next Story!
*/
『私は定義ファイルの方が好きだなー』
「装飾名がきれいだから？」
『そ。つかあの変な文字列嫌い！』
「でも __declspec(dllexport) の方が一般的かな？」
『そなの？』
「というわけで次回」
＜ Version 15.16 クラスをエクスポートする！ ＞
『につづく！』
「実はクラスのエクスポートは __declspec(dllexport) が基本」
『げげげ』


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/index.html
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2005 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

