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;