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   
---------------------------

Tags:

Categories: C言語, library, Win32 API

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

WP-SpamFree by Pole Position Marketing