3

Visual Studio 2015 でコンパイル エラーが発生しました。charデータをに変換しようとしていLPWSTRます。できますか?または、文字列型でのみ機能しますか?

ここに私のコードの一部があります:

    ⋮
FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    GetCurrentDirectory(256, fichier); 
    strcat(fichier, "\\fichierlog.txt");

質問を投稿する前は、次の場所にいました。

  1. https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k%28C2664%29&rd=true

  2. C++ は列挙型から LPCTSTR に変換できません

  3. VC++ で char* を LPWSTR に変換する方法は?

ケースが見つかりませんでした:(

4

3 に答える 3

3

現在のコードの代わりに:

FILE *sortie;
char fichier[256];//   <--- HERE s my char table

int main(int argc, char *argv[])
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    GetCurrentDirectory(256, fichier); 
    strcat(fichier, "\\fichierlog.txt");

例えばする

auto main() -> int
{
    //on masque 
    HWND hwnd = GetForegroundWindow();
    ShowWindow(hwnd, SW_HIDE);

    int i, lettre, result, lastresult, lastletter, compteur;

    std::wstring fichier( MAX_PATH, L'\0' );//   <--- HERE s my char table
    const DWORD len = GetCurrentDirectory( fichier.size(), &fichier[0] );
    if( len == 0 || len >= fichier.size() ) { throw std::runtime_error( "GetCurrentDirectory failed." ); }
    fichier.resize( len );
    fichier += L"/fichierlog.txt";

    std::ifstream sortie( fichier );

これにより、次の 3 つの問題が修正されます。

  • Unicode (おそらく Visual Studio プロジェクト) としてコンパイルしていますが、コードは Windows ANSI API 用です。

  • C++ コンパイラを使用していますが、コードは低レベル C です。

  • 最大パス長に対してバッファーが小さすぎます。連結のバッファー オーバーランの可能性があります。

ifstreamワイド文字列を受け入れるコンストラクターは、Microsoft の拡張機能であることに注意してください。ただし、C++17 の標準ライブラリへのファイル システムの追加により、Windows C++ コンパイラでは実質的に必要になります。

于 2015-06-17T02:33:25.703 に答える
2

Unicode でコンパイルしているためwchar_t、文字列を宣言するために使用する必要があります。strcatであるユニコードバージョンを使用する代わりにwcscat.

また、文字列 "\fichierlog.txt" をL "\fichierlog.txt"に変更します。

FILE *sortie;
//char fichier[256];//   <--- HERE s my char table
wchar_t fichier[256];//   <--- HERE s my char table

//on masque 
HWND hwnd = GetForegroundWindow();
ShowWindow(hwnd, SW_HIDE);

int i, lettre, result, lastresult, lastletter, compteur;

GetCurrentDirectory(256, fichier);
//strcat(fichier, "\\fichierlog.txt");
wcscat(fichier, L"\\fichierlog.txt");
于 2015-06-17T02:32:15.213 に答える
1

Your Visual Studio project is set to compile using "widechars" as default encoding (aka UNICODE), so all Windows APIs take wchar_t arrays instead of char arrays when handling strings.

標準の文字セットを使用するようにプロジェクトを設定するか、代わりにGetCurrentDirectoryを使用しての ASCII バージョンを指定してください。GetCurrentDirectoryA

GetCurrentDirectory実際には関数ではありませんが、コンパイラが使用するように設定されているエンコードに応じてルーティングGetCurrentDirectoryAするプリプロセッサ マクロです。GetCurrentDirectoryW

于 2015-06-17T02:49:36.177 に答える