質問

次のコードを使用してファイルを作成していますが、エラーコード123で常に失敗しました(パス構文は無効です)。

奇妙なことは: path_ok いつも大丈夫ですが、 path_err 常に123で失敗しました。そして、障害後、バッファー path_err ポイントがクリアされています。

誰かが私に光を当てることができますか? 2つのポインターの記憶を確認しましたが、その内容は同一のようです。

どうもありがとう。

 WCHAR *pDumpFileName = ComposeDumpFileName();
 WCHAR *path_ok = _T("d:\\myapp_Utopia_2010-11-15_04-22-05.dmp");
 WCHAR *path_err = pDumpFileName;
 ::wprintf(pDumpFileName);
 HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE, 
  0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

composedumpfileName()関数は次のようなものです。

WCHAR* ComposeDumpFileName(void)
{
 // get the time
    SYSTEMTIME sys_time;
    ::GetSystemTime(&sys_time);

    // get the computer name
    WCHAR computer_name[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD computer_name_len = ARRAYSIZE(computer_name);
 ::GetComputerNameW(computer_name, &computer_name_len);

    // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
    WCHAR dump_file_path[MAX_PATH];

 ::swprintf_s(dump_file_path, ARRAYSIZE(dump_file_path), 
        _T("d:\\myapp_%s_%04u-%02u-%02u_%02u-%02u-%02u.dmp"), 
        computer_name, sys_time.wYear, sys_time.wMonth, sys_time.wDay,
        sys_time.wHour, sys_time.wMinute, sys_time.wSecond);

 return dump_file_path;
}

アップデート

上記のコードで、次のコードを実行するとき:

WCHAR *pDumpFileName = ComposeDumpFileName();

ComposedumpFileNameが返された後、そのスタックフレームは無効ですが、そのローカル変数は wchar dump_file_path [max_path まだスタックに存在します。したがって、これは、そのためのスタックスペースはすでに無効であるが、そのコンテンツをまだ見ることができる理由を説明しています。

次に、次のステートメントを実行します。

     ::wprintf(pDumpFileName);
     HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE, 
      0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

wprintf()およびcreatefilew()には、独自のスタックフレームがあります。デバッガーでは、wprintf()のスタックフレームが次のように指摘されたメモリコンテンツを破壊しないことがわかりました。 pdumpfileName, 、createfilewが持つことができるため、無効なパス構文について不平を言っています。

これは私の現在の理解です。私が間違っている場合は修正してください。

ありがとう。

役に立ちましたか?

解決

1 大きな問題 あなたのコードを使用すると、あなたが返しているバッファーはスタックにあり、これは大きなノーです:

 // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP 
 WCHAR dump_file_path[MAX_PATH]; 

どちらかを静的に変更します:

 // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP 
 static WCHAR dump_file_path[MAX_PATH]; 

または、バッファを関数に渡します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top