目次
Windows
- Windowsのファイルシステム
- COMコンポーネントをシステムに登録する
- マルチブート環境にてデフォルトで起動されるOSを変更する方法
- システムシャットダウン時のメッセージ処理の流れ
- WinDbg カーネルデバッガ
- 印刷時ファイルに出力する
- Windows の telnet で文字化けする
Windows プログラミング
WSH (Windows Script Host)
- WSHの概要
- VBScript
- JScript
WSH (Windows Script Host)
- WSHの概要
- VBScript
- JScript
Windowsのファイルシステム
Windowsには、次に示す3種類のファイルシステムが存在します。
| 種類 | 最小容量 | 最大容量 |
|---|---|---|
| FAT16 | なし | 2GB (95, 98, Me) 4GB (NT, 2000, XP) |
| FAT32 | 512MB | 2TB |
| NTFS | 10MB | 2TB |
Windowsのバージョンごとにサポートしているファイルシステムを次に示します。
| OS | FAT16 | FAT32 | NTFS |
|---|---|---|---|
| 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 を使用します。
ファイル名で指定されたコンポーネント内の 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のシャットダウンで閉じられようとしている。
| wParam | 0:セッションが終了していないとき(WM_QUERYSESSIONでFALSEが返されたととき) 1:セッションが終了するとき |
| lParam | 0:シャットダウンしようとしているとき 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コマンドで印刷します。
印刷する例を次に示します。
これでファイルを印刷することができます。
Windowsのバージョン情報を取得する
Windowsのバージョン情報の取得は,WindowsのAPIを使用して行います。以下にAPIのインタフェースを示します。
GetVersion (Win16)
WindowsとMS-DOSのオペレーションシステムの現在のバージョン番号を取得する。
戻り値
GetVersionEx (Win32)
現在実行中のオペレーティングシステムのバージョンに関する拡張情報を取得する。
パラメータの説明
- lpVersionInformation
- OSVERSIONINFO構造体へのポインタを指定する。
typedef struct _OSVERSIONINFO{ DWORD dwOSVersionInfoSize; DWORD dwMajorVersion; DWORD dwMinorVersion; DWORD dwBuildNumber; DWORD dwPlatformId; TCHAR szCSDVersion[128]; } OSVERSIONINFO;OSVERSIONINFO構造体 メンバ 説明 dwOSVersionInfoSize GetVersionEx関数を呼び出す前に,sizeof(OSVERSIONINFO)をセットしておかなければならない。 dwMajorVersion ホストシステムのメジャーバージョン番号。 dwMinorVersion ホストシステムのマイナーバージョン番号。 dwBuildNumber カレントシステムのビルド番号。 dwPlatformId カレントシステムがサポートするプラットフォームを識別する。 VER_PLATFORM_WIN32s・・・ Windows 3.1上で動作するWin32sVER_PLATFORM_WIN32_WINDOWS・・・ Windows 95上のWin32VER_PLATFORM_WIN32_NT・・・ Windows NTszCSDVersion インストールされているオペレーティングシステムについての詳細な情報を提供するテキスト。
戻り値
成功したらTRUE、失敗したら FALSEを返す。
アプリケーションのバージョン情報を取得する
バージョン情報をメモリ上のプロセスから直接取得することはできません。アプリケーションのバージョン情報を取得するには,モジュールのファイルに含まれるリソースから取得します。この手順について,以下に示します。
- Windows API GetModuleFileNameを用いて,モジュールハンドルからモジュールのファイル名を取得する。
- Windows API GetFileVersionInfoSizeを用いて,ファイルからバージョン情報リソース を取得できるか判定する。
- Windows API GetFileVersionInfoを用いて,ファイルに関するバージョン情報リソースを取得する。
- Windows API VerQueryValueを用いて,バージョン情報リソースから選択したバージョン情報を取得する。
GetModuleFileName
モジュールがロードされる実行可能ファイルの完全パスとファイル名を取得する。
パラメータの説明
- hModule
- モジュールハンドルを指定する。
- pFileName
- ファイル名を受け取る領域を指すポインタを指定する。
- dwSize
- コピーするバイトの最大数値を,終端のNULLも含めて指定する。dwSizeよりも長いファイル名は切り捨てられる。
戻り値
関数が正常に終了した場合,戻り値は指定されたバッファにコピーされた文字列の長さをバイト単位で示す。それ以外の場合,0を返す。
GetFileVersionInfoSize
バージョン情報を取得できるか判定する。
パラメータ
- pFileName
- ファイル名が格納されている領域をを指すポインタを指定する。
- lpdwHandle
- 32ビット値を指すポインタ。GetFileVersionInfoSizeを実行することにより,このパラメータにはファイルバージョン情報を識別するハンドルが格納される。このハンドルはGetFileVersionInfo関数で使われる。
戻り値
関数が正常に終了した場合は,バージョン情報の保持に必要なバッファサイズをバイト単位で返す。ファイルやバージョン情報が見付からなかった場合,またはMS-DOSエラーが発生した場合は,NULLを返す。
GetFileVersionInfo
ファイルバージョン情報の取得。
パラメータ
- pFileName
- ファイル名が格納されている領域を指すポインタを指定する。
- dwHandle
- ファイルバージョン情報を識別する。このパラメータには,GetFileVersionInfoSize関数が返すハンドルを指定するか,NULLを指定する。dwHandleパラメータがNULLのときは,GetFileVersionInfo関数がファイル中のバージョン情報を検索する。
- dwLen
- lpDataパラメータにより識別されるバッファのサイズをバイト単位で指定する。GetFileVersionInfoSize関数は,ファイルバージョン情報の保持に必要なバッファサイズを返す。バッファが小さすぎるときは,ファイルバージョン情報の大きさがバッファのサイズまで切りつめられる。
- lpData
- ファイルバージョン情報を受け取る領域を指すポインタを指定する。このパラメータは,後のVerQueryValue関数呼び出しのときに使われる。
戻り値
関数が正常に終了した場合は,0以外の値を返す。それ以外の場合は0を返し,ファイルが存在しないか,またはdwHandleパラメータが無効であることを示す。
VerQueryValue
バージョン情報値の問い合わせを行う。
パラメータの説明
- 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の値はドロップ構造体のハンドルです。
ドロップされたファイル名の取得
ドロップされたファイルのパス名を取得するには 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クラッカーに関する定義を以下に示します。
関数のプロトタイプ
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という新しい独自セクションを作成して、初期化済みデータ変数をこのセクションに配置する例を次に示します。
TCHAR gszSystemDir[SIZE_WORK_BUF] = "";
#pragma data_seg()
そして,リンカに対して,変数を共有するセクション名をリンカのオプションスイッチで指定します。
/SECTIONのあと,:で区切って属性を変更するセクションの名前を指定します。属性として指定できるのはR(Read),W(Write),S(Shared),E(Execute)であり,複数指定できます。
Sharedセクションを読み書き可能な共有セクションとして指定する例を次に示します。