13

std::stringからに変換する方法の典型的な質問の新しいバージョンLPCTSTR

さまざまなSOの投稿を読んで、これを行う必要があることがわかりました。

CreateDirectory(path.c_str(),NULL);

それでもコンパイラはエラーを出しますcannot convert from const char * to LPCTSTR.

私は試した:

CreateDirectory((LPCTSTR)path.c_str(),NULL);

エラーなし!

それでも(正しい場所に)作成されたディレクトリは呼び出されます:

D:\\something\\㩄ぜ弲久䅓余屓䱆彄湡敤屲䵉ⴱ㠶ⴰⵃㅇ㉜洰⵭就䥄牃獥汵獴촀췍췍췍췍췍췍췍﷍﷽꯽ꮫꮫꮫﺫﻮﻮ

ご想像のとおり、これはまさに私が望んでいたものではありません...

それで、私は何が欠けていますか?UNICODE/ANSI に関連するものですか?どうすればこれを解決できますか?

4

7 に答える 7

7

このページを見てみてください: What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc。MSVC を使用している場合は、プロジェクトに Unicode を設定している可能性があり、互換性がない にLPCSTR「変換」されている可能性がありますconst wchar_t *const char *

これを行う(LPCTSTR)path.c_str()と、元の文字列から 2 つの文字を取得し、それらから 1 つの Unicode wchar_t 文字を作成します。そうすれば、「中国語」の文字を取得できます。

于 2013-05-23T10:12:11.667 に答える
6

「(std::) string to LPCTSTR」を検索しようとすると、この質問がポップアップするため

std::stringLPCTSTR使用して変換して渡す方法は次のとおりですwstring

string path_str = "Yay!"; //your string containing path
wstring path_wstr( path_str.begin(), path_str.end() );
//then this should work:
CreateDirectory(path_wstr.c_str(),NULL);

エイドリアン・マッカーシーによる重要な注意:

ソース文字列が ASCII の場合、または ANSI で現在のコード ページが Windows-1252 (Latin-1 と非常によく似ています) の場合、これは問題ありません。ソースが UTF-8 または別のコード ページである場合、これは単に問題を隠します。

于 2015-03-09T20:32:03.320 に答える
6

ここでの問題は、ビルドが unicode をサポートしているかどうか (unicode フラグが設定されているかどうか) に基づいて解決されるか、それに基づいてLPCTSTR解決されるという事実です。wchar_t*char*

char*バージョンを明示的に呼び出すには、 を呼び出しますCreateDirectoryA()

于 2013-05-23T10:12:36.053 に答える
5

Unicode 用にコンパイルしています。これは、ワイド文字バージョンCreateDirectoryのエイリアスであることを意味します。CreateDirectoryWただし、プログラム内のテキストは ANSI を使用してエンコードされています。これは、プログラムが国際化を適切に処理できないことを意味します。

CreateDirectoryWコンパイラは、期待するテキスト エンコーディングと、指定したテキスト エンコーディングとの間に不一致があることを通知しています。CreateDirectoryAその不一致を解決するために呼び出すことができるのは事実ですが、それは根本的な問題、つまりプログラムで ANSI テキストを使用しているという事実を永続させるだけです。

したがって、最善の解決策は、すべてのテキストを Unicode としてエンコードすることです。使用を中止し、使用stringを開始しwstringます。その後に変更pathしたらwstring

CreateDirectory(path.c_str(),NULL);

正しい。

于 2013-05-23T10:39:19.817 に答える
1

CreateDirectoryA代わりに使用してください。ビルド構成に応じてまたはCreateDirectoryに展開されるマクロです。それらはそれぞれとをとります。を持っていることがわかっている場合(それがあなたに与えるものです)、最初のものを使用してください。CreateDirectoryACreateDirectoryWLPCSTRLPCWSTRLPCSTRc_str()

于 2013-05-23T10:13:11.037 に答える