Archive for 4月 16th, 2012
-
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 ---------------------------