Microsoft Windows

目次

Windowsのファイルシステム

Windowsには、次に示す3種類のファイルシステムが存在します。

種類最小容量最大容量
FAT16なし2GB (95, 98, Me)
4GB (NT, 2000, XP)
FAT32512MB2TB
NTFS10MB2TB

Windowsのバージョンごとにサポートしているファイルシステムを次に示します。

OSFAT16FAT32NTFS
Windows 95×× *1
Windows 95 OSR2× *1
Windows NT 4.0× *2
Windows 98 SE× *1
Windows Me× *1
Windows 2000
Windows XP
Windows Server 2003
Windows Vista

*1 NTFS for Windows 98 を使用してアクセス可能
*2 FAT32 for Windows NT 4.0 を使用してアクセス可能

COMコンポーネントをシステムに登録する

COMコンポーネントをシステムに登録するためには、Windows付属のコンソールプログラム regsvr32 を使用します。

regsvr32 [/u] [/s] [/n] [/i[:コマンドライン]] ファイル名

ファイル名で指定されたコンポーネント内の DllRegisterServer 関数を呼び出して、コンポーネントをシステムに登録します。

regsvr32 コマンドには次のようなオプションがあります。

/u
指定されたコンポーネント内の DllUnregisterServer 関数を呼び出して、コンポーネントをシステムから解除します。
/s
メッセージボックスを表示せずに実行します。
/i
省略可能な [コマンドライン] 文字列を引数として、指定されたコンポーネント内の DllInstall(TRUE, コマンドライン文字列) 関数を呼び出します。 /u オプションと併用した場合は、指定されたコンポーネント内の DllInstall(FALSE, コマンドライン文字列) 関数を呼び出します。
/n
DllRegisterServer 関数を呼び出しません。/u と併用した場合は DllUnregisterServer 関数を呼び出しません。このオプションは /i オプションと併用する必要があります。

マルチブート環境にてデフォルトで起動されるOSを変更する方法

Windows 2000 の場合、コントロールパネルから [システム] アプレットをダブルクリックして、システムのプロパティを表示します。 [詳細] タブをクリックして、[起動/回復] ボタンをクリックすると、 [起動/回復] ダイアログボックスが表示されます。 [規定のオペレーティングシステム] からデフォルトで起動されるOSを選択して、[OK] ボタンをクリックします。なお、規定のオペレーティングシステムを変更するにはAdministrator権限が必要です。

システムシャットダウン時のメッセージ処理の流れ

システムがシャットダウンしようとする際、WM_QUERYSESSIONメッセージがトップレベルウィンドウに対して送られてくる。 ここで、アプリケーションが終了できる状態であればTRUEを返す。そうでなければFALSEを返す。

WM_QUERYSESSIONメッセージに対してすべてのアプリケーションがTRUEを返した場合、システムはシャットダウンできる状態にあるとみなしてシャットダウンを続行する。 システムはすべてのトップレベルウィンドウに対してWM_ENDSESSIONメッセージを送信し、シャットダウンを会することを知らせる。 アプリケーションではこのメッセージを受信した時点で終了処理を行わなければならない。

WM_ENDSESSION

OSのシャットダウンで閉じられようとしている。

wParam0:セッションが終了していないとき(WM_QUERYSESSIONでFALSEが返されたととき)
1:セッションが終了するとき
lParam0:シャットダウンしようとしているとき
1:ログオフしようとしているとき

WM_SYSCOMMAND

m.WParam.ToInto32() == SC_CLOSE

×ボタン、コントロールメニューの「閉じる」、コントロールボックスのダブルクリック、Alt + F4 などにより閉じられようとしている。

DefWindowProc() がこれを受け取ると、ウィンドウプロシージャにWM_CLOSEを送る。

WM_CLOSE

DefWindowProc() がこれを受け取ると、DestroyWindow() を呼び出す。

DestroyWindow()

ウィンドウの破棄に必要な様々な終了処理を行う。そしてWM_DESTROYとWM_NCDESTROYメッセージをウィンドウに送る。

PostQuitMessage()

PostQuitMessage()はWM_QUITメッセージをポストする。WM_QUITメッセージを受け取ると、GetMessage()はFALSEを返して、メッセージループが終了する。

通常、WM_DESTROYメッセージ対する応答としてPostQuitMessage関数を使う。

WinDbg カーネルデバッガ

WinDbg は Microsoft のサイトから無償でダウンロードできるデバッガです。

印刷時ファイルに出力する

プリンタに接続されていない環境でも、印刷するときにファイルに出力することにより、そのファイルをプリンタで印刷できる環境に持っていけば印刷することができます。

まず、アプリケーションから「印刷」コマンドを選択して、「印刷」ダイアログを表示させます。なお、プリンタが接続されていない環境でも、事前にプリンタ・ドライバーのインストールと設定を行っておく必要があります。

「印刷」ダイアログの例を次に示します(使用するアプリケーションにより、ダイアログのデザインは異なります)。

「印刷」ダイアログ

「プリンタの選択」で実際に印刷するプリンタの種類を選択します(事前にプリンタ・ドライバーのインストールと設定を行っておく必要があります)。「ファイルへ出力」チェックボックスをクリックして、「印刷」ボタンをクリックします。

ファイルへ保存するダイアログが現れるので、ファイルに保存します(使用するアプリケーションにより、ダイアログのデザインは異なります)。

「ファイルへの出力」ダイアログ

ファイルが作成されるので、このファイルをプリンタで印刷できる環境に持っていきます。

コマンド・プロンプトを開き、COPYコマンドで印刷します。

COPY ファイル名 プリンタのネットワークパス /B

印刷する例を次に示します。

A:\> COPY sample.prn \\lp-8600fx\epson /B

これでファイルを印刷することができます。

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

Windowsのバージョン情報の取得は,WindowsのAPIを使用して行います。以下にAPIのインタフェースを示します。

GetVersion (Win16)

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

DWORD GetVersionx (void);
戻り値

GetVersionEx (Win32)

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

BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation);
パラメータの説明
lpVersionInformation
OSVERSIONINFO構造体へのポインタを指定する。
typedef struct _OSVERSIONINFO{ 
    DWORD dwOSVersionInfoSize; 
    DWORD dwMajorVersion; 
    DWORD dwMinorVersion; 
    DWORD dwBuildNumber; 
    DWORD dwPlatformId; 
    TCHAR szCSDVersion[128]; 
} OSVERSIONINFO; 
OSVERSIONINFO構造体
メンバ説明
dwOSVersionInfoSizeGetVersionEx関数を呼び出す前に,sizeof(OSVERSIONINFO)をセットしておかなければならない。
dwMajorVersionホストシステムのメジャーバージョン番号。
dwMinorVersionホストシステムのマイナーバージョン番号。
dwBuildNumberカレントシステムのビルド番号。
dwPlatformIdカレントシステムがサポートするプラットフォームを識別する。
VER_PLATFORM_WIN32s ・・・ Windows 3.1上で動作するWin32s
VER_PLATFORM_WIN32_WINDOWS ・・・ Windows 95上のWin32
VER_PLATFORM_WIN32_NT ・・・ Windows NT
szCSDVersionインストールされているオペレーティングシステムについての詳細な情報を提供するテキスト。
戻り値

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

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

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

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

GetModuleFileName

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

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

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

GetFileVersionInfoSize

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

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

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

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パラメータが無効であることを示す。

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返す。

ドラッグ&ドロップ

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

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

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

hDrop = (HANDLE)wParam;

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

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

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

ドロップされた位置を取得するには,Windows API DragQueryPointを用います。その引数として,ドロップ構造体のハンドル(ウィンドウメッセージWM_DROPFILES通知時のwParamの値)を必要とします。以下に関数インタフェースを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.

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

ドロップされたファイルのファイル名転送用のバッファを解放するには,Windows API DragFinishを用います。その引数として,ドロップ構造体のハンドル(ウィンドウメッセージWM_DROPFILES通知時のwParamの値)を必要とします。以下に関数インタフェースを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.

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)

共有セクション

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
SEO 仕事 掲示板 レンタルサーバー プロフ SEO