Visual C++ 6.0 Edit

開発環境の操作 Edit

ソースコードの自動整形 Edit

Alt+F8 で選択範囲のコードの自動整形ができる。

関数の定義位置の参照 Edit

キー機能
F12選択している関数の定義位置へ
Ctrl++次の参照へ
Ctrl+-前の参照へ
Ctrl+*参照前の位置へ戻る【重要】

カーソル位置の前後の関数定義位置へ移動 Edit

メニューの、「ツール」-「カスタマイズ」の「キーボード」タブで、カテゴリから 「ウィザードバー」を選択し、以下のコマンドを好きなショートカットに登録する。

コマンド機能ショートカットキーの例
WBGoToPrevious前の関数定義位置へCtrl+,
WBGoToNext次の関数定義位置へCtrl+.

ユーザ定義キーワード Edit

以下のファイルを作成し、1行に1ワードずつキーワードを登録すると、VC++上でユーザ定義キーワードとして認識してくれる。(エディタでキーワードの文字色を変更可能)
→C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\usertype.dat

  • 記入例
    BOOL
    BYTE
    DWORD
    FLOAT
    INT
    :

ウォッチリスト(クイックウォッチ) Edit

  • レジスタの内容を見る
    シンボル名意味
    @EAX下位関数から制御が返った直後に指定すると、戻り値が見られる。
    @ERR直近で発生したエラー番号。"@ERR,hr" とすることで、エラーメッセージも見られる。
    「@」を先頭に付けることで、レジスタであることを明示できる。(使用している変数名とカブっても大丈夫)
  • 書式指定(一例) 「変数名,xxx」と入力する。
    書式意味
    x または X16進表示変数名, x
    数値配列やポインタの展開要素数の指定配列名(ポインタ変数名), 10
  • コンテキスト演算子 「{func}変数名」と入力する。
    ある関数のローカル変数をウォッチしている際、コールスタックウィンドウで別の関数を表示してもウォッチし続けることができる。

プリプロセス後のコード Edit

プリプロセッサが処理した直後のコード(#で始まる命令が展開された状態)を出力することができる。
「プロジェクト」-「設定」の「C/C++」の「プロジェクトオプション」に以下のコマンドを追加する。
※MFCを使用している場合、MFCのヘッダのプリプロセスまで行うため、関係無いコードが大量に生成されるので注意。

/E「ビルド」ウィンドウ(またはファイル)に、プリプロセッサが展開したソースを出力する。
/EP/Eと同様だが、出力の際に「#line」(元のソースの何行目かを示す情報)を出力しない。
/C出力の際に、コメントを残す。 ソースのコメントは削除される。(/Eや/EPと一緒に指定する)
/P展開結果をファイルに出力する。(/Eや/EPと一緒に指定する)

外部プログラム登録 Edit

メニューの、「ツール」-「カスタマイズ」の「ツール」タブで、外部プログラムを登録可能。

  • サクラエディタの登録例
    コマンド:C:\Program Files\sakura\sakura.exe
    引数  :"$(FilePath)" "-Y=$(CurLine)" "-X=$(CurCol)"
    ※さらにCtrl+Enterなどのショートカットで呼び出せるようにすると便利。
  • エクスプローラの登録例
    コマンド:explorer.exe
    引数  :/e, /select, "$(FilePath)"
    ※さらにShift+Enterなどのショートカットで呼び出せるようにすると便利。

プロジェクトの設定 Edit

プロジェクト名称の変更 Edit

  1. 関連ファイルに含まれるプロジェクト名称を全てgrep置換する。
    ※置換するときは大文字小文字を区別して行う。
    1. 大文字のみの文字列をgrep置換。(マクロ定義など)
    2. 大文字小文字を混ぜた文字列をgrep置換。
  2. プロジェクトのファイル名も変更していく。
    ※resフォルダ内のファイル名も忘れずに

エディット・コンティニュー Edit

デバッグ中にソースコードを修正したときに、その場でビルドしてデバッグを継続できる機能。
有効になっていると、ステップインなどをすることで自動的にビルドされる。「Atl+F10」で明示的に変更を適用することもできる。

有効にするには、以下の設定を行う。

  1. メニューの「プロジェクト」-「設定」の、「C/C++」タブの「一般」カテゴリの「デバッグ情報」で、「エディット・コンティニュー用のプログラムデータベース」を選択する。
  2. メニューの「プロジェクト」-「設定」の、「リンク」タブの「カスタマイズ」カテゴリの「インクリメンタルリンクを有効にする」をONにする。

ヒープ領域のサイズ変更 Edit

リンカオプションに使用するヒープ領域を変更するコマンドがある。デフォルトでは1MBに設定されている。

/HEAP:reserve [,commit]

mallocを大量に呼び出す処理に対して、デフォルト設定とヒープ領域100MBとの比較を行ったが、デフォルトで7分かかる処理が10秒ほど短くなっただけで、速度の違いはあまり感じられなかった。

プロジェクト配下のファイルについて Edit

参考: http://support.microsoft.com/kb/132340/ja

  • プロジェクトの構成ファイル
    .dswワークスペースファイル1つ以上のプロジェクトを含むワークスペース。
    .dspプロジェクトファイルビルドを実行する単位となる。
    .makメイクファイルビルドの詳細が記録されたファイル。
    .dep依存関係プロジェクトの依存関係。
    ビルドを行う順番に影響する。
    .ncbインテリセンス用の情報を保持するファイル
    ウィザードバーやクラスツリー、入力補間のためのクラス情報等。
    .optオプションファイルビルドに直接影響しない類のプロジェクトの設定情報。
    コンパイルオプションなどの設定や、ブラウザデータベース作成の有無等。
    .apsバイナリリソースファイル処理の高速化のためにrcファイルから作成される。
    rcファイルを直接編集しても変更が反映されない場合は消してみる。
    .clwクラスウィザードクラスウィザードの情報。
    ※ncb, opt, aps, clw は、消しても自動的に作成される問題ない。
  • ビルドによって作成、使用されるファイル
    objオブジェクトファイルソースファイルがコンパイルされたファイル。
    pchプリコンパイル済みヘッダファイル処理の高速化のため、予めコンパイルされたヘッダファイル。
    resリソースファイルapsファイルがコンパイルされたファイル。
    sbrシンボルファイルソースファイルごとのシンボル情報。
    bscブラウザ情報ファイルアプリケーションのシンボル情報。
    sbrファイルがBSCMAKEによってリンクされて生成される。

カスタムビルド Edit

カスタムビルドを設定しておくことで、ビルド終了後に生成ファイルのコピー等の操作を自動で行うことができる。
入力欄には、プロジェクトに関連するファイル名やパス名などのマクロを使用可能。
出力として登録されたファイルとタイムスタンプを比較し、生成ファイルの方が新しい場合のみ処理を行う。

  • 生成されたexeファイルをコピーする例

    説明

    カスタム ビルド ステップを実行中 -  $(InputPath)

    コマンド

    copy "$(InputPath)" "C:\CopyDst"

    出力

    C:\CopyDst\$(InputName).exe

プリコンパイル済みヘッダーの使用 Edit

新しくプロジェクトを作成した場合、デフォルトで「プリコンパイル済みヘッダーを使用」する設定が行われ、「このヘッダーまで」のエディットボックスに「stdafx.h」が入力された状態となる。
これは、「#include "stdafx.h"」までのコードの替わりにプリコンパイル済みヘッダーファイル(*.pch)の内容を用いる、という意味である。

そのため、プリコンパイル済みヘッダーを使用する場合は以下の点に気をつける必要がある。

  • 全てのソースファイル(*.c, *.cpp ...)に「#include "stdafx.h"」を記述する必要がある。記述していない場合はコンパイルエラーとなる。
  • ソースファイル中の有効なコードの一番初めに「#include "stdafx.h"」を記述する必要がある。途中に記述した場合、それまでのコードは全て無効になってしまう。

リソースエディタ Edit

アドイン/マクロ Edit

エディタウィンドウのタブ化 Edit

http://www.wndtabs.com/

一部の拡張機能を除いて無料で使用できる。
言語DLLには日本語は含まれていないが、リソースエディタを使って自力で日本語化はできそう。

その他 Edit

MSDNサポートページ Edit

http://www.microsoft.com/japan/msdn/vs_previous/visualc/

サービスパックのバージョンの確認方法 Edit

レジストリの、'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\ServicePacks' に登録されているキーを確認する。
または、VBが一緒にインストールされていれば、VB起動時のスプラッシュウィンドウでも確認できる。

dswファイルのダブルクリックによる多重起動 Edit

以下の設定を行う。
→エクスプローラの「フォルダオプション」-「ファイルの種類」で、dsw ファイルの「詳細設定」の[MSDEVで開く]の編集で、[DDEを使う]のチェックをはずす。

逆アセンブル Edit

VisualStudio付属のコマンドでexeファイルをasmファイルに変換できる。

dumpbin /DISASM /rawdata xxx.exe > xxx.asm

ツールバーのボタンイメージの追加 Edit

自作マクロをツールバーに登録する際や既存のツールバーアイコンを変更する際などに、ボタンイメージを選択することができる。
しかし既存で用意されているボタンイメージは37種類と少ないため、自分で追加する方法を示す。
File not found: "001.PNG" at page "操作Tips/Visual Studio"[添付]

 

「C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\Bin」にインストールされている「DEVSHL.DLL」をフリーのリソースエディタ等で開く。(要バックアップ)
Bitmapリソースの「21199」がボタンイメージ。最初は16x16のアイコンが37種類なので592x16のビットマップとなっているが、追加したいイメージの分だけ横幅を広げる(60個のボタンイメージなら960x16)と、VisualStudio起動時にボタンイメージを自動認識してくれる。

正規の追加手順がありそうだが、不明。

不具合/注意点 Edit

プロジェクトの設定の「プロファイルを行う」チェックボックスの不具合 Edit

  • 現象

    メニューの「プロジェクト」-「設定」の、「リンク」タブの「一般」カテゴリで、「プロファイルを行う」のチェックをクリックしてもONに変更できない。

  • 原因

    「インクリメンタルリンクを有効にする」というチェックボックスが重ねられているようで、フォーカスをとられてしまっている。

  • 対策

    マウスを使用せず、キー操作(Tabキー、Eキー)でチェックを切り替える。

デバッグ中のフリーズの原因のひとつ Edit

Windows XP で標準インストール、起動されているテキストサービスというアプリケーションと相性が悪いらしい。
コントロールパネルからOFFにすることで、多少フリーズが改善される。

MFCプロジェクトにATLオブジェクトを追加する際のエラー Edit

「オブジェクトの作成中にエラーが発生しました。」というエラーが表示される場合があるが、無視して再度ATLオブジェクトを追加すればよい。
http://support.microsoft.com/kb/q198537/

Platform SDK(Win32APIを含むSDK)のバージョン Edit

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形式)にウィザードによって追加されるコード Edit

ATLを使用したCOMサーバの設計で、ウィザードを使用してメソッドやプロパティを追加した場合、自動的に対応するメンバ関数がクラスに追加される。このメンバ関数の先頭には、モジュールの状態を切り替えるためのコードが自動挿入されているがEXE形式のCOMサーバの場合は誤ったコードが追加される。(DLL形式用のコードが追加されている?)

以下の誤ったコードが追加されてしまうため、

  1
    AFX_MANAGE_STATE(AfxGetStaticModuleState())

以下のように修正する必要がある。

  1
    AFX_MANAGE_STATE(AfxGetAppModuleState())

誤ったコードのままだと、AfxGetApp()でモジュールのオブジェクトを取得しようとするとNULLが返される等の問題が発生する。

参考: http://support.microsoft.com/kb/231592/ja

警告レベル4で<windows.h>を使用したCファイルをコンパイルするときの警告 Edit

警告レベル4で、<windows.h>をインクルードした *.c をコンパイルすると、以下の警告が出力される。
(*.cpp では警告は出力されない)

warning C4115: '_RPC_ASYNC_STATE' : 関数の仮引数リストで構造体、共用体、列挙型の定義に使われました。

windows.h の中でインクルードしている rpcasync.h で警告が出力されてしまう。

実害はないようなので無視するか、以下のようなコードを書けばよい。

  1
  2
  3
#define WIN32_LEAN_AND_MEAN        // windows.h 内でのヘッダのインクルードを必要最小限に抑える
#include <windows.h>
:

シングルトンが正しく機能しない現象 Edit

参考:http://www.codeproject.com/Articles/19084/Visual-C-2003-Meyers-Singleton-Bug

Scott Meyers が著書「More Effective C++」に記載したシングルトンを用いると、インスタンスが複数生成されてしまう問題がある。一言でいうと「静的変数を利用した初期化チェックが正しく機能しない」状態となってしまう。

具体的には、以下の条件を満たすシングルトンクラスで問題が発生する。

  • VC++2003以前のコンパイラを使用している(VC6含む)
  • コンパイルオプションの最適化がON(Releaseビルド)
  • シングルトンクラスのヘッダファイルにインスタンス取得関数を定義している
  • 複数のソースファイルでそのヘッダファイルをincludeし、かつ複数のソースファイルからインスタンス取得関数を呼び出している
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
    
    class CFoo
    {
    public:
        static CFoo *GetInstance()
        {
            static CFoo it;
            return &it;
        }
        :
    };

静的変数 it はプログラムの実行後の最初の1回しか初期化(CFooクラスのインスタンス生成)が行われないことが期待される。しかし、各ソースファイルからの呼び出しで、静的変数の初期化済みチェックが異なるメモリの値を使用して行われてしまい、ソースファイルの数だけ初期化されてしまう恐れがある。
(VC6によって生成されたアセンブラコードでこの問題を確認済み)

KernelのDLLのシンボルファイルが読み込まれない Edit

user32.dllやkernel32.dllなど、OSが提供するDLLも対応するシンボルファイル(*.pdb)が用意されていればデバッグ時にシンボル名を表示することができる。
しかし、VC6をWinXP以降で動作させている場合はこの機能が働かない。(たとえsyetem32フォルダに対応するpdbファイルがあったとしても)
例外で、MFC42D.dllなどMFC関連のdllに対応するpdbは読み込まれる模様。

リソースエディタの制約 Edit

  • ストリングテーブルに追加できるのは6144個まで。ただし、それ以上でもビルドは通る。
    rcファイルとヘッダファイルにエディタを使用して追加すれば6145以上追加することが可能。

Visual C++ .NET 2002~ Edit

プロジェクトの設定 Edit

str関数使用時の警告の消し方 Edit

C標準ライブラリの文字列を扱う関数(str系やscanf等)を使用すると警告が出る。バッファオーバフローの危険がある関数に対しての警告らしい。(strn~や、lstr~を使用すべきということ?)
警告を消すには、

  • プロジェクトに警告を無視するオプションを指定する。
    →プロジェクトのプロパティ画面の、「構成」-「C/C++」-「コマンドライン」に「/wd 4996」と入力する。
  • #pragmaを使用して警告を無視する。
    #pragma warning(disable:4996)
  • マクロ定義を使用する。
    #define _CRT_SECURE_NO_DEPRECATE 1
 

上記の設定はいずれも警告を無視する方法なので、好ましくはない。本来は、str関数等を安全な関数に置換すべき。

例)strcpy() → strcpy_s()

自分でgrepして置換していってもよいが、以下のマクロ定義を指定することで自動的に安全な関数に置換して処理してくれる。

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

デバッグ時にステップ実行ができない場合の対処 Edit

DLL等のデバッグ時など、ソースファイルが存在するのに「現在の場所のソースコードを表示できません」とメッセージボックスが表示され、ステップ実行できなくなる場合がある。
そのときは、開発環境の「ツール」-「オプション」-「デバッグ」の「元のバージョンと完全に一致するソースファイルを必要とする」のチェックを外すと、直ることがある。

その他 Edit

ソリューションファイル(*.sln)について Edit

ソリューションファイルは、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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-05-26 (土) 13:18:21 (2180d)