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対応にします。また、セキュリティー強化の関数に変更します。
英数字だけですと、1文字=1バイトで表現できます。しかし、漢字・ひらがな・カタカナですと、1文字=2バイト必要になります。
1文字=1バイトで表現できる英数字も含めて、2バイトで表現するようにしたものが、Unicode(ユニコード、UTF-16)とよばれるものです。拡張に伴い、一部の文字は4バイト使用しています。
従来の英数字1文字=1バイト、漢字・ひらがな・カタカナ1文字=2バイトで表現する方法を「マルチバイト」と呼びます。
ここでは、ソースコードを変更しないで、プロジェクトの設定を変更する方法を説明します。
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) チェック」のチェックを外した場合は、この設定は不要です。
プロジェクトの設定はデフォルトのままで、コードを修正する方法を説明します。
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' の宣言を確認してください。