#author("2018-05-26T13:18:21+09:00","default:mat2umoto","mat2umoto") #contents *Visual C++ 6.0 [#r4c08b2a] **開発環境の操作 [#f0be17d1] ***ソースコードの自動整形 [#b45f9d9f] Alt+F8 で選択範囲のコードの自動整形ができる。 ***関数の定義位置の参照 [#t8f4593b] |キー|機能|h |F12|選択している関数の定義位置へ| |Ctrl++|次の参照へ| |Ctrl+-|前の参照へ| |Ctrl+*|参照前の位置へ戻る【重要】| ***カーソル位置の前後の関数定義位置へ移動 [#j53ede40] メニューの、「ツール」-「カスタマイズ」の「キーボード」タブで、カテゴリから 「ウィザードバー」を選択し、以下のコマンドを好きなショートカットに登録する。 |コマンド|機能|ショートカットキーの例|h |WBGoToPrevious|前の関数定義位置へ|Ctrl+,| |WBGoToNext|次の関数定義位置へ|Ctrl+.| ***ユーザ定義キーワード [#g3ddb4dc] 以下のファイルを作成し、1行に1ワードずつキーワードを登録すると、VC++上でユーザ定義キーワードとして認識してくれる。(エディタでキーワードの文字色を変更可能)~ →C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\usertype.dat -記入例 BOOL BYTE DWORD FLOAT INT : ***ウォッチリスト(クイックウォッチ) [#p13d6fc2] -レジスタの内容を見る |シンボル名|意味|h |@EAX|下位関数から制御が返った直後に指定すると、戻り値が見られる。| |@ERR|直近で発生したエラー番号。"@ERR,hr" とすることで、エラーメッセージも見られる。| 「@」を先頭に付けることで、レジスタであることを明示できる。(使用している変数名とカブっても大丈夫) -書式指定(一例) 「変数名,xxx」と入力する。 |書式|意味|例|h |x または X|16進表示|変数名, x| |数値|配列やポインタの展開要素数の指定|配列名(ポインタ変数名), 10| -コンテキスト演算子 「{func}変数名」と入力する。~ ある関数のローカル変数をウォッチしている際、コールスタックウィンドウで別の関数を表示してもウォッチし続けることができる。 ***プリプロセス後のコード [#ha928266] プリプロセッサが処理した直後のコード(#で始まる命令が展開された状態)を出力することができる。~ 「プロジェクト」-「設定」の「C/C++」の「プロジェクトオプション」に以下のコマンドを追加する。~ ※MFCを使用している場合、MFCのヘッダのプリプロセスまで行うため、関係無いコードが大量に生成されるので注意。 |/E|「ビルド」ウィンドウ(またはファイル)に、プリプロセッサが展開したソースを出力する。 | |/EP|/Eと同様だが、出力の際に「#line」(元のソースの何行目かを示す情報)を出力しない。| |/C|出力の際に、コメントを残す。 ソースのコメントは削除される。(/Eや/EPと一緒に指定する) | |/P|展開結果をファイルに出力する。(/Eや/EPと一緒に指定する)| ***外部プログラム登録 [#h548f1cf] メニューの、「ツール」-「カスタマイズ」の「ツール」タブで、外部プログラムを登録可能。 -サクラエディタの登録例 コマンド:C:\Program Files\sakura\sakura.exe 引数 :"$(FilePath)" "-Y=$(CurLine)" "-X=$(CurCol)" ※さらにCtrl+Enterなどのショートカットで呼び出せるようにすると便利。 -エクスプローラの登録例 コマンド:explorer.exe 引数 :/e, /select, "$(FilePath)" ※さらにShift+Enterなどのショートカットで呼び出せるようにすると便利。 **プロジェクトの設定 [#g2ed31cb] ***プロジェクト名称の変更 [#n981ce59] +関連ファイルに含まれるプロジェクト名称を全てgrep置換する。~ ※置換するときは大文字小文字を区別して行う。 ++大文字のみの文字列をgrep置換。(マクロ定義など) ++大文字小文字を混ぜた文字列をgrep置換。 +プロジェクトのファイル名も変更していく。~ ※resフォルダ内のファイル名も忘れずに ***エディット・コンティニュー [#w4198cc0] デバッグ中にソースコードを修正したときに、その場でビルドしてデバッグを継続できる機能。~ 有効になっていると、ステップインなどをすることで自動的にビルドされる。「Atl+F10」で明示的に変更を適用することもできる。~ &br; 有効にするには、以下の設定を行う。 +メニューの「プロジェクト」-「設定」の、「C/C++」タブの「一般」カテゴリの「デバッグ情報」で、「エディット・コンティニュー用のプログラムデータベース」を選択する。 +メニューの「プロジェクト」-「設定」の、「リンク」タブの「カスタマイズ」カテゴリの「インクリメンタルリンクを有効にする」をONにする。 ***ヒープ領域のサイズ変更 [#qe140d35] リンカオプションに使用するヒープ領域を変更するコマンドがある。デフォルトでは1MBに設定されている。 /HEAP:reserve [,commit] mallocを大量に呼び出す処理に対して、デフォルト設定とヒープ領域100MBとの比較を行ったが、デフォルトで7分かかる処理が10秒ほど短くなっただけで、速度の違いはあまり感じられなかった。 ***プロジェクト配下のファイルについて [#o2f0fbcf] 参考: http://support.microsoft.com/kb/132340/ja -プロジェクトの構成ファイル |.dsw|ワークスペースファイル|1つ以上のプロジェクトを含むワークスペース。| |.dsp|プロジェクトファイル|ビルドを実行する単位となる。| |.mak|メイクファイル|ビルドの詳細が記録されたファイル。| |.dep|依存関係|プロジェクトの依存関係。&br;ビルドを行う順番に影響する。| |.ncb||インテリセンス用の情報を保持するファイル&br;ウィザードバーやクラスツリー、入力補間のためのクラス情報等。| |.opt|オプションファイル|ビルドに直接影響しない類のプロジェクトの設定情報。&br;コンパイルオプションなどの設定や、ブラウザデータベース作成の有無等。| |.aps|バイナリリソースファイル|処理の高速化のためにrcファイルから作成される。&br;rcファイルを直接編集しても変更が反映されない場合は消してみる。| |.clw|クラスウィザード|クラスウィザードの情報。| ※ncb, opt, aps, clw は、消しても自動的に作成される問題ない。 -ビルドによって作成、使用されるファイル |obj|オブジェクトファイル|ソースファイルがコンパイルされたファイル。| |pch|プリコンパイル済みヘッダファイル|処理の高速化のため、予めコンパイルされたヘッダファイル。| |res|リソースファイル|apsファイルがコンパイルされたファイル。| |sbr|シンボルファイル|ソースファイルごとのシンボル情報。| |bsc|ブラウザ情報ファイル|アプリケーションのシンボル情報。&br;sbrファイルがBSCMAKEによってリンクされて生成される。| ***カスタムビルド [#we83f67b] カスタムビルドを設定しておくことで、ビルド終了後に生成ファイルのコピー等の操作を自動で行うことができる。~ 入力欄には、プロジェクトに関連するファイル名やパス名などのマクロを使用可能。~ 出力として登録されたファイルとタイムスタンプを比較し、生成ファイルの方が新しい場合のみ処理を行う。~ -生成されたexeファイルをコピーする例 ~説明 カスタム ビルド ステップを実行中 - $(InputPath) ~コマンド copy "$(InputPath)" "C:\CopyDst" ~出力 C:\CopyDst\$(InputName).exe ***プリコンパイル済みヘッダーの使用 [#i363fd28] 新しくプロジェクトを作成した場合、デフォルトで「プリコンパイル済みヘッダーを使用」する設定が行われ、「このヘッダーまで」のエディットボックスに「stdafx.h」が入力された状態となる。~ これは、「#include "stdafx.h"」までのコードの替わりにプリコンパイル済みヘッダーファイル(*.pch)の内容を用いる、という意味である。~ そのため、プリコンパイル済みヘッダーを使用する場合は以下の点に気をつける必要がある。 -全てのソースファイル(*.c, *.cpp ...)に「#include "stdafx.h"」を記述する必要がある。記述していない場合はコンパイルエラーとなる。 -ソースファイル中の有効なコードの一番初めに「#include "stdafx.h"」を記述する必要がある。途中に記述した場合、それまでのコードは全て無効になってしまう。 **リソースエディタ [#gb75e76b] **アドイン/マクロ [#i8f68d02] ***エディタウィンドウのタブ化 [#q116f5e7] http://www.wndtabs.com/ 一部の拡張機能を除いて無料で使用できる。~ 言語DLLには日本語は含まれていないが、リソースエディタを使って自力で日本語化はできそう。 **その他 [#o2c44308] ***MSDNサポートページ [#e322b996] http://www.microsoft.com/japan/msdn/vs_previous/visualc/ ***サービスパックのバージョンの確認方法 [#s9ebd512] レジストリの、'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\ServicePacks' に登録されているキーを確認する。~ または、VBが一緒にインストールされていれば、VB起動時のスプラッシュウィンドウでも確認できる。 ***dswファイルのダブルクリックによる多重起動 [#xe0ce505] 以下の設定を行う。~ →エクスプローラの「フォルダオプション」-「ファイルの種類」で、dsw ファイルの「詳細設定」の[MSDEVで開く]の編集で、[DDEを使う]のチェックをはずす。 ***逆アセンブル [#l1e06c20] VisualStudio付属のコマンドでexeファイルをasmファイルに変換できる。 dumpbin /DISASM /rawdata xxx.exe > xxx.asm ***ツールバーのボタンイメージの追加 [#s2cbac1c] 自作マクロをツールバーに登録する際や既存のツールバーアイコンを変更する際などに、ボタンイメージを選択することができる。~ しかし既存で用意されているボタンイメージは37種類と少ないため、自分で追加する方法を示す。~ &attachref(001.PNG); #br 「C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Bin」にインストールされている「DEVSHL.DLL」をフリーのリソースエディタ等で開く。(要バックアップ)~ Bitmapリソースの「21199」がボタンイメージ。最初は16x16のアイコンが37種類なので592x16のビットマップとなっているが、追加したいイメージの分だけ横幅を広げる(60個のボタンイメージなら960x16)と、VisualStudio起動時にボタンイメージを自動認識してくれる。~ 正規の追加手順がありそうだが、不明。 **不具合/注意点 [#y3a4b87e] ***プロジェクトの設定の「プロファイルを行う」チェックボックスの不具合 [#g4b7aa97] -現象 ~メニューの「プロジェクト」-「設定」の、「リンク」タブの「一般」カテゴリで、「プロファイルを行う」のチェックをクリックしてもONに変更できない。 -原因 ~「インクリメンタルリンクを有効にする」というチェックボックスが重ねられているようで、フォーカスをとられてしまっている。 -対策 ~マウスを使用せず、キー操作(Tabキー、Eキー)でチェックを切り替える。 ***デバッグ中のフリーズの原因のひとつ [#q90d1289] Windows XP で標準インストール、起動されているテキストサービスというアプリケーションと相性が悪いらしい。~ [[コントロールパネルからOFFにする:http://www.atmarkit.co.jp/fwin2k/win2ktips/630ctfmon/ctfmon.html]]ことで、多少フリーズが改善される。 ***MFCプロジェクトにATLオブジェクトを追加する際のエラー [#kc575b01] 「オブジェクトの作成中にエラーが発生しました。」というエラーが表示される場合があるが、無視して再度ATLオブジェクトを追加すればよい。~ http://support.microsoft.com/kb/q198537/ ***Platform SDK(Win32APIを含むSDK)のバージョン [#n1313ffc] VC++6.0に付属しているSDKのコードは1998年のもののため、Win2K以降に実装された機能など、一部の機能は使用することができない。 ~例)~ -リストビューコントロールのソート状態を示す三角マーク -タスクトレイ上のバルーンチップ ~新しいバージョンのSDKを導入する場合の注意。~ VC++6.0は2003年2月にリリースされたSDK(February 2003 Edition)までしか対応しておらず、それより新しいSDKをインストールしてしまうとリンクエラーが起きてしまうらしい。(アンインストールすれば戻る) ~DL: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm~ 参考: http://d.hatena.ne.jp/linden/20060301/p2 ***COMサーバ(EXE形式)にウィザードによって追加されるコード [#fda9b08a] ATLを使用したCOMサーバの設計で、ウィザードを使用してメソッドやプロパティを追加した場合、自動的に対応するメンバ関数がクラスに追加される。このメンバ関数の先頭には、モジュールの状態を切り替えるためのコードが自動挿入されているがEXE形式のCOMサーバの場合は誤ったコードが追加される。(DLL形式用のコードが追加されている?)~ 以下の誤ったコードが追加されてしまうため、 #code(c){{ AFX_MANAGE_STATE(AfxGetStaticModuleState()) }} 以下のように修正する必要がある。 #code(c){{ AFX_MANAGE_STATE(AfxGetAppModuleState()) }} 誤ったコードのままだと、AfxGetApp()でモジュールのオブジェクトを取得しようとするとNULLが返される等の問題が発生する。~ 参考: http://support.microsoft.com/kb/231592/ja ***警告レベル4で<windows.h>を使用したCファイルをコンパイルするときの警告 [#m0bd060e] 警告レベル4で、<windows.h>をインクルードした *.c をコンパイルすると、以下の警告が出力される。~ (*.cpp では警告は出力されない) warning C4115: '_RPC_ASYNC_STATE' : 関数の仮引数リストで構造体、共用体、列挙型の定義に使われました。 windows.h の中でインクルードしている rpcasync.h で警告が出力されてしまう。 実害はないようなので無視するか、以下のようなコードを書けばよい。 #code(c){{ #define WIN32_LEAN_AND_MEAN // windows.h 内でのヘッダのインクルードを必要最小限に抑える #include <windows.h> : }} ***シングルトンが正しく機能しない現象 [#w6c688b2] 参考:http://www.codeproject.com/Articles/19084/Visual-C-2003-Meyers-Singleton-Bug~ Scott Meyers が著書「More Effective C++」に記載したシングルトンを用いると、インスタンスが複数生成されてしまう問題がある。一言でいうと「静的変数を利用した初期化チェックが正しく機能しない」状態となってしまう。~ ~ 具体的には、以下の条件を満たすシングルトンクラスで問題が発生する。~ -VC++2003以前のコンパイラを使用している(VC6含む) -コンパイルオプションの最適化がON(Releaseビルド) -シングルトンクラスのヘッダファイルにインスタンス取得関数を''定義''している -複数のソースファイルでそのヘッダファイルをincludeし、かつ複数のソースファイルからインスタンス取得関数を呼び出している #code(c){{ class CFoo { public: static CFoo *GetInstance() { static CFoo it; return ⁢ } : }; }} 静的変数 it はプログラムの実行後の最初の1回しか初期化(CFooクラスのインスタンス生成)が行われないことが期待される。しかし、各ソースファイルからの呼び出しで、静的変数の初期化済みチェックが異なるメモリの値を使用して行われてしまい、ソースファイルの数だけ初期化されてしまう恐れがある。~ (VC6によって生成されたアセンブラコードでこの問題を確認済み) ***KernelのDLLのシンボルファイルが読み込まれない [#rcdf9d93] user32.dllやkernel32.dllなど、OSが提供するDLLも対応するシンボルファイル(*.pdb)が用意されていればデバッグ時にシンボル名を表示することができる。~ しかし、VC6をWinXP以降で動作させている場合はこの機能が働かない。(たとえsyetem32フォルダに対応するpdbファイルがあったとしても)~ 例外で、MFC42D.dllなどMFC関連のdllに対応するpdbは読み込まれる模様。 ***リソースエディタの制約 [#r06006a0] -ストリングテーブルに追加できるのは6144個まで。ただし、それ以上でもビルドは通る。~ rcファイルとヘッダファイルにエディタを使用して追加すれば6145以上追加することが可能。 *Visual C++ .NET 2002~ [#na5ff6d4] **プロジェクトの設定 [#ra6d60f8] ***str関数使用時の警告の消し方 [#x092e05c] C標準ライブラリの文字列を扱う関数(str系やscanf等)を使用すると警告が出る。バッファオーバフローの危険がある関数に対しての警告らしい。(strn~や、lstr~を使用すべきということ?)~ 警告を消すには、 -プロジェクトに警告を無視するオプションを指定する。~ →プロジェクトのプロパティ画面の、「構成」-「C/C++」-「コマンドライン」に「/wd 4996」と入力する。 -#pragmaを使用して警告を無視する。~ #pragma warning(disable:4996) -マクロ定義を使用する。 #define _CRT_SECURE_NO_DEPRECATE 1 #br 上記の設定はいずれも警告を無視する方法なので、好ましくはない。本来は、str関数等を安全な関数に置換すべき。~ 例)strcpy() → strcpy_s() 自分でgrepして置換していってもよいが、以下のマクロ定義を指定することで自動的に安全な関数に置換して処理してくれる。 #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 ***デバッグ時にステップ実行ができない場合の対処 [#fbf61e98] DLL等のデバッグ時など、ソースファイルが存在するのに「現在の場所のソースコードを表示できません」とメッセージボックスが表示され、ステップ実行できなくなる場合がある。~ そのときは、開発環境の「ツール」-「オプション」-「デバッグ」の「元のバージョンと完全に一致するソースファイルを必要とする」のチェックを外すと、直ることがある。 **その他 [#a76f07a9] ***ソリューションファイル(*.sln)について [#l1526c56] ソリューションファイルは、Microsoft Visual Version Selector というソフトによって内容が解析され、適切な種類・バージョンのIDEが選択される。~ -Microsoft Visual Version Selector ~C:\Program Files\Common Files\Microsoft Shared\MSEnv\VSLauncher.exe -slnファイルのアイコンを管理するDLL ~C:\Program Files\Common Files\Microsoft Shared\MSEnv\VSFileHandler.dll