プログラミング系のネタをまとめていきます。

リンクの種類

関連ファイル使い方
静的リンク*.obj, *.lib普通に実行ファイルにリンクする。
DLL(暗黙的なリンク)*.lib, *.dlldll関数は __declspec(dllimport) でプロトタイプ宣言する。
リンク時に *.libが必要。
DLL(明示的なリンク)*.dll*.lib不要。
LoadLiblary, GetProcAddress, FreeLibrary を使う。

サンプルソース


こちらのサイトからコピペしてます。
短くてわかりやすかったので…
http://exlight.net/devel/windows/dll/windll.html
DLL側
sub.c
#include <stdio.h>

__declspec(dllexport) int sub(int arg)
{
    printf("sub %d\n", arg);
    return arg + 1;
}
暗黙的なリンク
main_static.c
#include <stdio.h>

__declspec(dllimport) int sub(int);

int main(void)
{
    printf("main %d\n", sub(1));
    return 0;
}
明示的なリンク
main_dynamic.c
#include <stdio.h>
#include <windows.h>

int main(void)
{
    HINSTANCE hDLL;
    int (*func)(int);
    if ((hDLL = LoadLibrary("sub.dll")) == NULL)
        printf("LoadLibrary is failed.\n");
    else {
        if ((func = (int (*)(int))GetProcAddress(hDLL, "sub")) == NULL)
            printf("GetProcAddress is failed.\n");
        else
            printf("main %d\n", func(1));
        FreeLibrary(hDLL);
    }
    return 0;
}

参考サイト


MSDNリファレンス : DLL(Dynamic Link Library)
http://msdn.microsoft.com/ja-jp/library/cc429019.a...

MSDN DLL
http://msdn.microsoft.com/ja-jp/library/1ez7dh12(v...

KAB-studio > プログラミング > Codian > DLLを使おう!!
http://www.kab-studio.biz/Programing/Codian/DLL_Ho...
順に読んでいくと分かりやすいと思います。
フックの話題もあります。

トピック

DllMain, DllEntryPoint


WinMain()のDLL版。

DLLのエントリーポイント。
環境に寄って、DllMain, DllEntryPoint のどちらかが使われることが多い。

DLLの初期化や終了処理の手段?

ちょっと実験してみた。

bool WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpReserved)
{
	printf("DllMain\n");
	return 1;
}
DllMainはアプリの起動時(DLL読み込み時)、アプリの終了時(DLL解放時)に呼ばれていた。

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
	printf("DllEntryPoint\n");
	return 1;
}
DllEntryPointは、一度も呼ばれなかった。
何か設定が必要?

呼出規約:cdecl, stdcall, fastcall


アセンブラレベルで違いがあるとのこと。
呼出規約動作備考
stdcall呼び出した先でスタックポインタ(ESP)を戻してもらう。(RET時に戻す)関数呼び出しで、cddeclよりサイズが小さい
DLL等で使う(WINAPI)
cdecl呼び出し元でESPをクリーンアップする。RETはリターンするだけ。
fastcall引数は利用可能な数だけレジスタを使う。
参考サイト

WeBlog of Sky color
http://pinako.blog33.fc2.com/blog-entry-83.html

prasinos' work memo
http://prasinos.blog2.fc2.com/blog-entry-627.html


プラグイン作成と併せて説明されています
http://blackscarecrow.sakura.ne.jp/junk/C&C++/PP01...

名前修飾


ビルド後のマップファイルを眺めて、関数名が加工されているのをよく見かけた。
コンパイラごとに規則があって(当然か…)、名前修飾というのが行われた結果らしい。

下の参考サイトから抜き出し…

●C++
関数名void h(int)void h(int, char)void h(void)
装飾名?h@@YAXH@Z?h@@YAXHD@Z?h@@YAXXZ

●C (extern "C"とか)
関数名void h(int)void h(int, char)void h(void)
装飾名(cdecl)_h_h_h
装飾名(stdcall)_h@4_h@5_h@0
装飾名(fastcall)@h@4@h@5@h@0

http://blackscarecrow.sakura.ne.jp/junk/C&C++/PP01...

Wikipedia
http://ja.wikipedia.org/wiki/%E5%90%8D%E5%89%8D%E4...
タグ

Menu

メインコンテンツ

プログラミング

機器

Macツール

各種情報

Wiki内検索

おまかせリンク

Androidアプリ

AdSense

技術書


管理人/副管理人のみ編集できます