Win32 APIプログラミング

Windowsのバージョン情報を取得する

Win16 API GetVersion または Win32 API GetVersionEx でWindowsのバージョン情報を取得することができる。

Windowsのバージョンメジャーバージョン番号マイナーバージョン番号
Windows 3.131
Windows NT 3.535
Windows 9540
Windows NT 4.040
Windows 9841
Windows 98 SE (Second Edition)41
Windows Me (Millennium Edition)49
Windows 200050
32ビット版 Windows XP 各エディション51
Windows Server 200352
Windows XP x64 Edition52
Windows Vista60
Windows Server 200860
Windows 7 (予定)61

GetVersion (Win16)

WindowsとMS-DOSのオペレーションシステムの現在のバージョン番号を取得する。

DWORD GetVersion (void);
戻り値

アプリケーションのバージョン情報を取得する

バージョン情報をメモリ上のプロセスから直接取得することはできません。アプリケーションのバージョン情報を取得するには,モジュールのファイルに含まれるリソースから取得します。この手順について,以下に示します。

  1. Windows API GetModuleFileNameを用いて,モジュールハンドルからモジュールのファイル名を取得する。
  2. Windows API GetFileVersionInfoSizeを用いて,ファイルからバージョン情報リソース を取得できるか判定する。
  3. Windows API GetFileVersionInfoを用いて,ファイルに関するバージョン情報リソースを取得する。
  4. Windows API VerQueryValueを用いて,バージョン情報リソースから選択したバージョン情報を取得する。

ドラッグ&ドロップ

ファイルのドロップの許可

アプリケーションでファイルのドロップを行えるようにするには,あらかじめファイルのドロップの受け入れ許可をしておきます。これは,Windows API の DragAcceptFiles にて行います。

アプリケーションに対してファイルのドラッグ&ドロップを行うと,ウィンドウメッセージWM_DROPFILESが通知されます。このときのwParamの値はドロップ構造体のハンドルです。

hDrop = (HANDLE)wParam;

ドロップされたファイル名の取得

ドロップされたファイルのパス名を取得するには Windows API DragQueryFileを用います。その引数として,ドロップ構造体のハンドル(ウィンドウメッセージWM_DROPFILES通知時のwParamの値)を必要とします。

ドロップされた位置の取得

ドロップされた位置を取得するには,Windows API DragQueryPointを用います。その引数として,ドロップ構造体のハンドル(ウィンドウメッセージWM_DROPFILES通知時のwParamの値)を必要とします。

ファイル名転送用のバッファ解放

ドロップされたファイルのファイル名転送用のバッファを解放するには,Windows API DragFinishを用います。その引数として,ドロップ構造体のハンドル(ウィンドウメッセージWM_DROPFILES通知時のwParamの値)を必要とします。

WM_DROPFILESクラッカー

WINDOWSX.Hで定義されているWM_DROPFILESクラッカーに関する定義を以下に示します。

関数のプロトタイプ
void Cls_OnDropFiles(HWND hwnd, HDROP hdrop);

HANDLE_WM_*マクロ

#define HANDLE_WM_DROPFILES(hwnd, wParam, lParam, fn) \
	     ((fn)((hwnd), (HDROP)(wParam)), 0L)
メッセージ転送マクロ
#define FORWARD_WM_DROPFILES(hwnd, hdrop, fn) \
     (void)(fn)((hwnd), WM_DROPFILES, (WPARAM)(HDROP)(hdrop), 0L)

.iniファイル(初期化ファイル)の値の読み書き

[section]
key=value
key=value
[section]
key=value
DWORD GetPrivateProfileString(
    LPCTSTR lpAppName,
    LPCTSTR lpKeyName,
    LPCTSTR lpDefault,
    LPTSTR  lpReturnedString,
    DWORD   nSize,
    LPCTSTR lpFileName
);
lpAppName
セクションの名前
lpKeyName
キーの名前
lpDefault
デフォルト値。指定したキーが見つからなかったら、この値がlpReturnedStringに格納される。
lpReturnedString
指定したキーに対応する文字列を格納する領域
nSize
lpReturnedStringバッファのサイズ
lpFileName
初期化ファイルのファイル名

戻り値

バッファに格納された文字数

UINT GetPrivateProfileInt(
    LPCTSTR lpAppName,
    LPCTSTR lpKeyName,
    INT     nDefault,
    LPCTSTR lpFileName
);
lpAppName
セクションの名前
lpKeyName
キーの名前
nDefault
デフォルト値。指定したキーが見つからなかったら、この値が戻り値に返る。
lpFileName
初期化ファイルのファイル名

戻り値

指定したキーに対応する値

BOOL WritePrivateProfileString(
    LPCTSTR lpAppName,
    LPCTSTR lpKeyName,
    LPCTSTR lpString,
    LPCTSTR lpFileName
);
lpAppName
セクションの名前
lpKeyName
キーの名前
lpString
指定したキーに設定する値
lpFileName
初期化ファイルのファイル名

戻り値

成功したら0以外、失敗したら0が返る。失敗した場合、GetLastErrorで情報を得ることができる。

共有セクション

16ビットWindowsでは,DLLは自分のデータセグメントを持っています。 このデータセグメントは,DLLが必要とするすべての静的変数,グローバル変数とDLL自身のプライベートローカルヒープを収めています。DLL関数を呼び出したプロセスがどれであっても,DLLは自分のローカルヒープを使えるため,DLLローカルヒープは複数のプロセス間でのデータ共有を簡単に実現するための手段として利用できました。

しかし,Win32のDLLには,ローカルヒープが与えられません。また,DLLによって割り当てられたグローバル変数,静的変数もDLLの複数のマッピングの間では共有されません。このため,DLLの複数インスタンス間で共有するデータは,共有セクションに配置します。

Sharedという新しい独自セクションを作成して、初期化済みデータ変数をこのセクションに配置する例を次に示します。

#pragma data_seg("Shared")
TCHAR gszSystemDir[SIZE_WORK_BUF] = "";
#pragma data_seg()

そして,リンカに対して,変数を共有するセクション名をリンカのオプションスイッチで指定します。

/SECTION:<名前>,<属性>

/SECTIONのあと,:で区切って属性を変更するセクションの名前を指定します。属性として指定できるのはR(Read),W(Write),S(Shared),E(Execute)であり,複数指定できます。

Sharedセクションを読み書き可能な共有セクションとして指定する例を次に示します。

/SECTION:Shared,RWS

フォルダ内のファイルを検索する

Visual C/C++でフォルダ内のファイルを検索するには、3通りの方法がある。

  1. C言語のランタイム関数(_findfirst, _findnext, _findclose)を使う。
  2. Win32 API(FindFirstFile, FindNextFile, FindClose)を使う。
  3. MFC(CFileFind)を使う。

ライブラリ

Windowsの.libファイルには、静的ライブラリとインポートライブラリの2種類の形式がある。静的ライブラリは、必要に応じて取り込まれるコードが入っていて、Unixにおける.aファイルに似ている。インポートライブラリは、特定の識別子が不正ではなく、DLLがロードされた時点で存在することを保証するためだけに使われる。

Win32 API リファレンス

API説明
GetTickCountWindows起動からの経過時間をミリ秒単位で取得

DragAcceptFiles

以下に関数インタフェースをWin32 SDK関数リファレンスから引用します。

The DragAcceptFiles function registers whether a window accepts dropped files.

VOID DragAcceptFiles(
    HWND hWnd,   // handle to the registering window
    BOOL fAccept // acceptance option
);

Parameters

hWnd
Identifies the window registering whether it accepts dropped files.
fAccept
Specifies whether the window identified by the hWnd parameter accepts dropped files. This value is TRUE to accept dropped files; it is FALSE to discontinue accepting dropped files.

Return Value

This function does not return a value.

Remarks

An application that calls DragAcceptFiles with the fAccept parameter set to TRUE has identified itself as able to process the WM_DROPFILES message from File Manager.

DragFinish

以下に関数インタフェースをWin32 SDK関数リファレンスから引用します。

The DragFinish function releases memory that Windows allocated for use in transferring filenames to the application.

VOID DragFinish(
    HDROP hDrop    // handle to memory to free
);

Parameter

hDrop
Identifies the structure describing dropped files. This handle is retrieved from the wParam parameter of the WM_DROPFILES message.

Return Value

This function does not return a value.

DragQueryFile

以下に関数インタフェースをWin32 SDK関数リファレンスから引用します。

The DragQueryFile function retrieves the filenames of dropped files.

UINT DragQueryFile(
    HDROP hDrop,     // handle to structure for dropped files
    UINT iFile,      // index of file to query
    LPTSTR lpszFile, // buffer for returned filename
    UINT cch         // size of buffer for filename
);

Parameters

hDrop
Identifies the structure containing the filenames of the dropped files.
iFile
Specifies the index of the file to query. If the value of the iFile parameter is 0xFFFFFFFF, DragQueryFile returns a count of the files dropped. If the value of the iFile parameter is between zero and the total number of files dropped, DragQueryFile copies the filename with the corresponding value to the buffer pointed to by the lpszFile parameter.
lpszFile
Points to a buffer to receive the filename of a dropped file when the function returns. This filename is a null-terminated string. If this parameter is NULL, DragQueryFile returns the required size, in characters, of the buffer.
cch
Specifies the size, in characters, of the lpszFile buffer.

Return Value

When the function copies a filename to the buffer, the return value is a count of the characters copied, not including the terminating null character.

If the index value is 0xFFFFFFFF, the return value is a count of the dropped files.

If the index value is between zero and the total number of dropped files and the lpszFile buffer address is NULL, the return value is the required size, in characters, of the buffer, not including the terminating null character.

DragQueryPoint

以下に関数インタフェースをWin32 SDK関数リファレンスから引用します。

The DragQueryPoint function retrieves the position of the mouse pointer at the time a file was dropped.

BOOL DragQueryPoint(
    HDROP hDrop,    // handle to structure for dropped file
    LPPOINT lppt    // pointer to structure for mouse coordinates
);

Parameters

hDrop
Identifies the structure describing the dropped file.
lppt
Points to a POINT structure that the function fills with the coordinates of the mouse pointer at the time the file was dropped.

Return Value

If the drop occurred in the client area of the window, the return value is TRUE; otherwise, it is FALSE.

The DragQueryPoint function fills the POINT structure with the coordinates of the mouse pointer at the time the user released the left mouse button. The window for which coordinates are returned is the window that received the WM_DROPFILES message.

POINT構造体の内容を以下に示します。

The POINT structure defines the x- and y- coordinates of a point.
typedef struct tagPOINT { // pt
    LONG x;
    LONG y;
} POINT;

Members

x
Specifies the x-coordinate of the point.
y
Specifies the y-coordinate of the point.

GetFileVersionInfo

ファイルバージョン情報の取得。

BOOL GetFileVersionInfo(LPTSTR pFileName, DWORD dwHandle, DWORD dwLen, LPVOID lpData);
パラメータ
pFileName
ファイル名が格納されている領域を指すポインタを指定する。
dwHandle
ファイルバージョン情報を識別する。このパラメータには,GetFileVersionInfoSize関数が返すハンドルを指定するか,NULLを指定する。dwHandleパラメータがNULLのときは,GetFileVersionInfo関数がファイル中のバージョン情報を検索する。
dwLen
lpDataパラメータにより識別されるバッファのサイズをバイト単位で指定する。GetFileVersionInfoSize関数は,ファイルバージョン情報の保持に必要なバッファサイズを返す。バッファが小さすぎるときは,ファイルバージョン情報の大きさがバッファのサイズまで切りつめられる。
lpData
ファイルバージョン情報を受け取る領域を指すポインタを指定する。このパラメータは,後のVerQueryValue関数呼び出しのときに使われる。
戻り値

関数が正常に終了した場合は,0以外の値を返す。それ以外の場合は0を返し,ファイルが存在しないか,またはdwHandleパラメータが無効であることを示す。

GetFileVersionInfoSize

バージョン情報を取得できるか判定する。

DWORD GetFileVersionInfoSize(LPTSTR pFileName, LPDWORD lpdwHandle);
パラメータ
pFileName
ファイル名が格納されている領域をを指すポインタを指定する。
lpdwHandle
32ビット値を指すポインタ。GetFileVersionInfoSizeを実行することにより,このパラメータにはファイルバージョン情報を識別するハンドルが格納される。このハンドルはGetFileVersionInfo関数で使われる。
戻り値

関数が正常に終了した場合は,バージョン情報の保持に必要なバッファサイズをバイト単位で返す。ファイルやバージョン情報が見付からなかった場合,またはMS-DOSエラーが発生した場合は,NULLを返す。

GetModuleFileName

モジュールがロードされる実行可能ファイルの完全パスとファイル名を取得する。

DWORD GetModuleFileName(HMODULE hModule, LPTSTR pFileName, DWORD dwSize);
パラメータの説明
hModule
モジュールハンドルを指定する。
pFileName
ファイル名を受け取る領域を指すポインタを指定する。
dwSize
コピーするバイトの最大数値を,終端のNULLも含めて指定する。dwSizeよりも長いファイル名は切り捨てられる。
戻り値

関数が正常に終了した場合,戻り値は指定されたバッファにコピーされた文字列の長さをバイト単位で示す。それ以外の場合,0を返す。

GetVersionEx

現在実行中のオペレーティングシステムのバージョンに関する拡張情報を取得する。

BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation);

パラメータの説明

lpVersionInformation
OSVERSIONINFO構造体へのポインタを指定する。
戻り値

成功したらTRUE、失敗したら FALSEを返す。

OSVERSIONINFO構造体

構造

typedef struct _OSVERSIONINFO{
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    TCHAR szCSDVersion[128];
} OSVERSIONINFO;

メンバの説明

dwOSVersionInfoSize
GetVersionEx関数を呼び出す前に,sizeof(OSVERSIONINFO)をセットしておかなければならない。
dwMajorVersion
ホストシステムのメジャーバージョン番号。
dwMinorVersion
ホストシステムのマイナーバージョン番号。
dwBuildNumber
カレントシステムのビルド番号。
dwPlatformId
カレントシステムがサポートするプラットフォームを識別する。
意味
VER_PLATFORM_WIN32sWindows 3.1上で動作するWin32s
VER_PLATFORM_WIN32_WINDOWSWindows 95上のWin32
VER_PLATFORM_WIN32_NTWindows NT
szCSDVersion
インストールされているオペレーティングシステムについての詳細な情報を提供するテキスト。

VerQueryValue

バージョン情報値の問い合わせを行う。

BOOL VerQueryValue(const LPVOID pBlock, LPTSTR lpSubBlock, LPVIOD *lplpBuffer, PUINT puLen);
パラメータの説明
pBlock
バッファを指すポインタ。バッファには,GetFileVersionInfoが返すバージョン情報リソースを指定する。
lpSubBlock

取得するバージョン情報の値を指定する,0で終わる文字列を指すポインタ。文字列には円記号(\)で区切られた名前と,次の形式のいずれかを指定できる。

形式説明
\ルートブロックを指定する。関数は,バージョン情報リソース用のVS_FIXEDFILEINFO構造体を指すポインタを取得する。
\VarFileInfo\Translation変数情報ブロック内の変換表を指定する。関数は,言語識別子および文字セット識別子の配列を指すポインタを取得する。アプリケーションはこれらの識別子を利用して,バージョン情報リソースの中に言語固有ブロックの名前を作成します。
\StringFileInfo\lang-charset\string-name言語固有ブロック内の値を指定する。lang-charsetの名前は,バージョンリソースの変換表にある言語および文字セットの識別子のペアである。lang-charsetの名前は16進の文字列で指定しなければならない。string-nameの名前は,後述の備考で説明する定義済み文字列の中のいずれかになる。

lpSubBlockパラメータのstring-nameは,次の定義済み名前のいずれかになる。

名前適用条件
Comments診断表示などのために使用する追加情報を指定する。省略可能
CompanyNameファイルを制作・販売する会社名を指定する。必須
FileDescriptionユーザへのプレゼンテーションのためのファイル記述を指定する。必須
FileVersionファイルのバージョン番号を指定する。必須
InternalNameファイルの内部名を指定する。必須
LegalCopyrightファイルに対して適用される全著作権通知書を指定する。省略可能
LegalTrademarksファイルに対して適用される商標または登録商標を指定する。省略可能
OriginalFileNameパスを含まないファイルのオリジナル名を指定する。必須
PrivateBuildファイルのプライベートバージョンに関する情報を指定する。この文字列はルートブロックのVS_FIXEDFILEINFO構造体のメンバdwFileFlagsにあるVS_FF_PRIVATEBUILDフラグがセットされたときだけ必要である。左記参照
ProductName配布するファイルの製品名を指定する。必須
ProductVersion配布するファイルのバージョンを指定する。必須
SpecialBuild標準のバージョンと、このファイルのバージョンとの差異を指定する。 この文字列はルートブロックのVS_FIXEDFILEINFO構造体のメンバdwFileFlagsにあるVS_FF_SPECIALBUILDフラグがセットされたときだけ必要である。左記参照
lplpBuffer
バッファを指すポインタ。バッファには,バージョン情報値を指すポインタが格納される。
puLen
バッファを指すポインタ。バッファには,バージョン情報値の長さがバイト単位で格納される。
戻り値

指定されたブロックが存在してバージョン情報が利用できる場合は,0以外の値を返す。puLenが0の場合は,指定されたバージョン情報名に対する値を使用することができない。指定された名前が存在しない場合またはpBlockが指すリソースが無効の場合には0返す。

.NETプログラミング

マネージドC

マネージドCプログラムを記述する場合、特別な手続きは必要ない。

#include <stdio.h>

void main()
{
    printf("Hello world!");
}

ただし、C言語の標準ライブラリはマネージド・コードではない。したがって、C言語プログラムから標準ライブラリを呼び出した場合、マネージド・コードからアンマネージド・コードを呼び出すことになる。

マネージド・コードからアンマネージド・コードのライブラリを呼び出す

マネージド・コードからアンマネージド・コードのライブラリを呼び出すには、PInvoke (Platform Invocation) と呼ばれるサービスを利用する。PInvokeサービスを使用してアンマネージド・コードのライブラリを呼び出すには、System.Runtime.InteropServices.DllImport属性を使用して、呼び出す関数を宣言する。

[System.Runtime.InteropServices.DllImport("ライブラリ名")]
関数の宣言

あらかじめSystem.Runtime.InteropServicesネームスペースの使用を宣言しておけば、名前空間を明示的に修飾しなくともよい。

using System.Runtime.InteropServices;
.
.
.
[DllImport("ライブラリ名")]
関数の宣言

Win32 APIのライブラリ user32.dll はアンマネージド・コードである。マネージドC++プログラムからWin32 API (MessageBoxA) を呼び出す例を示す。

using System;

class HelloWorld {
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int
    MessageBoxA(int hWnd, String lpText, String lpCaption, uint uType);

    static void Main() {
        MessageBoxA(0, "Hello World!", "sample", 0);
    }
}

または

using System;
using System.Runtime.InteropServices;

class HelloWorld {
    [DllImport("user32.dll")]
    public static extern int
    MessageBoxA(int hWnd, String lpText, String lpCaption, uint uType);

    static void Main() {
        MessageBoxA(0, "Hello World!", "sample", 0);
    }
}
スポンサーリンク