Archive for 4月 16th, 2012

  1. Hello, Win32 API(DLL) World!

    Posted on 4月 16th, 2012 by cx20

    Win32 API(DLL)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    Win32 API は DLL として提供されており、ライブラリのリンク方法としては、インポートライブラリを使用した「暗黙的リンク」と LoadLibrary() による「明示的リンク」の2つの方法がある。
    ここでは C言語による LoadLibrary() を用いた DLL の呼出しの例(明示的リンク)を記載する。

    ソースコード

    #include <windows.h>
    #include <tchar.h>
     
    #ifdef UNICODE
        typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCWSTR, LPCWSTR, UINT);
    #else
        typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT);
    #endif
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        HINSTANCE hInstance = LoadLibrary( _T("user32.dll") );
    #ifdef UNICODE
        PROC pfunc = GetProcAddress( hInstance, "MessageBoxW" );
    #else
        PROC pfunc = GetProcAddress( hInstance, "MessageBoxA" );
    #endif
        ((PFNMESSAGEBOX)pfunc)( NULL, _T("Hello, Win32 API(DLL) World!"), _T("Hello, World!"), MB_OK );
     
        return 0;
    }

    Win32 API は内部的に UNICODE 版(例:MessageBoxW)と ANSI 版(例:MessageBoxA)の2つのバージョンをもっており、GetProcAddress() による呼出しの場合は、UNICODE/ANSI どちらの関数であるか指定する必要がある。

    Win32 API のプロトタイプ宣言(参考)

    WINUSERAPI
    int
    WINAPI
    MessageBoxA(
        __in_opt HWND hWnd,
        __in_opt LPCSTR lpText,
        __in_opt LPCSTR lpCaption,
        __in UINT uType);
    WINUSERAPI
    int
    WINAPI
    MessageBoxW(
        __in_opt HWND hWnd,
        __in_opt LPCWSTR lpText,
        __in_opt LPCWSTR lpCaption,
        __in UINT uType);
    #ifdef UNICODE
    #define MessageBox  MessageBoxW
    #else
    #define MessageBox  MessageBoxA
    #endif // !UNICODE

    コンパイル方法(Visual C++ / UNICODE ビルド)

    C:¥> cl hello.c /DUNICODE /D_UNICODE

    上記の「/D」オプションで指定している定義「UNICODE」は Win32 API 用、「_UNICODE」は、C ランタイム用の定義となっている。

    コンパイル方法(Visual C++ / ANSI ビルド)

    C:¥> cl hello.c

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API(DLL) World!
    ---------------------------
    OK   
    ---------------------------