Visual C++ Ver6.0のソースを最新のVisual C++でコンパイル 概略

Windows SDKで役に立つホームページが多数ありますが、Visual C++ Ver6.0対応のものばかりで、Visual C++ 2005以降のVisual C++ではコンパイルが通らないことがよくあります。

エラーの例

コンパイル時に下記エラーが発生します。

  • 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
  • 'LPCSTR' から 'LPCWSTR' に変換できません。
  • 〜 番目の引数を 'char [〜]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
  • error C4996: '_swprintf': This function or variable may be unsafe. Consider using _swprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

解決方法

コンパイルを通して、実行できるようにするには2つ方法があります。

方法1.プロジェクトの設定を変更
文字セットをUnicode(ユニコード)からマルチバイトにします。
[Visual C++ 2013/2012の場合] セキュリティー強化の関数未使用時のエラーを、ワーニングに変更します。

方法2.ソースコードを変更
Unicode対応にします。また、セキュリティー強化の関数に変更します。

Unicode(ユニコード)とは?

英数字だけですと、1文字=1バイトで表現できます。しかし、漢字・ひらがな・カタカナですと、1文字=2バイト必要になります。

1文字=1バイトで表現できる英数字も含めて、2バイトで表現するようにしたものが、Unicode(ユニコード、UTF-16)とよばれるものです。拡張に伴い、一部の文字は4バイト使用しています。

従来の英数字1文字=1バイト、漢字・ひらがな・カタカナ1文字=2バイトで表現する方法を「マルチバイト」と呼びます。

方法1.プロジェクトの設定を変更

ここでは、ソースコードを変更しないで、プロジェクトの設定を変更する方法を説明します。

1. 文字セットをUnicode(ユニコード)からマルチバイトにします。
2. [Visual C++ 2013/2012の場合] セキュリティー強化の関数未使用時のエラーを、ワーニングに変更します。

1. 文字セットをUnicode(ユニコード)からマルチバイトに

文字セットをUnicode(ユニコード)からマルチバイトにする方法を説明します。

1.

「ソリューション エクスプローラー」で、フォルダを選択した状態、もしくは、プロジェクト名が選択された状態で、

プロジェクト(P)」 - 「プロパティ(P)...」(「ソリューション エクスプローラー」で、プロジェクト名が選択した状態の場合)
または、「プロジェクト(P)」 - 「[プロジェクト名]のプロパティ(P)...」(「ソリューション エクスプローラー」で、フォルダを選択した状態の場合)
を選択。

「ソリューション エクスプローラー」で、ファイルを選択した状態、もしくは、一番上の「ソリューション'[プロジェクト名]'(1プロジェクト)」が選択された状態では、 これ以降で解説する設定が表示できません。

プロジェクトプロパティ

2.

左のメニューから、「構成プロパティ」- 「全般」を選択して、 右側の「文字セット」を「マルチ バイト文字セットを使用する」に変えます。

マルチ バイト文字セット

※Windows XPで、Google日本語入力がインストールされたPCでは、プルダウンメニューが一瞬で消えてしまう問題がありましたが、修正されています。
参考:http://www.google.com/support/forum/p/ime/thread?tid=48fbeac671856dd0&hl=ja

3.

これで設定は完了です。ビルドできることを確認してください。

2. [Visual C++ 2013/2012の場合] セキュリティー強化の関数未使用時のエラーを、ワーニングに変更

Visual C++ 2013/2012の場合、セキュリティー強化の関数を使用しなかった場合、エラーになりますが、これをワーニングに変えます。
なお、Visual C++ 2010/2008の場合は、ワーニングのままです。

上記の「プロパティ ページ」を表示してください。
左のメニューから、「構成プロパティ」- 「C/C++」を選択して、 右側の「SDLチェック」を「いいえ (/sdl-)」に変えます。

マルチ バイト文字セット

プロジェクト作成時に、「Security Development Lifecycle (SDL) チェック」のチェックを外した場合は、この設定は不要です。

方法2.ソースコードを変更

プロジェクトの設定はデフォルトのままで、コードを修正する方法を説明します。

1. Unicode対応

文字列

文字列はすべてTEXT()を付けます。

"文字列"; は、 TEXT("文字列"); とします。

文字列の型


変更前(マルチバイト) 変更後(Unicode対応)
char TCHAR
char*
LPSTR
LPTSTR
const char*
LPCSTR
LPCTSTR

TCHAR、LPTSTR、LPCTSTRを使えば、UNICODEでもマルチバイトでも、自動的に変換してくれるため、 エラーが出ることなく、コンパイルできます。

文字列変数の型 命名基準

LPTSTR、LPCTSTRなどの文字列変数の型には命名基準があります。

型の文字 意味 補足
LP Long Pointer (32ビットポインタ)
C Constant (定数) この変数には代入できません。
W Wide character (文字セット:ユニコード) プロジェクトの設定によらず、常にユニコードになります。
T Template (文字セット:自動適用) ユニコードかマルチバイトかは、プロジェクトの設定により切り替えます。
STR STRing (文字列) 文字列としての型ですので、配列にはしません。
CHAR CHARacter (文字) 文字列として使うときは、配列にします。

文字列から数式への型変換

文字列からint(整数)型に変換するには、
数式 = _tstoi(文字列) または、
数式 = _ttoi(文字列) を使います。

文字列からdouble型に変換するには、
数式 = _tstof(文字列) または、
数式 = _ttof(文字列) を使います。

要:tchar.h

変更前(マルチバイト) 変更後(Unicode対応)
atoi _tstoi
_ttoi
atof _tstof
_ttof

2. セキュリティー強化の関数に置き換え

文字列処理関数


変更前(マルチバイト) 変更後(Unicode対応) 変更後(セキュリティ強化版) 意味
strcpy(a, b) _tcscpy(a, b) _tcscpy_s(a, MAX_SIZE, b) 文字列a に文字列b をコピー
strcat(a, b) _tcscat(a, b) _tcscat_s(a, MAX_SIZE, b) 文字列a の後に文字列b を連結
strlen(a) _tcslen(a) _tcslen(a) <セキュリティ強化版なし> 文字列a の長さを取得('\0'は長さに含めない)
strcmp(a, b) _tcscmp(a, b) _tcscmp(a, b) <セキュリティ強化版なし> 文字列a と文字列b とを比較
strncpy(a, b, n) _tcsncpy(a, b, n) _tcsncpy_s(a, MAX_SIZE, b, n) 文字列a に文字列b の先頭 n文字をコピー

上記「変更後(Unicode対応)」ですと、コンパイル時にワーニングが発生するものがあります。「変更後(セキュリティ強化版)」をお使い下さい。
上記「変更後(セキュリティ強化版)」にあるMAX_SIZE は、文字列a が確保するバッファのサイズです。文字列a が取り得る最大のサイズをセットして下さい。

要 : string.h、 tchar.h

数式から文字列への型変換

sprintf(str,"回数:%d",i); は、
_stprintf_s(str, MAX_SIZE, TEXT("回数:%d"), i); とします。

i は数式、str は文字列です。
i が 23 の場合は、回数:23 という出力結果になります。

_stprintf_sの関数の引数に、MAX_SIZEがあります。MAX_SIZEには、確保するバッファのサイズを入れてください。(例:255など)
バッファがあふれると、実行エラーになります。

要:tchar.h

変更前(マルチバイト) 変更後(Unicode対応) 変更後(セキュリティ強化版)
sprintf _stprintf _stprintf_s

_stprintf_sは、_stprintfのセキュリティが強化されたものです。

_stprintf、sprintfを使用すると、コンパイル時に下記のようなワーニングが発生するため、_stprintf_sを使ってください。

warning C4996: '_swprintf': This function or variable may be unsafe. Consider using _swprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(544) : '_swprintf' の宣言を確認してください。

warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。