Microsoft VisualC++に関するまとめ。と言いつつ現状Native開発のみでC++/CLIな情報は無し。

Version

VisualC++ VersionCompiler(_MSC_VER)MFC(_MFC_VER) *1ATL(_ATL_VER) *2
VisualC++ 6.012000x06000x0300
eMbedded VisualC++ 4.012000x06000x0300
VisualC++ .NET 200213000x07000x0700
VisualC++ .NET 200313100x07100x0710
VisualC++ 200514000x08000x0800
VisualC++ 200815000x09000x0900
VisualC++ 201016000x0A000x0A00
VisualC++ 201217000x0B000x0B00
VisualC++ 201318000x0C000x0C00

「nmake.exe」実行環境

コマンドプロンプトから利用できるようにする方法。
バッチファイル内部で利用する場合は、各バッチファイル(vcvars32.bat/vsvars32.bat)を下記のように呼び出す。

CALL 〜vsvars32.bat
  • VisualC++ 6.0
    cmd.exe /k "%PROGRAMFILES%\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"
  • VisualC++ .NET 2002
    cmd.exe /k "%PROGRAMFILES%\Microsoft Visual Studio .NET\Common7\Tools\VSVARS32.BAT"
  • VisualC++ .NET 2003
    cmd.exe /k "%VS71COMNTOOLS%\vsvars32.bat"
  • VisualC++ 2005
    cmd.exe /k "%VS80COMNTOOLS%\vsvars32.bat"
  • VisualC++ 2008
    cmd.exe /k "%VS90COMNTOOLS%\vsvars32.bat"
  • VisualC++ 2010
    cmd.exe /k "%VS100COMNTOOLS%\vsvars32.bat"
  • VisualC++ 2012
    cmd.exe /k "%VS110COMNTOOLS%\vsvars32.bat"
  • VisualC++ 2013
    cmd.exe /k "%VS120COMNTOOLS%\vsvars32.bat"

Windows SDK(旧Platform SDK)

Microsoft ダウンロードセンター > Microsoft Platform SDK
 
VisualC++ VersionPlatform SDK Version
VisualC++ 6.0Platform SDK February 2003
VisualC++ .NET 2002Platform SDK February 2003
VisualC++ .NET 2003Windows® Server 2003 R2 Platform SDK 2006 March *4
VisualC++ 2005Windows® Server 2003 R2 Platform SDK 2006 March *5 *6
  • 注意事項
PlatformSDKのアンインストールでVisualStudio .NET 2003でビルド出来なくなる
ビルドを実行すると下記のエラーが出てビルドが実行出来なくなる。
error PRJ0003 : cl.exe' の起動中にエラーが発生しました。
どうやらPlatformSDKがアンインストール処理の際に、VisualStudioのPlatformSDKの参照設定を削除しに行き、ものの見事に設定を破壊してしまう模様。IDEの設定で「$(VCInstallDir)bin」等の設定を見直す事で修復可能。

MSDNライブラリ

Microsoft ダウンロードセンター > MSDN
最近はMSDN会員でなくても無償公開されるようになった。
VisualC++ VersionMSDN Library Release
VisualC++ 6.0〜2001年10月号
VisualC++ .NET 2002〜2006年1月号
VisualC++ .NET 2003〜2006年1月号
VisualC++ 2005〜2007年6月号
VisualC++ 2008MSDN Library for Visual Studio 2008 SP1(2008年12月更新版)
  • Tool
Package This
Package This is a GUI tool written in C# for creating help files (.chm and .hxs) from the content obtained from the MSDN Library or the TechNet Library via the MSDN Content Service.

SampleCode

VisualC++ 6.0
Visual Studio 6.0 Samples - ちなみにこちらはリンク切れ。
VisualC++ .NET 2003
Visual C++ のサンプル アプリケーション
Visual C++ .NET 2003 Code Samples - ManagedC++のサンプル群。
VisualC++ 2005
Visual C++ のサンプル アプリケーション
VisualC++ 2008
Visual C++ のサンプル アプリケーション
Microsoft Visual C++ 2008 Sample Library
Microsoft Visual C++ 2008 SP1 Sample Library
VisualC++ 2010
Visual C++ Samples and Related Documentation for Visual Studio 2010

Runtime

  • VisualC++ 6.0
  • VisualC++ .NET 2002
  • VisualC++ .NET 2003
RTM
for x86, for x64
SP1
for x86, for x64
SP1 with MFC Fix
for x86, for x64
SP1 with ATL Fix
for x86, for x64
RTM
for x86, for x64
RTM with Feature Pack
for x86, for x64
SP1
for x86, for x64
SP1 with MFC Fix
for x86, for x64
SP1 with ATL Fix
for x86, for x64
RTM
for x86, for x64
SP1
for x86, for x64

参考情報

MSDN Code Gallery
VisualC++ - VC++2005/2008向けのHotfixはこちらから入手
MSDN Patterns & Practices > UNIX Application Migration Guide
UNIXなプログラムをWindowsに移植する際の参考情報。
NyaRuRuの日記 > Visual C++ 2005 への移行と生成コードの速度低下
「Visual C++ 6.0/ .NET 2003 から Visual C++ 2005 に移行したら生成されたプログラムのパフォーマンスが悪化した」という話はまあありがちといえばありがちかもしれません.少なくともあって不思議ではない話です.

API(Application Program Interface)

しっかりリファレンスに目を通してありがちなバグを減らしましょう。

MSDNライブラリ
Visual C++ のライブラリ
[SDK32] C ランタイム関数の Win32 で対応する関数一覧
C ランタイム関数は Win32 アプリケーション プログラミング インターフェイス (API) に直接対応する関数を数多く持っています。この記事ではカテゴリ別に C ランタイム関数をリストアップし、Win32 で対応する関数が存在する場合は等価関数名を、同等の物が存在しない場合には "なし" を表記します。
MSDN Library > Platform SDK > Windows API Functions by Release
各OSで追加/変更されたAPIの一覧表。
  • ランタイムライブラリ
カテゴリ別ランタイム ルーチン
汎用テキスト マップ(TCHAR.H)
  • MFC
MFC マクロとグローバル
MFC クラス
MFC 階層図
これらの図では、MFC 内のクラスの関係が示されています。Visual Studio 2008 でリリースされた元のクラスだけでなく、Visual C++ 2008 Feature Pack で提供された追加のクラスも含まれます。
  • ATL
ATL 関数リファレンス (アルファベット順)
ATLのクラス
  • COM
Compiler COM Global Functions
  • WinSock
MSDN > Platform SDK > Windows Sockets 2 > Winsock Reference

Timer

API名称用途
Sleep指定された時間に渡って現在のスレッドの実行を中断
SleepExSleep()の割り込み有り版
GetTickCountシステムを起動した後の経過時間をミリ秒[ms]単位で取得
timeGetDevCapsタイマデバイスを照会して分解能を取得
timeGetTimeシステム時刻をミリ秒単位で取得
timeGetSystemTimeシステム時刻をミリ秒単位で取得
timeBeginPeriodアプリケーションまたはデバイスドライバの最小タイマ分解能を設定
timeEndPeriod以前にセットされた最小タイマ分解能をクリア
timeSetEvent指定されたタイマイベントを開始
timeKillEvent指定されたタイマイベントを終了
QueryPerformanceFrequency高分解能パフォーマンスカウンタの周波数(更新頻度)を取得
QueryPerformanceCounter高分解能パフォーマンスカウンタの現在値を取得
SetTimer指定されたタイムアウト値を持つ 1 個のタイマを作成
KillTimer指定されたタイマを破棄
CreateTimerQueueタイマのキューを作成
DeleteTimerQueueExタイマキューを削除
CreateTimerQueueTimerタイマキュータイマを作成
DeleteTimerQueueTimerタイマキュータイマを取り消します
CreateWaitableTimer“待機可能”タイマオブジェクトを作成
SetWaitableTimer指定した“待機可能”タイマをアクティブにします
CancelWaitableTimer指定した“待機可能”タイマをアクティブでない状態に設定
  • 参考情報
Microsoft > Guidelines For Providing Multimedia Timer Support
Intel > Measure Code Sections Using The Enhanced Timer
Windows Multimedia Hacks > 楽しいハック講座(3) マルチメディア タイマー その2

プロセス・スレッド制御

API名称用途
EnumProcessシステム内の各プロセスオブジェクト用のプロセス識別子を取得
EnumProcessModules指定されたプロセス内の各モジュールのハンドルを取得
GetModuleBaseName指定されたモジュールのベース名を取得
SwitchToThread呼び出し側スレッドから現在のプロセッサで実行する準備ができている別のスレッドに実行を譲渡
GetCurrentProcess現在のプロセスの疑似ハンドルを取得
GetCurrentProcessId呼び出し側プロセスのプロセス識別子を取得
GetProcessAffinityMask
SetProcessAffinityMask
指定されたプロセスのプロセスアフィニティマスクとシステムのシステムアフィニティマスクを取得・設定
GetPriorityClass
SetPriorityClass
指定されたプロセスの優先順位クラスを取得・設定
GetProcessPriorityBoost指定されたプロセスのプライオリティブースト制御の状態を取得
SetProcessPriorityBoost指定されたプロセスに属するスレッドの優先順位を一時的に上げる Windows NT のブースト機能を設定
GetCurrentThread現在のスレッドの擬似ハンドルを取得
GetCurrentThreadId呼び出し側スレッドのスレッド識別子を取得
GetWindowThreadProcessId指定されたウィンドウを作成したプロセス及びスレッドのIDを取得
EnumThreadWindows指定されたスレッドに関連付けられている、子ウィンドウでない全てのウィンドウを列挙
SetThreadAffinityMask指定されたスレッドのプロセッサアフィニティマスクを設定
SetThreadIdealProcessorスレッドの優先プロセッサを指定
GetThreadPriority
SetThreadPriority
指定されたスレッドの相対優先順位値を取得・設定
GetThreadPriorityBoost指定されたスレッドのプライオリティブースト制御の状態を取得
SetThreadPriorityBoostスレッドの優先順位を一時的に上げる Windows NT の機能を設定
AttachThreadInput特定のスレッドの入力処理機構を別のスレッドにアタッチ
FindExecutable指定されたファイル名に関連付けられている実行可能(.EXE)ファイルの名前とハンドルを取得
AssocQueryStringレジストリからファイル又はプロトコルの関連付け設定値を検索・取得
SetThreadExecutionStateアプリケーションが実行されていることをシステムに通知し、アプリケーションの実行中にシステムが電源のスリープ状態に入るのを防ぐ
GetProcessTimes指定されたプロセスに関する時間情報を取得
GetThreadTimes指定されたスレッドに関する時間情報を取得
CreateToolhelp32Snapshotプロセスと、プロセスが使っているヒープ、モジュール、スレッドのスナップショットを作成
Process32Firstシステムのスナップショット内で見つかった最初のプロセスに関する情報を取得
Process32Nextシステムのスナップショット内に記録されている次のプロセスに関する情報を取得
Thread32Firstシステムのスナップショット内で見つかった任意のプロセス内の、最初のスレッドに関する情報を取得
Thread32Nextシステムのスナップショット内で見つかった任意のプロセス内の、次のスレッドに関する情報を取得
 
プロセス/スレッド起動
CRT(ANSI)Win32Win32(Shell)MFCATL
_spawnl
_spawnle
_spawnlp
_spawnlpe
_spawnv
_spawnve
_spawnvp
_spawnvpe
CreateProcess
CreateProcessAsUser
ShellExecute
ShellExecuteEx
--
_beginthread
_beginthreadex
CreateThread *7
CreateRemoteThread
SHCreateThread
SHCreateThreadWithHandle
AfxBeginThreadAtlCreateThread
-GetCommandLine---
-CommandLineToArgvW---
 
  • 参考情報
Windows98/2000以降でWindowをアクティブにする
SetForegroundWindowだけでは駄目で、AttachThreadInputも使う必要があるらしい。
方法 : ネイティブ コードのスレッド名を設定する

同期オブジェクト

API名称用途
WaitForSingleObject指定されたオブジェクトがシグナル状態になるかタイムアウトすると制御を返す
WaitForMultipleObjects指定されたオブジェクトの1つ又は全てがシグナル状態になるかタイムアウトすると制御を返す
CreateMutex名前付きまたは名前なしのミューテックスオブジェクトを作成または開く
OpenMutex既存の名前付きミューテックスオブジェクトを開く
ReleaseMutex指定されたミューテックスオブジェクトの所有権を解放
CreateSemaphore名前付きまたは名前なしのセマフォオブジェクトを作成または開く
OpenSemaphore既存の名前付きセマフォオブジェクトを開く
ReleaseSemaphore指定されたセマフォオブジェクトのカウントを、指定された数だけ増やす
InitializeCriticalSection指定されたクリティカルセクションオブジェクトを初期化
DeleteCriticalSection所有されていないクリティカルセクションオブジェクトが使っている全てのリソースを解放
EnterCriticalSection指定されたクリティカルセクションオブジェクトの所有権を取得するまで待機
TryEnterCriticalSectionクリティカルセクションへのエントリをブロックせずに試みる
LeaveCriticalSection指定されたクリティカルセクションオブジェクトの所有権を解放
LockFile開いているファイル内の指定された領域をロック
LockFileEx開いているファイル内の指定された領域に対して、共有アクセスまたは排他アクセスを行うためのロックを行う
UnlockFile開いているファイル内の指定された領域をロック解除します
UnlockFileEx開いているファイル内の、既にロックされたバイト範囲をロック解除します
  • 参考情報
@IT > 第3回 マルチタスクに不可欠な同期の仕組みを学ぶ
CriticalSection/Mutex/Semaphoreの特徴や、SetEvent/PulseEventの自動/手動イベントの動作の違い等。
MSDN > 短時間でできる汎用の同期オブジェクト(A Quick and Versatile Synchronization Object)
1998年の記事なのでちょっと古い。日本語訳の方は原文のAppendixが抜けているので注意。
既存のWin32APIを組み合わせてMeteredSectionを扱う同期オブジェクトを作成する内容。
PulseEvent関数
This function is unreliable and should not be used. It exists mainly for backward compatibility.
MSDNマガジン > 同時実行:Windows Vista の新しい同期プリミティブ
この記事では、ネイティブ C/C++ 開発者にが利用すべき Windows Vista のいくつかの新機能について説明します。具体的には、条件変数、slim reader/writer ロック、one-time initialization など、Windows Vista で導入された新しいスレッド同期機能を取り上げます。

ウィンドウ操作

Win32Win32(Shell)MFC
MessageBoxShellMessageBoxAfxMessageBox
 
API名称用途
ShowWindow指定されたウィンドウの表示状態を設定
ShowWindowAsync別のスレッドによって作成されたウィンドウの表示状態を設定
BringWindowToTop指定されたウィンドウを Z オーダーの先頭にする
SwitchToThisWindowswitch focus to a specified window and bring it to the foreground.
SHAutoCompleteオートコンプリート機能を有効にする
IsHungAppWindowハングアップしたアプリケーション判定
DisableProcessWindowsGhostingGhostウィンドウの生成を抑止
SetLayeredWindowAttributesレイヤードウィンドウの不透明度と透明のカラーキーを設定

メッセージ操作

Win32Win32(Shell)MFC
SendMessage--
SendMessageTimeout--
SendMessageCallBack--
SendNotifyMessage--
PostMessage--
PostThreadMessage--
PostAppMessage--
PostQuitMessage-AfxPostQuitMessage
RegisterWindowMessage--

共有メモリ

API名称用途
CreateFileMappingファイルマッピングオブジェクトの作成/オープン
MapViewOfFileファイルのビューをマップする
FlushViewOfFileマップトファイルのビュー内にある、指定された範囲のデータをディスクに書き込む
UnmapViewOfFileファイルのビューをアンマップする
CloseHandleファイルマッピングオブジェクトのハンドル破棄

メモリ操作

CRT(ANSI)Win32Win32(Shell)COM/OLE
malloc
calloc
GlobalAlloc
HeapAlloc
LocalAlloc
VirtualAlloc
VirtualAllocEx
SHGetMalloc
SHAlloc *8
CoTaskMemAlloc
CoGetMalloc
realloc
_expand
GlobalReAlloc
HeapReAlloc
LocalReAlloc
-CoTaskMemRealloc
freeGlobalFree
HeapFree
LocalFree
VirtualFree
VirtualFreeEx
SHFree *9CoTaskMemFree
_msizeGlobalSize
HeapSize
LocalSize
--
_alloca---
memcpyCopyMemory--
_memccpy---
memsetFillMemory
ZeroMemory
SecureZeroMemory*10
--
memmoveMoveMemory--
memcmpRtlCompareMemory
RtlEqualMemory
--
memchr---
-ReadProcessMemory--
-WriteProcessMemory--
-GlobalMemoryStatus
GlobalMemoryStatusEx
--

環境変数操作

CRT(ANSI)Win32Win32(Shell)
getenvGetEnvironmentVariable-
_putenvSetEnvironmentVariable *11-
-ExpandEnvironmentStrings *12PathUnExpandEnvStrings
--DoEnvironmentSubst
-SetDllDirectory-

文字列操作

文字列操作関連はバッファサイズ指定ありのもの(N文字付き)を使うようにするべきだが、どのAPI(CRT/Win32/Shell/・・・)の実行速度が一番速いのだろう・・・。

CRT(ANSI)Win32Win32(Shell)Platform SDK
DirectX9 SDK
(strsafe.h)
COM/OLE

*13
strcpylstrcpyStrCpy---
strncpylstrcpynStrCpyN
StrNCpy
StringCchCopy-A
---StringCbCopy-B
strlen
_mbstrlen
_mbsnccnt
lstrlen-StringCchLengthSysStringLenA
_mbsnbcnt--StringCbLength-B
mblen----B
strcmp
strcoll
lstrcmpStrCmp
StrCmpC
--A
strcmpi
stricoll
lstrcmpiStrCmpI
StrCmpLogicalW
StrCmpCI
--A
strcatlstrcatStrCat---
strncat-StrCatN
StrNCat
StrCatBuff
StringCchCat
StringCchCatEx
StringCchCatN
-A
---StringCbCat
StringCbCatEx
StringCbCatN
-B
strncmp
_strncoll
CompareString
CompareStringEx
StrCmpN
StrCmpNC
--A
_strnicmp
_strnicoll
CompareString
CompareStringEx
StrCmpNI
StrCmpNIC
--A
-CompareStringOrdinal *14---A
_strdup-StrDup
SHStrDup
-SysAllocString
SysAllocStringLen
SysAllocStringByteLen
-
----SysFreeString-
strchr-StrChr
StrChrI
---
strrchr-StrRChr
StrRChrI
---
strstr-StrStr
StrStrI
---
--StrRStrI---
strspn-----
strcspn-----
_strspnp-----
_strset-----
_strnset-----
_strrev-----
--StrTrim---
_strnextc
_strinc
_strninc
CharNext
CharNextExA
----
_strdecCharPrev
CharPrevExA
----
_toupper
_strupr
CharUpper
CharUpperBuff
----
_tolower
_strlwr
CharLower
CharLowerBuff
----
-GetStringTypeEx----
isleadbyteIsDBCSLeadByte
IsDBCSLeadByteEx
----
_ismbslead
_ismbblead
-----
isupperIsCharUpper----
islowerIsCharLowerPathMakePretty---
isalphaIsCharAlpha----
isalnumIsCharAlphaNumeric----
isspace-IsCharSpace *15---
-IsTextUnicode----
 
書式設定
CRT(ANSI)Win32Win32(Shell)Platform SDK
DirectX9 SDK
(strsafe.h)


*16
sprintfwsprintf *17---
_snprintf-wnsprintf *18StringCchPrintfA
---StringCbPrintfB
vsprintfwvsprintf *19---
_vsnprintf-wvnsprintf *20StringCchVPrintfA
---StringCbVPrintfB
_scprintf----
setprecision *21----
 
数値変換
CRT(ANSI)Win32Win32(Shell)備考
atoi-StrToInt
StrToIntEx
int
atol-StrToLonglong
strtol--long
strtoul--unsigned long
_atoi64-StrToInt64Ex_int64
_strtoi64 *22--_int64
_strtoui64 *23--unsigned _int64
atof--double
strtod--double
_itoa--int
_ltoa--long
_ultoa--unsigned long
_i64toa--_int64
_ui64toa--unsigned _int64
_ecvt--double
_fcvt--double
_gcvt--double
 
文字コード/データ型変換*24
CRT(ANSI)Win32ATLCOM/OLEMLang *25
mbtowc----
wctomb----
mbstowcsMultiByteToWideChar
FoldString
_mbstowcszConvertStringToBSTRConvertINetMultiByteToUnicode
wcstombsWideCharToMultiByte
*26
_wcstombszConvertBSTRToStringConvertINetUnicodeToMultiByte
-LCMapString--ConvertINetString
_mbcjistojms----
_mbcjmstojis----
_mbctombb----
_mbbtombc----
_mbctohira----
_mbctokata----
--AtlUnicodeToUTF8--
 
汎用テキスト ルーチン マッピング
ANSI_UNICODE_MBCSTCHAR.H
strlenwcslen_mbslen_tcslen
strcpywcscpy_mbscpy_tcscpy
strncpywcsncpy_mbsncpy_tcsncpy
sprintfswprintfsprintf_stprintf
_snprintf_snwprintf_snprintf_sntprintf
printfwprintfprintf_tprintf
fprintffwprintffprintf_ftprintf
fopen_wfopnfopen_tfopen
fgetcfgetwcfgetc_fgettc
atoiwtoiatoi_ttoi
strtolwcstolstrtol_tcstol
strtodwcstodstrtod_tcstod
 
  • MACRO定義
MSDN > MFC の MBCS/Unicode 変換マクロの使用
ここでは、AFXPRIV.H 中で定義されている MBCS/Unicode 変換用マクロの使用方法を説明します。これらのマクロは、OLE API を直接扱うようなアプリケーションや、なんらかの理由で Unicode と MBCS 間で変換を行う必要がある場合に便利です。
MSDN > ATL と MFC の文字列変換マクロ
ATL 7.0 には、いくつかの新しい変換クラスと変換マクロが用意されており、既存のマクロよりも機能が大幅に向上しています。
  • 注意事項
文字サイズの指定
下記のように宣言した場合、
wchar_t wcBuff[ 64 ];
サイズは下記のように指定する。
「char/wchar_t単位」・・・「64」or「sizeof( wcBuff ) / sizeof( wchar_t )」
「byte単位」・・・「sizeof( wcBuff )」
  • 関連情報
MSDN > さまざまな文字列型間で変換する
C++/CLI向けのサンプルだけど、.NET周りを除外すればNativeC++でも再利用可能なサンプルコード。
大西彰のウェブログ > Visual Studio 6.0のユーザの為の「Unicodeアプリケーションネタの整理」
最近のDXUTはUnicodeで作らねばいかんのです。
Unicodeバグについて
本文書は、このようなセキュリティ上の問題が存在する事を衆知徹底させる事を目的とする。
葉っぱ日記 > WindowsとUnicode
Windows 上で Unicode を扱う場合に発生するセキュリティ上の問題点などについて不定期に書いていくことにします。
葉っぱ日記 > Unicodeとセキュリティ

パス操作

CRT(ANSI)Win32Win32(Shell)MFC
_makepath-PathCombine-
_fullpathGetFullPathName
GetLongPathName
PathCanonicalize *27
PathResolve
AfxFullPath *28
-GetShortPathName--
--PathRelativePathTo-
_splitpathGetFileTitlePathGetDriveNumber
PathFindFileName
PathFindExtension
PathStripToRoot
PathStripPath
-
-GetModuleFileName
GetModuleFileNameEx
--
-GetModuleBaseName--
--PathRemoveBlanks-
--PathRemoveFileSpec-
--PathRenameExtension-
--PathUnExpandEnvStrings-
--PathCompactPathEx-
--PathCommonPrefix-
--PathUnquoteSpaces-
-PathGetCharType-
Shell Path Handling関数

フォルダ操作

CRT(ANSI)Win32Win32(Shell)
_mkdirCreateDirectory
CreateDirectoryEx
MakeSureDirectoryPathExists *29
SHCreateDirectory
SHCreateDirectoryEx
_rmdirRemoveDirectory-
_getcwd
_getdcwd
GetCurrentDirectory-
_chdirSetCurrentDirectory-
-GetWindowsDirectory
GetSystemWindowsDirectory
SHGetFolderPath
SHGetSpecialFolderPath
-GetSystemDirectorySHGetFolderPath
SHGetSpecialFolderPath

ファイル操作

CRT(ANSI)Win32Win32(Shell)
_searchenvSearchPath
SearchTreeForFile
-
_findfirstFindFirstFile
FindFirstFileEx
-
_findnextFindNextFile-
_findcloseFindClose-
-FindFirstChangeNotification-
-FindNextChangeNotification-
-FindCloseChangeNotification-
-ReadDirectoryChangesW-
-CopyFile
CopyFileEx
SHFileOperation
renameMoveFile
MoveFileEx
MoveFileWithProgress
SHFileOperation
-ReplaceFile-
remove
_unlink
DeleteFileSHFileOperation
Win32DeleteFile
_access-PathFileExists
_stat, _stati64GetFileAttributes
GetFileAttributesEx
-
_fstat, _fstati64GetFileType
GetFileTime
-
-GetFileInformationByHandle-
_lockingLockFile
UnlockFile
-
-GetPrivateProfileInt-
-GetPrivateProfileString-
-WritePrivateProfileString-
tmpnam, _tmpnam, _mktempGetTempFileName-
_futime, _futime64GetFileTime-
_utime, _utime64SetFileTime
TouchFileTimes
-
-GetFileVersionInfoSize-
-GetFileVersionInfo-
 
Open/Close/Seek
SystemCallstdio*30Win32
_creatCreateFile
_openfopenCreateFile
_sopen_fsopenCreateFile
freopen
_closefclose, _fcloseallCloseHandle
_fileno_fdopen
_eoffeof
_readfreadReadFile, ReadFileEx
_writefwriteWriteFile, WriteFileEx
_commitfflush, _flushallFlushFileBuffers
_lseek, _lseeki64fseek, _fseeki64, rewindSetFilePointer, SetFilePointerEx
fsetpos
_tell, _telli64ftell, _ftelli64
fgetpos
_filelength, _filelengthi64*31GetFileSize, GetFileSizeEx
_chsizeSetEndOfFile
__lock_fhandle_lock_fileLockFile, LockFileEx
_unlock_fhandle_unlock_fileUnlockFile, UnlockFileEx

日時

CRT(ANSI) *32Win32Win32(Shell)COM/OLE
time, _time64GetSystemTimeCoFileTimeNow
GetSystemTimeAsFileTime
_ftime, _ftime64
GetLocalTime
localtime, _localtime64SystemTimeToTzSpecificLocalTime
TzSpecificLocalTimeToSystemTime
gmtime
mktime
ctimeSHFormatDateTime
asctime
_strtime
difftime, _difftime64
CompareFileTime
FileTimeToDosDateTimeCoFileTimeToDosDateTime
DosDateTimeToFileTimeCoDosDateTimeToFileTime
FileTimeToSystemTime
SystemTimeToFileTime
FileTimeToLocalFileTime
LocalFileTimeToFileTime
DosDateTimeToVariantTime
VariantTimeToDosDateTime
SystemTimeToVariantTime
VariantTimeToSystemTime
  • 関連情報
SystemTimeToTzSpecificLocalTime 関数は、特定の Windows インストールで使用するアプリケーションを実行する場合、アプリケーションのパフォーマンスが非常に低い

GDI(Graphic Device Interface)

API名称用途
GetDialogBaseUnitsダイアログベース単位を取得
MapDialogRectダイアログベース単位を、スクリーン単位[Pixel]に変換
GdiFlush呼び出し側スレッドの現在のバッチをフラッシュします
GdiSetBatchLimit呼び出し側スレッドの現在のバッチに蓄積できる関数の最大数を設定
LockWindowUpdate指定されたウィンドウ内での描画を無効または有効にします
AlphaBlendαブレンド処理
TransparentBlt透過Bit転送
PathCompactPath縮めた形式のパスを取得
SetSysColors画面のデザインに使われている表示要素の色を設定
GetGuiResources指定されたプロセスが使っているGUIオブジェクトのハンドル数を返す
  • 関連
Platform SDK Redistributable: GDI+
This contains the redistributable files for GDI+.
gdi++.dll
gdi++.dll は、Windows のシステムファイルの一つ、 gdi32.dll の動作を横取りし、文字描画を担当する API をオーバーライドすることで、フォントの表示品質を改善します。
gdi++.dll(FreeType版)
gdi++.dll は、 Windows の gdi32.dll に代わってフォントのレンダリングを行い、これまでになく美しいスクリーンフォントを実現するオープンソースのソフトウェアです。
gdipp <BSD>
The gdipp (codename) project is a replacement of the Windows default text render, which brings to you the effect of text like Mac OS and Linux distributions. It is easy to use with unnoticeable overhead, and it is fully customizable. The project is originated as the relaunch of the suspended gdi++.dll project.
mactype <Apache License V2.0>
Ultimate font Rasterizer for Windows.

IME(Input Method Editor)

API名称用途
ImmDisableIMEプロセス内の1つのスレッドまたはすべてのスレッドのIMEを無効にする
  • 関連
MS-IME.h
This download provides the public MSIME.h API for use by developers when customizing applications for the 2007 Microsoft Office System.
IME 2000〜IME 2003, Microsoft IME, Office IME 2007〜Office IME 2010に対応。

レジストリ操作

Win32Win32(Shell)
RegCreateKeyEx-
RegDeleteKeySHDeleteKey, SHDeleteEmptyKey
RegOpenKeyEx-
RegCloseKey-
RegGetValueSHGetValue
RegSetValueExSHSetValue
RegQueryInfoKeySHQueryInfoKey
RegQueryValueExSHQueryValueEx
RegEnumKeyExSHEnumKeyEx
RegEnumValueSHEnumValue

浮動小数点制御

API名称用途
fmod浮動小数点数の剰余を計算。浮動小数値向けの%演算子
modf浮動小数点値を小数部分と整数部分に分割
_finite与えられた倍精度の浮動小数点値が有限であるかどうか
_fpclass浮動小数点のクラスの情報を含むステータス ワードを返す
_clear87
_clearfp
浮動小数点ステータス ワードを取得し、クリアする
_control87
_controlfp *33 *34
__control87_2
浮動小数点制御ワードの取得と設定を行います
_status87
_statusfp
_statusfp2
浮動小数点のステータス ワードを取得
_fpieee_fltIEEE 浮動小数点例外のユーザー定義トラップ ハンドラを呼び出します
Dealing with Floating-point Exceptions in MSVC7\8
VC++ 7.1の_control87()ではSSE2の浮動小数点例外制御ができないので、アセンブラで設定する必要があり、その設定例。

システム情報

API名称用途
GetSystemMetrics様々なシステムメトリックの値(表示要素の幅と高さ)とシステムの現在の構成を取得
GetNumberFormat指定した数字文字列を、指定したロケール用にカスタマイズされた数字文字列として書式化する
GetCurrencyFormat数字文字列を、指定したロケールの通貨文字列として書式化する
GetDateFormat日付を書式化して、指定されたローケルに対応する日付文字列を作成
GetTimeFormat時刻を書式化フォーマットして、指定されたローケルに対応する時刻文字列を作成
GetLocaleInfoコントロールパネルの「地域のオプション」情報の取得
GetDeviceCaps指定されたデバイスに関するデバイス固有の情報を取得
GetSystemInfo現在のシステムに関する情報(ページのサイズやプロセッサの種類など)を取得
GetNativeSystemInfoこちらはx64の環境でもちゃんと情報を取得可能。但しWindows XP以降で利用可能。
SystemParametersInfoシステム全体に関するパラメータのいずれかを取得または設定
LCTYPE ConstantsCURRENCYFMT構造体の設定値
localeconvロケールの設定に関する詳細情報を取得

システム終了・再起動

Power Management Functions
電源管理
システムシャットダウン
Microsoftサポートオンライン > [PRB] ExitWindowsEx API が Windows NT を再起動しません。
シャットダウン系のAPIを呼び出す場合は、SE_SHUTDOWN_NAME 特権を取得する必要がある。

Socket

CRT(ANSI)WinSockWinXP拡張 *35備考
socketWSASocket-
closesocket--
shutdown--
bind--
listen--
connectWSAConnectConnectEx
acceptAcceptEx
WSAAccept
-
--GetAcceptExSockaddrs
selectWSAAsyncSelect-
sendWSASend-
sendtoWSASendTo-
recvWSARecv-
-WSARecvFrom-
-TransmitFileTransmitPackets
ntohsWSAHtons-short型
htonsWSANtohs-short型
htonlWSAHtonl-long型
ntohlWSANtohl-long型
-WSAAddressToString-
-WSAStringToAddress-
 
  • 参考情報
KSK's Web Page
Winsock Programmer's FAQ(in Japanese)/Programming UNIX Socket FAQ等。
EternalWindows > ネットワーク > Winsock
Windows XP/Vistaで追加されたWSA系APIの解説有り。

シリアル通信

API名称用途
BuildCommDCB指定したDCB構造体に、デバイス制御文字列で指定した値を格納
BuildCommDCBAndTimeouts指定したDCB構造体に、デバイス制御文字列で指定した値を格納しデバイスのタイムアウト値の設定やタイムアウトの解除も可能
GetCommState指定した通信デバイスの現在の制御設定をDCB 構造体に格納
SetCommStateDCB 構造体の指定に従って通信デバイスを構成
GetCommTimeouts指定した通信デバイスで実行されるすべての読み書き操作のタイムアウトパラメータを取得
SetCommTimeouts指定した通信デバイスで実行されるすべての読み書き操作のタイムアウトパラメータを設定
SetCommConfig通信デバイスの現在の構成を設定
GetCommConfig通信デバイスの現在の構成を取得
GetCommProperties指定した通信デバイスの通信プロパティの情報を取得
ClearCommError通信エラーの情報を取得して、通信デバイスの現在の状態を通知
SetCommBreak指定した通信デバイスの文字送信を中断
ClearCommBreak指定した通信デバイスの回線切断状態を解除し、文字送信を再開
EscapeCommFunction指定した通信デバイスに、拡張機能を実行するよう指示
PurgeComm指定した通信資源の出力バッファまたは入力バッファにあるすべての文字を破棄
WaitCommEvent指定した通信デバイスでイベントが発生するのを待機
SetCommMask特定の通信デバイスで監視する一連のイベントを指定
  • 関連情報
Microsoft サポートオンライン > COM10 以上のシリアルポートを指定する方法
CreateFile() は、ファイル名に "COM1" から "COM9" を使用した場合は、正常に終了しますが、"COM10" またはそれ以上のポート番号を使用すると、"INVALID_HANDLE_VALUE"というメッセージが返されます。
Microsoft サポートオンライン > SetCommMask() による WaitCommEvent() のキャンセル

SIMD(Single Instruction Multiple Data)

VisualC++.NET 2003以降ではSSE/SSE2を利用するオプションが有る。
DotNET2003.png
少しでも速いコードを追い求める人は「link集/開発言語系/C++#Dev_Tech_FastCode」を参照方。
VisualC++.NET 2002以降で追加されたマニア向け?なAPI達。
API名説明
_aligned_malloc
_aligned_realloc
_aligned_free
通常はMMX/SSE向けに16byteアラインメントする。Intel C++ Compilerの組み込み関数 _mm_malloc/_mm_free と同義。define定義されているので、_mm_malloc/_mm_free でコードを書いてもビルド可能。
因みにstackで確保する場合は下記のようにする。
 __declspec(align(16)) float afData[ 1000 ];
_set_SSE2_enable以下の関数には、_set_SSE2_enable で有効にできる SSE2 の実装があります。
atan, ceil, exp, floor, log, log10, modf, pow
既定では、SSE2 の実装をサポートするプロセッサでは有効になっています。
__cpuidGenerates the cpuid instruction that is available on x86 and x64.
__cpuidexGenerates the cpuid instruction that is available on x86 and x64.
IsProcessorFeaturePresent搭載されているプロセッサが特定機能をサポートしているかどうかを調べる
  • 参考情報
MMX, SSE, and SSE2 Intrinsics
Dealing with Floating-point Exceptions in MSVC7\8
VC++ 7.1の_control87()ではSSE2の浮動小数点例外制御ができないので、アセンブラで設定する必要があり、その設定例。
Intel SDK for 45nm Next Generation Intel® Core™2 Processor Family and Intel® SSE4(Penryn SDK)
Windows環境向けのSSE4エミュレータDLLや、VisualStudio 2005のMASM向けのSSE4マクロが付属する。
Xbyak - x86, x64 JIT assembler - <BSD>
Xbyak(カイビャック)はx86(IA32), x64(AMD64, x86-64)のマシン語命令を生成するC++のクラスライブラリです. プログラム実行時に動的にアセンブルすることが可能なため, 柔軟な最適化(動的コード生成)が可能となります(利用シーン:量子化の高速化, 式の計算).
SSEPlus <Apache License V2.0>
SSEPlus is a SIMD function library. It provides optimized emulation for newer SSE instructions. It also provides a rich set of high performance routines for common operations such as arithmetic, bitwise logic, and data packing and unpacking.
  • 関連ページ
link集/開発言語系/AssemblyLanguage

デバッグ

CRT(ANSI)Win32MFCATL
-OutputDebugString--
-DebugBreakAfxDebugBreak-
abort-AfxAbort-
-IsBadCodePtr
IsBadReadPtr
IsBadWritePtr
AfxIsValidAddressAtlIsValidAddress
-IsBadStringPtrAfxIsValidStringAtlIsValidString
-IsDebuggerPresent--
_heapchk_CrtCheckMemoryAfxCheckMemory-
_CrtIsValidPointer
_CrtIsValidHeapPointer
--
-SetErrorMode--
-SymInitialize--
Microsoft Debugging Tools for Windows
Debugging Tools for Windows は、Windows NT 4.0、Windows 2000、Windows XP、Windows Server 2003、Windows Vista、および Windows Server コード名 "Longhorn" を実行しているシステムで、ドライバ、アプリケーション、サービス、およびオペレーティング システム自体をデバッグするのに使用できます。
  • 関連情報
社元@ワック Blog > IsBadReadPtr, IsBadWritePtr APIが禁止に - Windows Vista
Windows Vistaでは、IsBadReadPtr, IsBadWritePtr API が禁止(廃止?)になったらしい。
DebugInfo.com
CallStackを取ったりするサンプルの公開。

その他

AddERExcludedApplication() / ErrorRep.h / Faultrep.dll
Object Media Limited > Software Hints and Tips からの情報。
WindowsXP/WindowsServer2003上でアプリが落ちた時に表示されるエラー送信ダイアログの表示内容を変更する。
これで自分のバグをMicrosoftへ送信されるという恥ずかしい行為を防ぐ事が可能!?
BindImageEx
イメージをバインドするプロセスは、インポートされた各関数の仮想アドレスを計算する作業によって構成されています。次に、計算された仮想アドレスをインポート側のイメージのインポートアドレステーブル(IAT)に保存します。この結果、インポートされた各関数の仮想アドレスをシステムローダーが計算する必要がなくなるので、特にイメージが多くの DLL を使っている場合、イメージのロードが非常に高速になります。対応するシンボルファイルが見つかった場合、そのファイルのタイムスタンプとチェックサムを更新します。
社本@ワック Blog > 64bit版 Windows のバージョンの判別 - Windows System Information
IsWow64Process()を使うらしい。
備忘録
API名説明
_byteswap_uint64
_byteswap_ulong
_byteswap_ushort
ByteSwap関数と言えば今まで下記のAPI位しかなかった。
_swab, ntohs/htons, htonl/ntohl,
WSAHtons/WSANtohs, WSAHtonl/WSANtohl

COM(Component Object Model)

link集/Microsoft関連#COM
別ページを参照方。

ATL(Active Template Library)

Microsoft VisualC++ 技術資料
Microsoft VisualC++ 技術ドキュメント
Microsoftサポートオンライン > [INFO] ATL (Active Template Library) に関してよく寄せられる質問
  • Microsoft外
DevInstinct inc. > ATL Extension
Virtual Truth Lab.
Chris's Free Developer Tools
This is a set of .NET, COM and Win32 tools that Chris Sells has built and contributed to the world.
CodePlex > ATL Server Library and Tools <MS-LPL(Microsoft Limited Permissive License)>
ATL ServerがOSS化。
  • 関連書籍
ASIN:4756132804
ASIN:4797306890
ATL COMプログラミング―ATLとVisualC++で作る高性能COMコンポーネント (Programmer’s SELECTION)
Visual C++6.0 ATLによるCOMプログラミング入門
ASIN:0789727773
ATL Internals: Working with ATL 8 (Addison-Wesley Object Technology Series)

WTL(Windows Template Library)

SourceForge.net > Windows Template Library (WTL) <CPL>
Microsoft > Windows Template Library (WTL) 7.5
ライセンス周りが変更になっているのみでSourceForgeのWTLプロジェクトがリリースした WTL75 Final と同内容。
Microsoft > Windows Template Library (WTL) 7.1
  • 関連情報
http://www.codeguru.com/Cpp/COM-Tech/atl/
The CodeProject > WTL
WTL support list
WTLのML
IDevResource.com
Roy.'s Homepage
The So-Software Studio
Bohemian St. > CODING
P-Stade
かっとし の 記録場所

DDK(Device Driver Development Kit)

WHDC
Windows Developers Site
Windows Driver Foundation (WDF)
WDF は、カーネル モードまたはユーザー モードの、オブジェクト指向のイベント駆動型ドライバの作成をサポートする、単一のドライバ モデルを定義します。

Tutorial

CodeZine > カスタムプリントプロセッサで印刷機能を強化する
[中級] DDKのサンプルを利用したプリントプロセッサの自作

関連書籍

WindowsXPフィルタドライバプログラミング 入門と実践
ASIN:4797309814
WindowsNTデバイスドライバプログラミング (WINDOWS NT DEVICE DRIVER BOOK)
[入門と実践]WindowsVistaカーネルソフトウェア開発技法
ASIN:4797343222
Developing Drivers with the Windows Driver Foundation (Developer Reference)
  • WDM(Windows Driver Model)
Microsoft WDMプログラミング―WindowsXP対応 (Microsoft Programming Series)
ASIN:4756133959
WDMデバイスドライバプログラミング完全ガイド〈下〉 (アスキーアジソンウェスレイシリーズ―Ascii Addison Wesley programming series)
ASIN:4881358618
  • USB(Universal Serial Bus)
WindowsXPデバイスドライバプログラミング 入門と実践
ASIN:4434155520
USB 2.0とUSB On-The-Goを含むカスタムUSBデバイス開発のすべて USBコンプリート[第3版]
USBコンプリート―USB2.0を含むカスタムUSBデバイス開発のすべて
ASIN:4789833194
ASIN:4789838293
USB Design by Example: A Practical Guide to Building I/O Devices (Engineer-to-Engineer)
ASIN:4789834506

Tool

The Code Project > VC++7 to VC++6 project converter
VC++.NET2002のプロジェクト(*.vcproj, *.sln)をそれぞれVC++6.0のプロジェクト(*.dsp, *.dsw)に変換するプログラム。
  • 関連ページ
link集/開発補助ツール系#Profiler
プロファイラはこちらのページを参照方。
link集/Microsoft関連#VSAddIn
Add-in関連はこちらのページを参照方。

Tips

JunkBox
JIT(Just-In-Time)デバッガ設定についてはこちらのページを参照方。
VisualC++のmain関数
UNICODE版のまとめ
関数定義エントリポイント
ConsoleApp
+ ANSI
int main( int, char* [] )-
ConsoleApp
+ WIDE
int wmain( int, wchar_t* [], wchar_t* [] )wmainCRTStartup
ConsoleApp
+ Macro
int _tmain( int, TCHAR* [], TCHAR* [] )適宜使い分け
WindowApp
+ ANSI
INT WINAPI
WinMain( HINSTANCE, HINSTANCE, LPSTR, INT )
-
WindowApp
+ WIDE
INT WINAPI
wWinMain( HINSTANCE, HINSTANCE, LPWSTR, INT )
wWinMainCRTStartup
WindowApp
+ Macro
INT WINAPI
_tWinMain( HINSTANCE, HINSTANCE, LPTSTR, INT )
適宜使い分け
VisualC++の非MFCプロジェクトで TRACE, ASSERT が使いたい
<crtdbg.h>に、_RPT0〜_RPT4, _RPTF0〜_RPFT4, _ASSERT, _ASSERTE の定義有り。
<assert.h>のassert()を使用する事も可能。
IDE上でユーザ定義文字列の色付け
USERTYPE.DATというファイルを作成し、
# 「#」はコメント行として扱われる模様
# データ型
wchar_t
DWORD
BOOL
POINT
LRESUT
HANDLE
HWND
HICON
HBITMAP
# 定数
TRUE
FALSE
VC++のIDE(VC++6.0:msdev.exe, VC++.NET 2002以降:devenv.exe)の有る場所にコピーする。
VisualC++ 6.0
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
VisualC++ .NET 2002
C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE
VisualC++ .NET 2003
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE
VisualC++ 2005
C:\Program Files\Microsoft Visual Studio 8\Common7\IDE
IDEで開いているソースコードをテキストエディタで開く
VisualC++6.0 - IDEの[ツール(T)]->[カスタマイズ(C)...]の「ツール」タブで設定。
テキストエディタ名称「引数(A):」への設定内容
EmEditor v3/v4/l $(CurLine) "$(FilePath)"
K2Editor"$(FilePath)" /j$(CurLine)
秀丸エディタ/j $(CurLine) $(FilePath)

VisualC++.NET2002以降 - IDEの [ツール(T)]->[外部ツール(E)...] で設定。
テキストエディタ名称「引数(R):」への設定内容
EmEditor v3/v4/l $(CurLine) "$(ItemPath)"
K2Editor"$(ItemPath)" /j$(CurLine)
秀丸エディタ/j $(CurLine) $(ItemPath)
サクラエディタ"$(ItemPath)" -Y=$(CurLine)
MKEditor/J $(CurLine) "$(ItemPath)"
Warning: no message line prompt for ID 0xE001.
MFCで作成したプロジェクトで文字列リソースを全て削除しているとVC++のアウトプットウィンドウに下記メッセージが表示される。
Warning: no message line prompt for ID 0xE001.
原因はMFC内部で利用する「AFX_IDS_IDLEMESSAGE = 0xE001(57345)」に対応する文字列が未登録になる為。
リソースに下記内容を登録する事で回避可能。
STRINGTABLE PRELOAD DISCARDABLE 
BEGIN
    AFX_IDS_APP_TITLE       "MfcApp"
    AFX_IDS_IDLEMESSAGE     "Ready"
END
  • Microsoftサポート情報
[HOWTO] クラスの内部および外部にある STL コンポーネントをエクスポートする方法
Visual C++ 5.0 以降、テンプレート クラスのインスタンス生成を強制し、インスタンス化したものをエクスポートすることが可能になりました。
現在エクスポートできる唯一の STL コンテナは vector です。そのほかのコンテナ (つまり、map、set、queue、list、deque) にはすべて、ネストしたクラスが含まれており、エクスポートすることはできません。
  • MSDN ライブラリ
コンパイラの警告 (レベル 1) C4995
「deprecated」プラグマを利用して、もう使って欲しくないI/Fを使用している場合に警告を出す方法。
コンパイラの警告 (レベル 1) C4353
これからは「(void)0」ではなく「__noop」(NoOperationの意味?)を使用する。
Visual C++ 6.0 と Visual C++ .NET の主な違い
The new and delete Operators
VC++ .NET 2002以降では、「thrownew.obj」をリンクする事で「std::bad_alloc」例外を投げるようになります。
但し、それは通常のC++プログラムの場合の話で、MFCの場合は今まで通り「CMemoryException」例外なので注意。
Extraview Ltd - VC Tips(WebArchive) - newの失敗時にstd::bad_alloc例外を投げないVC++のnewを例外を投げるようにする方法。
Resources in Static Libraries?
Static Libraryにリソースデータを組み込んでみようという試み。
Deep C++
予約名等の情報。よくやりがちなdefine定義で「_(アンダーバー)」で始まる定義を使用すると規約違反となるので注意。
ウォッチ変数の書式指定記号
次の表の書式指定記号を使って [クイック ウォッチ] ダイアログ ボックスやウォッチ ウィンドウの変数の表示書式を変更できます。
浮動小数点数の精度の低下
通常、浮動小数点 10 進値には正確な 2 進表現がありません。これは、CPU による浮動小数点データの表現方法に起因するものです。このため、精度が減少したり、浮動小数点演算で予期しない結果になることがあります。
Visual C++/MFCに関するFAQ
古い情報。
__super
The __super keyword allows you to explicitly state that you are calling a base-class implementation for a function that you are overriding.
注釈を使って C/C++ のコード障害を減らす方法, Header Annotations
Win32API関数のヘッダ定義に付いている__in/__out等の注釈の解説。

VisualC++ 2010

[ツール]-[オプション]-[プロジェクト及びソリューション]-[VC++ディレクトリ]の移動先
プロジェクトの[プロパティ]-[VC++ディレクトリ]
プロパティシートの「Microsoft.Cpp.Win32.user*36」に設定情報は保存されている。

VisualC++ 2005

Certain code functions may not behave as expected when you use Unicode information in Visual C++
std::fstream 複数バイト文字が含まれているパス上のファイルへのアクセス
wcoutのlocale
VisualC++ 2005ではUnicodeのサポートが強化された代わりに、ロケール情報を正しく設定していないとSTLのストリーム系関数でマルチバイト文字列を処理する際に不具合が発生する。対処方法としては下記のようにロケールの宣言を明記する。
  • STL
    #include <locale>
    int main() // WinMain()/CXXXApp::CXXXApp()/・・・
    {
        std::locale::global( std::locale("japanese") );
        ・・・
    }
  • Win32
    #include <locale.h>
    int main() // WinMain()/CXXXApp::CXXXApp()/・・・
    {
        (void)::_tsetlocale( LC_ALL, _T("japanese") );
        ・・・
    }
_CrtDbgReport: String too long or IO Error
TRACEマクロにマルチバイト文字列を指定すると発生。解消方法としては上記のロケール宣言を行う。
WindowsXPでデバッガを起動すると固まる
MS-IMEが原因。
解決策 Д灰鵐肇蹇璽襯僖優襪痢崔涌茲噺生譴離プション」->「言語」タブ->「詳細」ボタン->「詳細設定」タブ->「詳細なテキスト サービスをオフにする」にチェックを入れる
解決策◆Justsystem社のATOKを利用する。こちらがお薦め。
タスク一覧のコメントを作成する
TODO:, HACK:, UNDONE:等の文字列をソースコードのコメントに入れておくとタスク一覧で管理可能。
<stdint.h> for Visual C++
Visual C++ 7.1/8.0で使用可能な<stdint.h>

VisualC++ 6.0

VisualC++ 6.0 の[ツール(T)]-[オプション(O)...]-[ディレクトリ]の設定内容の保存場所
DirectX SDKのアンインストール時にぶっ壊れた事があったので。
HKEY_CURRENT_USER
+Software
 +Microsoft
  +DevStudio
   +6.0
    +Build System
     +Components
      +Platforms
       +Win32 (x86)
        +Directories
VisualC++ 6.0のプロジェクトファイルの複数起動
標準では、プロジェクトファイル(*.dsp/*.dsw)のDDE(Dynamic Data Exchange)機能が有効になっており、IDEが複数起動するのを抑止している。この機能を無効にすると複数起動するようになる。
VCPP60_PROJECT.png
VC++6.0(Professional/Enterprise)のプロファイラ機能の利用方法
普通に利用するのは難しい模様。
Gen'ya Sakruai's Web Pages > G.R.I.D. > Visual C++ のprofile機能(プロファイラ)を使ってみたい
水無瀬の部屋 > Programming Tips > Visual C++
VisualC++で特定の拡張子をC/C++のソースとして認識させる
Microsoftサポートオンライン > How to make Visual C++ recognize file extensions as C/C++ files
「*.hh」のファイルをVC++6.0で「*.h」と同様に認識させるには、レジストリの下記の値を変更するとうまくいった。
HKEY_CURRENT_USERSoftwareMicrosoft
 DevStudio
  6.0
   Text Editor
    Tabs/Language Settings
     C/C++
      FileExtensions
(変更前)
cpp;cxx;c;h;hxx;hpp;inl;tlh;tli;rc;rc2
(変更後)
cpp;cxx;c;h;hh;hxx;hpp;inl;tlh;tli;rc;rc2

Tips集へのLink

Belution.com > VisualCフォーラム > アプリケーションエラーとMapファイル
ビルド時に生成される*.mapファイルを使って、Releaseビルドのプログラムで落ちた場所を特定する方法。
秀まるおのホームページ > おまけ 開発者向け情報
__try〜__exceptハンドラの利用方法。
The Code Project - Message with sytle
VC++の #pragma message でタグジャンプ出来るようにするマクロ。VC++の6.0/7.0/7.1/8.0/9.0で動作確認済み。VC++6.0〜7.1ならF4キー、VC++8.0以降ならF8キーで飛べる。
#pragma message( __LOC__ "FixMe!" )
上記の内容をhoge.cppに記述すると、アウトプットウィンドウに以下の内容が出力される。
C:hogehogehoge.cpp(777) : Warning Msg: FixMe!
Kawanoの備忘録 > 日曜プログラムの墓場 (2006/03/17)
Tips集。
VALGUS - Orange Knowledge
MFC/Win32SDK/Game/DirectX Tips
Still Green > Knowledge > プログラム(VC++) (2007/10/22)
キーボード押しっぱなし確認の判定方法等。WebArchive
株式会社ワックドットコム > for Programmers 〜プログラマーのためのTips集〜
COM/Shell関連多数。
void nish > Articles
The Code Projectにも寄稿しているTips集。
Cycle of 5th > Tips > 開発

*1 afxver_.hにて定義
*2 atldef.hにて定義
*3 VisualStudio.NET 2003でx64なバイナリを作成できるコンパイラを含むのでVisualC++ .NET 2003でx64なプログラム開発する際にも必要。但しVisualStudio 2005のリリース後にはx64サポートは打ち切られる
*4 プリコンパイル済みヘッダ(StdAfx.h)に「#define WINVER 0x502」を定義しないとSocket周りでビルドエラーが出る。WINVERの定義により_WIN32_WINNT, _WIN32_WINDOWS, _WIN32_IEも適切な値が設定されるので自前で定義しない事
*5 プリコンパイル済みヘッダ(StdAfx.h)に「#define WINVER 0x502」を定義しないとSocket周りでビルドエラーが出る。WINVERの定義により_WIN32_WINNT, _WIN32_WINDOWS, _WIN32_IEも適切な値が設定されるので自前で定義しない事
*6 Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う 但し、この説明ではPlatformSDKのMFC/ATLを使用するような設定は行っていない
*7 CreateThread()で作成したスレッドでCRT関数を呼び出すとMemoryLeakする。http://support.microsoft.com/kb/104641
*8 VisualC++ .NET 2003以降
*9 VisualC++ .NET 2003以降
*10 Platform SDK February 2003やVisualC++ .NET 2003以降
*11 SetEnvironmentVariable()で設定したものはgetenv()で取得不可、逆に_putenv()したものはGetEnvironmentVariable()でも取得可能
*12 SetEnvironmentVariable()で設定した値も取得可能
*13 A : char/wchar_t単位, B : byte単位
*14 WindowsVista以降
*15 WinXP SP2以降
*16 A : char/wchar_t単位, B : byte単位
*17 浮動小数点値の出力「%f」に未対応なので注意
*18 浮動小数点値の出力「%f」に未対応なので注意
*19 浮動小数点値の出力「%f」に未対応なので注意
*20 浮動小数点値の出力「%f」に未対応なので注意
*21 VC++6.0以下はiomanip.h、VC++6.0以降はiomanipに定義あり。
*22 VisualC++ .NET 2002以降
*23 VisualC++ .NET 2002以降
*24 利用時はsetlocale等でロケール設定を忘れずに
*25 *.libファイルは提供されないので、LoadLibrary()して利用する。
*26 WideCharToMultiByte()の戻り値は、wcstombs()とは異なりNull文字分も含めた値が返る
*27 PathCanonicalize()はディレクトリの区切り文字は '\' のみで '/' は認識されない。
*28 #include <../src/mfc/afximpl.h>
*29 MakeSureDirectoryPathExists() で「C:¥A¥B¥C」というフォルダを作成したい場合、引数には「C:¥A¥B¥C¥」と指定する必要がある。「C:¥A¥B¥C」とした場合「C:¥A¥B」までしか作成されないので注意。
*30 API名に「_nolock」を付けるとスレッドのロックを行わないバージョンになる
*31 fseekで終端に移動し、ftellで位置取得により代用
*32 「_XXXX64()」となっているAPIは、VC++ .NET 2002以降で利用可能。これらは2039年問題対策用のAPIであると思われる。
*33 「_controlfp( 0, _MCW_EM );」というのをmain関数にいれてみたら至る所で例外でまくり・・・orz。__try〜__except節と_fpieee_fltを使用すれば例外の捕捉は可能。
*34 浮動小数点に関しては、Wikipediaの IEEE754(ja) / IEEE754(en) が詳しい。
*35 Windows Server 2003 SP1 Platform SDKに定義あり
*36 Win32の部分はプラットフォーム毎に変わる

ページ先頭へ   最終更新のRDF 最終更新のRSS
Last-modified: 2013-10-21 (月) 23:23:12 (1283d)
Valid XHTML 1.1 Valid CSS! [Valid RSS]