0

GetFileAttributesExW()ファイルの日付を取得するために使用します。DEBUGモード (Visual Studio 2012) では、すべて正常に動作します。たとえば、" 2013-05-10"が表示されます。しかし、ターゲットをRELEASEに変更すると、日付が壊れます(関数の最後に"1678-09-08"などの文字列が表示されます)。

完全なコード:

bool Registry::fileDate(std::wstring pathString, std::string &dateOut)
{
    if (pathString.size() == 0)
        return false;

    if (pathString[0] == '\"')
    {
        pathString = pathString.erase(0, 1);
    }

    if (pathString[pathString.size()-1] == '\"')
    {
        pathString = pathString.erase(pathString.size()-1, 1);
    }

    size_t pos = 0;
    size_t found = pathString.find('\"', pos);
    if (found > 0 && found != std::string::npos)
    {
        pathString = pathString.substr(0, found);
    }

    std::wstring filePath = pathString;

    WIN32_FILE_ATTRIBUTE_DATA fileData;
    GetFileAttributesExW(filePath.c_str(), GetFileExInfoStandard, &fileData);
    SYSTEMTIME systemTime;

    bool res = FileTimeToSystemTime(&fileData.ftCreationTime, &systemTime);
    if (res)
    {
        char buf[40] = {0};
        for(int i=0; i<40; i++) //to be even more certain that no trash will get here
            buf[i] = ' ';
        sprintf(buf,"%04d-%02d-%02d",
                systemTime.wYear, systemTime.wMonth, systemTime.wDay);
        dateOut = buf+'\0';
    }
    else
    {
        //show error's window, i'm sure it DOESN'T occur, both in DEBUG and RELEASE
    }
}

RELEASEでいくつかの最適化を行う必要があることは承知しています。その最適化と私の間違い (私にはわかりません) が一緒になって、日付が破損するに違いありません。

関数には、次のような文字列に移動します。

L"\"C:\\Program Files\\File\\setup.exe\" /uninstall PROPLUS /dll OSETUP.DLL"

DEBUGでは、関数の最初の行で次のように変換されます。

L"C:\\Program Files\\File\\setup.exe"

編集:( レイモンド・チェンのコメントへのThx)

RELEASE ではFALSEGetFileAttributesExW()を返すことがわかったので、おそらくその部分はDEBUGでは機能し、 RELEASEでは機能しません(パスから余分な"/paramsを削除する必要があります)。

if(pathString.size() == 0)
    return false;

if(pathString[0] == '\"'){
    pathString = pathString.erase(0, 1);
}

if(pathString[pathString.size()-1] == '\"'){
    pathString = pathString.erase(pathString.size()-1, 1);
}

size_t pos = 0;
size_t found = pathString.find('\"', pos);
if (found > 0 && found != std::string::npos)
{
    pathString = pathString.substr(0, found);
}

std::wstring filePath = pathString;
4

0 に答える 0