Открытие программой своего физического образа
вот мои эксперименты:
{
HANDLE hFile;
DWORD dwBytes;
char cData[655360];
for(int i = 0; i < 655360; i++){cData = NULL;}
hFile = CreateFileA(str_to_char(sTrack), FILE_ALL_ACCESS, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE){CloseHandle(hFile);return "ERROR:CreateFileA(" + sTrack + ",FILE_ALL_ACCESS,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)";}
if(ReadFile(hFile, cData, 655360, &dwBytes, NULL) == 0){CloseHandle(hFile);return "ERROR:ReadFile(hFile," + char_to_str(cData) + ",655360,&dwBytes,NULL)";}
CloseHandle(hFile);
return char_to_str(cData);
}
int main(int argc, char* argv[])
{
string sTrack = argv[0];
cout << sTrack << "\n";
string sData;
sData = read_file(sTrack);
cout << sData << "\n";
cout << "GetLastError: " << GetLastError() << "\n";
getch();
return 0;
}
вот скриншот выполнения программы:
Попробуй открывать файл только для чтения.
Тебе бы пораньше GetLastError() вызвать, сразу после CreateFileA()
UPD: а почему ты тут
if (hFile == INVALID_HANDLE_VALUE){CloseHandle(hFile);return "ERROR:CreateFileA(" + sTrack + ",FILE_ALL_ACCESS,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)";}
возвращаешь char, а тут
return char_to_str(cData);
конвертишь в стринг.
Тебе бы пораньше GetLastError() вызвать, сразу после CreateFileA()
UPD: а почему ты тут
if (hFile == INVALID_HANDLE_VALUE){CloseHandle(hFile);return "ERROR:CreateFileA(" + sTrack + ",FILE_ALL_ACCESS,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)";}
возвращаешь char, а тут
return char_to_str(cData);
конвертишь в стринг.
0. Лучше закрыть то что не открылось, чтобы наверняка быть уверенным что закрыто, чем оставить открытым то что уже не нужно)
1. Согласен что с GetLastError() лоханулся, он вернул ошибку от ReadFile а не от CreateFileA
2. Почему я тут "if (hFile == INVALID_HANDLE_VALUE){CloseHandle(hFile);return "ERROR:CreateFileA(" + sTrack + ",FILE_ALL_ACCESS,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)";}" возвращаю char? разве не строку возвращаю?
if (hFile == INVALID_HANDLE_VALUE){CloseHandle(hFile);
HANDLE hFile - это просто int.
Согласно коду hFile == INVALID_HANDLE_VALUE
А INVALID_HANDLE_VALUE = толи -1 толи 0.
Следовательно hFile толи -1 толи 0, че тут закрывать то...
1. Согласен что с GetLastError() лоханулся, он вернул ошибку от ReadFile а не от CreateFileA
Ну вообще то от CloseFile.
2. Почему я тут "if (hFile == INVALID_HANDLE_VALUE){CloseHandle(hFile);return "ERROR:CreateFileA(" + sTrack + ",FILE_ALL_ACCESS,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)";}" возвращаю char? разве не строку возвращаю?
ну ты возвращаешь указатель на С-строку. Указатель на массив char[].
Например MessageBoxA(0, "text", "caption", 0) в этом случае ты передаешь именно указатели на массивы char: "text" и "caption".
В твоем случае то ли компилятор справился, то ли string и char[] один и тот же тип (тоже смотря как объявлен этот string), но суть в том что в одном месте ты явно привел возвращаемое значение к stringу а в другом нет.
Иной бы компилятор ругнулся и не пустил бы без приведения возвращаемого значения к типу string, а у тебя видимо MSVC или борланд...