#navi_header|読書メモ| "APIで学ぶWindows徹底理解"のPart16 - Part21までの読書メモです。 この読書メモのスタンス、およびサンプルコードの入手については以下を参照して下さい。 [[652]] #more|| ---- * 【Part 16】Unicodeを利用して複数の言語に対応する 本PartではVC++の機能を中心に解説されており、該当MSDNは全て、下記ナビゲーション以下に存在する。 "MSDN Library" > "Development Tools and Languages" > "Visual Studio 2010" > "Visual Studio" > "Visual Studio Languages" > "Visual C++" : VC++での文字コード・キャラクタセット機能について知りたい : ... > "Visual C++ Programming Methodologies" > "Character Sets in C++" : Cランタイムライブラリ(CRT)での国際化機能(locale, code page, single/multibyte/unicode)について知りたい : ... > "Visual C++ Reference" > "Visual C++ Libraries Reference" > "Run-Time Library" > "Run-Time Routines by Category" > "Internationalization" : 汎用テキストマッピング(Generic-Text Routine Mappings)の一覧を見たい : ... > "Visual C++ Reference" > "Visual C++ Libraries Reference" > "Run-Time Library" > "Generic-Text Mappings" > "Routine Mappings" 他サンプル: - C言語系/memos/VC++/03, UNICODE対応とtchar.h - Glamenv-Septzen.net -- http://www.glamenv-septzen.net/view/586 ** サンプル解説("Part16_CharacterSet\"フォルダ) : 16_01_MessageBoxA.cpp, 16_02_MessageBoxW.cpp : #block||> 本読書メモ、オリジナルサンプルコード。 コンパイル方法: cl 16_01_MessageBoxA.cpp user32.lib cl 16_02_MessageBoxW.cpp user32.lib SJIS, UNICODEの二種類の文字列を、一方はMessageBoxA()で表示し、もう一方はMessageBoxW()で表示する。当然MessageBoxA()ではUNICODE文字列が文字化けし、MessageBoxW()ではSJIS文字列が文字化けする。 ||< : 16_03_gtrm_unicode.cpp : #block||> 本読書メモ、オリジナルサンプルコード。 コンパイル方法: cl /D _UNICODE /Fe16_03_gtrm_unicode_u.exe 16_03_gtrm_unicode.cpp cl /Fe16_03_gtrm_unicode_nou.exe 16_03_gtrm_unicode.cpp C RunTime Library (CRT) の汎用テキストマッピング機能を確認するサンプル。"/D _UNICODE"付でコンパイルしたのはUNICODE対応、網一方はUNICODE非対応となる。実行すると_getts_s()で入力待ちになる。適当な文字列を入力すると、入力された文字列とその文字「数」を表示する。日本語(全角文字列)を入力した場合、"/D _UNICODE"有無で「数」のカウントが変わり、またバッファサイズも変わる。 ||< * 【Part 17】フォントはけっこう奥が深い : テキストの描画とフォントについて詳しく知りたい : "MSDN Library" > "Windows Development" > "Graphics and Multimedia" > "Windows GDI" > "Fonts and Text" : フォント選択ダイアログボックスの使い方 : "MSDN Library" > "Windows Development" > "Windows Application UI Development" > "Windows User Interface" > "User Input" > "Common Dialog Box Library" > "Common Dialog Box Library Overviews" > "Font Dialog Box" ** サンプル解説("Part17_Fonts\"フォルダ) : fonttest.cpp, fonttest.rc : #block||> 本書173p, リスト2, 3のVC++移植版+簡略化版。 コンパイル方法: rc fonttest.rc cl /D UNICODE /D _UNICODE /Fefonttest_u.exe fonttest.cpp \ user32.lib comdlg32.lib gdi32.lib fonttest.res cl /Fefonttest_nou.exe fonttest.cpp \ user32.lib comdlg32.lib gdi32.lib fonttest.res 実行するとメニュー付のウインドウが表示される。UNICODE対応版では最初からウインドウ内の左上に「フォント表示の実験」という文字列が表示されるが、UNICODE非対応版では文字化けしてしまっている。メニューから"Font" -> "ChooseFont"をクリックすると、フォント選択ダイアログボックスが表示される。適当にフォントを選択すると、フォント名がメッセージボックスで表示される。ウインドウ内の適当な場所を左クリックすると、その場所に選択されたフォントで「フォント表示の実験」という文字列がTextOut()で描画される。 ||< * 【Part 18】構造化例外処理のメカニズムを学ぶ : 構造化例外処理について詳しく知りたい : "MSDN Library" > "Windows Development" > "Diagnostics" > "Debugging and Error Handling" > "Structured Exception Handling" : SEHのサンプル : "MSDN Library" > "Windows Development" > "Diagnostics" > "Debugging and Error Handling" > "Structured Exception Handling" > "Using Structured Exception Handling" アセンブラレベルでのSEH実装について詳しく知りたい: - How a C++ compiler implements exception handling - CodeProject -- http://www.codeproject.com/kb/cpp/exceptionhandler.aspx - A Crash Course on theDepths of Win32 Structured Exception Handling, MSJ January 1997 -- http://www.microsoft.com/msj/0197/exception/exception.aspx - Windows における例外ハンドリング - @a4lg の準技術的日記 (See Left side for My Twitter Link) -- http://d.hatena.ne.jp/xna/20091018/1255876308 - "Windows の内部動作 - Web/DB プログラミング徹底解説" : 例外処理の一通りの日本語解説 -- http://keicode.com/windows/index5.php --- 「例外処理」の見出し参照 - VC++構造化例外メモ(Hishidama's VC++2005 SEH Memo) -- http://www.ne.jp/asahi/hishidama/home/tech/vcpp/seh.html ※上のリンクにも含まれていますが、下記の小山圭介氏のWebサイトもおすすめです。 - Windows 徹底解説 - Web/DB プログラミング徹底解説 -- http://keicode.com/windows/ 「APIで学ぶWindows徹底理解」と併せて読むか、更に発展的な内容を調査する時に参照したいWebサイトです。 ** サンプル解説("Part18_Structured_Exception_Handling\"フォルダ) : 18_01_seh_by_asm.cpp : #block||> 本書180p, リスト6のVC++移植版。 コンパイル方法: cl /c 18_01_seh_by_asm.cpp ... ...\18_01_seh_by_asm.cpp(57) : warning C4733: \ インライン asm は 'FS:0' に割り当てています : \ ハンドラは安全なハンドラとして登録されていません。 ...\18_01_seh_by_asm.cpp(80) : warning C4733: \ インライン asm は 'FS:0' に割り当てています : \ ハンドラは安全なハンドラとして登録されていません。 link /SAFESEH:NO 18_01_seh_by_asm.obj "__try", "__except"キーワードの機能をインラインアセンブラで手動実装したサンプル。warning C4733についてはセキュリティ上の警告であり、本来は避けるべきFS:[0]の操作をしているので表示されて当然である。もちろんサンプルコードの趣旨として、この警告は無視して構わない。 FS:[0]をインラインアセンブラなどで操作し、手動でSEH情報を書き換える手法は容易に各種BufferOverflowと合わせたコードインジェクション攻撃に発展する。これを防ぐ為、有効なハンドラの一覧(テーブル)をイメージ中に埋め込み、例外ハンドラ実行時にこの一覧に載っているハンドラかチェックする仕組みがある。このチェック機能を有効にするのがリンカ(link.exe)の"/SAFESEH"オプションである。 本来であればマクロアセンブラの ".SAFESEH handler" 疑似命令を組み合わせ、安全なハンドラを指定するのが正攻法であると思われるが、今回は簡略の為あえて "/SAFESEH:NO" をリンカオプションに指定し、例外ハンドラのチェックをスキップさせた。 ||< : 18_02_seh_by_asm2.cpp : #block||> 本書182p, リスト7のVC++移植版。 コンパイル方法: cl /c 18_02_seh_by_asm2.cpp (... 同様に warning C4733 が表示されるが、無視する。 ...) link /SAFESEH:NO 18_02_seh_by_asm2.obj 例外ハンドラで例外に対処した後、実行再開位置をEIP, EBP, ESPの操作を通じて変更するサンプル。 ||< * 【Part 19】非同期I/Oを利用して効率よくファイルにアクセスする : 同期・非同期処理全般について知りたい : "MSDN Library" > "Windows Development" > "System Services" > "DLLs, Processes, and Threads" > "Synchronization" > "About Synchronization" : 同期・非同期I/Oの概要 : "MSDN Library" > "Windows Development" > "System Services" > "File Services" > "Local File Systems" > "File Management" > "About File Management" > "Input and Output (I/O)" > "I/O Concepts" > "Synchronous and Asynchronous I/O" : 他 : #block||> - Windows のファイル・I/O 処理 - Web/DB プログラミング徹底解説 -- http://keicode.com/windows/index2.php ||< ** サンプル解説("Part19_AsyncIO\"フォルダ) : 19_01.cpp : #block||> 本書188p, リスト7のVC++移植版。 コンパイル方法: cl 19_01.cpp ..\PrintErrorMsg.obj ファイル先頭から50MBを非同期に読み込むサンプル。試す場合は、読み込むサイズ(ソース中でdefine)を変えてみたり、FDDから読み込ませてみるとよい。 ||< : 19_02.cpp : #block||> 本書191p, リスト10のVC++移植版。 コンパイル方法: cl 19_02.cpp ..\PrintErrorMsg.obj ReadFileEx()を使ったサンプル。 ||< * 【Part 20】デバイス・ドライバとプラグ・アンド・プレイの仕組みを学ぶ Windowsでのデバイスドライバ開発全般: - WHDC - Windows Hardware Developer Central -- http://www.microsoft.com/whdc/default.mspx - WHDC - Windows Hardware Developer Central 日本語版 -- http://www.microsoft.com/japan/whdc/default.mspx デバイスドライバ開発初心者向け: - Windows ドライバー開発者向けドライバー ライフサイクルの基礎 -- http://www.microsoft.com/japan/whdc/driver/default.mspx : "Windows Driver Kit", MSDNドキュメント : "MSDN Library" > "Windows Development" > "Windows Driver Kit" : "Windows Driver Model"(WDM)について : "MSDN Library" > "Windows Development" > "Windows Driver Kit" > "Kernel-Mode Driver Architecture" > "Design Guide" > "Writing WDM Drivers" * 【Part 21】デバイス・ドライバの作成に挑戦 WDK付属サンプルの "src\input\kbfiltr" と類似している為、そちらを参照のこと。 #navi_footer|読書メモ|