Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Открытие программой своего физического образа

35K
12 января 2011 года
Mediv63
50 / / 08.12.2009
Здравствуйте. Подскажите пожалуйста как научить программу открывать свой .exe на диске?
вот мои эксперименты:
Код:
string read_file(string sTrack)
{  
    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;
}

вот скриншот выполнения программы:
360
12 января 2011 года
P*t*
474 / / 15.02.2007
А зачем вообще такое понадобилось?
Попробуй открывать файл только для чтения.
5.4K
12 января 2011 года
cursor
114 / / 05.01.2008
http://msdn.microsoft.com/en-us/library/ms681381%28v=vs.85%29.aspx здесь коды, которые ты получаешь по GetLastError(). Ты получаешь цифру 6 - это результат ошибки CloseHandle(). Нафига вообще закрывать то, что не открылось?..
Тебе бы пораньше 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);

конвертишь в стринг.
35K
12 января 2011 года
Mediv63
50 / / 08.12.2009
P*t*: спасибо за наводку, помогла замена FILE_ALL_ACCESS на FILE_READ_DATA.
35K
12 января 2011 года
Mediv63
50 / / 08.12.2009
Цитата: cursor
http://msdn.microsoft.com/en-us/library/ms681381%28v=vs.85%29.aspx здесь коды, которые ты получаешь по GetLastError(). Ты получаешь цифру 6 - это результат ошибки CloseHandle(). Нафига вообще закрывать то, что не открылось?..
Тебе бы пораньше 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? разве не строку возвращаю?

5.4K
12 января 2011 года
cursor
114 / / 05.01.2008
Цитата: Mediv63
0. Лучше закрыть то что не открылось, чтобы наверняка быть уверенным что закрыто, чем оставить открытым то что уже не нужно)



if (hFile == INVALID_HANDLE_VALUE){CloseHandle(hFile);
HANDLE hFile - это просто int.
Согласно коду hFile == INVALID_HANDLE_VALUE
А INVALID_HANDLE_VALUE = толи -1 толи 0.
Следовательно hFile толи -1 толи 0, че тут закрывать то...

Цитата: Mediv63

1. Согласен что с GetLastError() лоханулся, он вернул ошибку от ReadFile а не от CreateFileA

Ну вообще то от CloseFile.

Цитата: Mediv63

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 или борланд...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог