C言語 C++ Windows プログラム コンパイル
MinGw/gcc の場合
C 言語で書かれたソースファイル src.c を用意する
gcc src.c -mwindows -o src.exe
src.exe が完成。
リソースを埋め込む場合
- C 言語で書かれたソースファイル src.c を用意する
- リソーススクリプトで書かれたソースファイル src.rc を用意する
windres src.rc src.o gcc src.c src.o -mwindows -o src.exe
リソースが埋め込まれた src.exe が完成。
アセンブラ
NASM
ソースから実行ファイルを作成するには
NASM の文法に則った foo.asm を作成する
以下のコマンドで foo.asm から foo.com が生成される
nasm foo.asm -o foo.com
何もしない 16 bit MS-DOS アプリケーション
NASM 文法に則ったソース
mov ah, 0x4c mov al, 0x00 int 0x21
レジスタ ah と al にそれぞれ 0x4c と 0x00 を格納し、 int 0x21 して、 MS-DOS にこのアプリケーションが終了したことを通知している
ah に 0x4c が 終了
al の 0x00 は正常に終了したことのしるし
int 0x21 で MS-DOS に通知
このソースから実行ファイルを作成すると、中身は
B4 4C B0 00 CD 21
こうなっている
B4 mov ah, 4C 0x4C B0 mov al, 00 0x00 CD int 21 0x21
それぞれ 1 対 1 で対応している
16 bit アプリケーションの実行
Windows XP で 16 bit アプリケーションを実行するには、 cmd.exe 内で一度 command.com を実行する
そうすると、 16 bit モードに切り替わる
すぐに exit する
16 bit モードが継続している
この状態で、 16 bit アプリケーションを実行する
タスクトレイのツールチップが隠れる問題
Windows XP Professional で、タスクトレイのアイコンにカーソルを重ねると、ツールチップが表示される。
それが何かの原因でタスクバーの後ろに表示されてしまい、いわゆる、ツールチップが隠れる、という現象が起こる。
これには完全な解決方法がある。
すなわち、タスクバーの右クリックメニューにある「タスクバーを固定する」をオンにしたあと、レジストリエディタを開き、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
の中の DWORD 値 LockTaskBar を 0x00000001 にする。
必要に応じて、コンピュータを再起動する。
これは本来、「タスクバーを固定する」の設定を変更可能にするかどうかを決定するためのレジストリの値であるが、これを設定することによって、ツールチップが隠れる現象が再現しなくなる。
より簡単な方法は、コマンドプロンプトで
mmc.exe gpedit.msc
と入力し、グループ ポリシー を起動する。
- ローカル コンピュータ ポリシー
- ユーザーの構成
- 管理用テンプレート
- タスクバー と [スタート] メニュー
- 管理用テンプレート
- ユーザーの構成
の中の、 タスクバーをロックする の値を 有効 にする。
Beep : ASCII 0x07 : beep.sys
cmd.exe で echo と入力したあと Ctrl+G キーを押すと
echo ^G
このように表示される。
ここで Enter キーを押して実行すると、ビープ音が鳴る。
Ctrl+G で入力した情報の実体は、 ASCII コードの 0x07 である。
これは、刻印文字ではない。 BEL である。ベルは、 Windows では Beep に相当する。
Windows の Beep は Beep.sys である。
これは、ドライバである。
Beep ドライバはサービスとして読み込まれている。
サービス名は beep である。
sc stop beep
を実行すると、 beep サービスが停止、 beep.sys がアンロードされ、ビープ音が鳴らなくなる。
sc start beep
とすれば、再び beep.sys がロードされ、ビープ音が鳴るようになる。
sc qc beep
で、 beep サービスの設定状態が表示される。
sc config beep start= disabled
で、 beep を Windows 起動時に読み込まないようにすることができる。
beep サービスの START_TYPE の初期値は、 SYSTEM_START である。
sc config beep start= system
でその初期値に戻すことができる。
sc queryex beep
で現在の beep 稼動状態 (STATE) を表示することができる。
ローカル セキュリティ ポリシー の設定を初期化する
Windows XP には、ローカル セキュリティ ポリシー がある。
ポリシーの設定を編集すると、不具合が起きることがある。
たとえば、 Guest アカウントでログインしようとすると、 SAS Window が出て、 winlogon.exe でエラーが起きた、というようなことを警告メッセージボックスで報告されるような現象だ。
ローカル セキュリティ ポリシー の設定を初期化を実行するには、コマンドプロンプトで
secedit /configure /db 適当なファイル名 /cfg %SystemRoot%\inf\defltwk.inf /areas SECURITYPOLICY
と入力して実行する。
このプログラムの実行プロセスの流れは、
- /configure が、セキュリティ設定を変更する、という意味
- /db で指定したファイル名のファイルが新規作成される
- /cfg で指定した defltwk.inf ファイルが読み込まれる
- /areas で指定した領域が defltwk.inf から抽出され、データベースとして構築される。それが、/db のファイルに出力される
- /db のファイルのデータベースが実際の領域(ここではローカルセキュリティポリシー)に適用される
secedit.exe を引数なしで実行すると、「セキュリティの構成タスクを自動化する」についての HTML ヘルプが現れる。
この中に Secedit コマンドについての説明がある。
このほか、 /areas FILESTORE もある。これは、 NTFS の各フォルダ・ファイルのプロパティのセキュリティタブにある「アクセス許可」を、すべての Windows システムフォルダ・ファイル に対して初期化を適用するものだ。
また、 /areas SERVICES は、サービスの自動・手動・無効などの設定をデフォルトに戻す。