1

この例では動作するコードにコンパイルされますが、さらに複雑なものを配置すると、プログラムがシャットダウンし、ダイアログ ウィンドウを開くことができなくなります。エラーメッセージは正確に次のとおりです。

test.cpp:10:19: 警告: 文字列定数から 'LPWSTR {aka wchar_t*}' への非推奨の変換 [-Wwrite-strings]

#include <windows.h>
int main() {
  OPENFILENAMEW ofn;
  ZeroMemory(&ofn, sizeof(ofn));
  ofn.lStructSize = sizeof(OPENFILENAME);
  ofn.nMaxFile = MAX_PATH;
  ofn.lpstrFile = L"file name";
}
4

4 に答える 4

4

ウィンドウが埋めるためのバッファを提供する必要があります。

ファイル名編集コントロールの初期化に使用されるファイル名。初期化が不要な場合、このバッファの最初の文字は NULL でなければなりません。GetOpenFileName または GetSaveFileName 関数が正常に戻ると、このバッファーには、選択したファイルのドライブ指定子、パス、ファイル名、および拡張子が含まれます。

基本的に、ウィンドウは、開く/保存ダイアログでファイルを選択した後、選択したファイルのパスとファイル名をバッファーに入力します。したがって、基本的に、コードは次のようになります。

#include <windows.h>

int main()
{
    wchar_t fileBuffer[MAX_PATH] = {0};

    OPENFILENAMEW ofn;
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFile = fileBuffer;
}

これが役立つことを願っています。

于 2013-01-18T17:11:31.583 に答える
2

lpstrFileメンバーは非const(タイプ) として定義されていますLPTSTRが、文字列リテラルはconstです。の説明はlpstrFile、特定の WINAPI 関数で使用された場合に、データが取り込まれ、書き込まれることを示しています。文字列リテラルへの書き込みは未定義の動作です。

OPENFILENAMEドキュメントから:

ファイル名編集コントロールの初期化に使用されるファイル名。初期化が不要な場合、このバッファの最初の文字は NULL でなければなりません。GetOpenFileName または GetSaveFileName 関数が正常に返されると、このバッファーには、選択したファイルのドライブ指定子、パス、ファイル名、および拡張子が含まれます。

lpStrFileの配列を指すように修正するにはwchar_t:

wchar_t file[100] = L"file name";

ofn.plstrFile = file;
于 2013-01-18T15:58:23.797 に答える
1

文字列リテラルへの書き込みは未定義の動作を引き起こすため、文字列リテラルへの非 const ポインターは非推奨です。

const char* s = "abc"; // correct
char* s = "abc"; // deprecated

同じことが文字列にも当てはまりwchar_tます。

ofn.lpstrFileポインターは非 const であり、書き込み可能なバッファーを指すことを意図しています。書き込み可能なバッファーを提供し、ofn.plstrFileそのバッファーへのポインターを設定する必要があります。

wchar_t buf[1024];
ofn.plstrFile = buf;

詳細については、OPENFILENAME のドキュメントを参照してください。

于 2013-01-18T15:59:16.773 に答える
1

フィールドに関するドキュメントからlpstrFile

GetOpenFileName または GetSaveFileName 関数が正常に返されると、このバッファーには、選択したファイルのドライブ指定子、パス、ファイル名、および拡張子が含まれます。

これは、書き込み可能なバッファーへのポインターであると想定されており、選択したファイル名を保持するのに十分な大きさである必要があります。定数文字列を指すのは間違いであり、観察したように未定義の動作につながります。

于 2013-01-18T15:58:21.977 に答える