Invalid handle value c

В написании ошибки нет. Получайте GetLastError и смотрите что за ошибка, возможно нет прав записи в данную папку.

И указание дескриптора защиты ничего не меняет.

в какой папке находится сама программа ?

В документах, и на рамочем столе.

Походу нужно использовать моникеры.

Это уже интересно. А можете вызвать в программе GetCurrentDirectory и показать, какую директорию она выдает ?

Ок. А теперь откройте командную строку и запустите в ней следующую команду: Код Code1 2 3 icacls С:UsersMynameDesktopout *Результат скопируйте сюда.

CREATE_ALWAYSCreates a new file, always. If the specified file exists and is writable, the function overwrites the file, the function succeeds, and last-error code is set to ERROR_ALREADY_EXISTS (183). If the specified file does not exist and is a valid path, a new file is created, the function succeeds, and the last-error code is set to zero. For more information, see the Remarks section of this topic.

Да,действительно: GetLastError() == 5 – ошибка доступа.

Я пробовал эту функцию, но она всегда возвращает «Не удалось открыть код ошибки PID (номер) 0». Даже с только PROCESS_VM_READ.

Когда я вывести значение адреса памяти в этом коде

это возвращает значение мусора.

Решение

process = INVALID_HANDLE_VALUE выполняет дескриптор процесса перезаписи присваивания, а не сравнение. Также в случае ошибки OpenProcess вернусь NULL , Перепишите проверку следующим образом:

Другие решения

OpenProcess возвращается NULL при неудаче нет INVALID_HANDLE_VALUE , Также вы используете = когда вы должны использовать == , Код должен быть

Вы ошибочно назначаете process переменная дважды. Один раз, когда вы звоните OpenProcess а потом опять когда пишешь

Это назначает INVALID_HANDLE_VALUE в process и проверяет ли process ненулевой Что всегда так, потому что INVALID_HANDLE_VALUE ненулевой Вы сделали классическую ошибку использования = когда ты хотел использовать == , Как следствие этого вы полностью игнорируете значение, возвращаемое OpenProcess ,

Читайте также:  Canon 240 hs отзывы

Обратите внимание, что OpenProcess указывает на неудачу, возвращаясь NULL , Так что ваш код должен быть

Учимся работать с файлами через Windows API

Из предыдущих постов, посвященных WinAPI, мы научились настраивать Visual Studio и узнали, как в нем писать простые консольные приложения. Следующим маленьким шажком в изучении WinAPI будет освоение работы с файлами.

Для этого нелегкого дела нам понадобятся следующие процедуры:

В Windows для того, чтобы открыть или создать файл, нужно вызвать процедуру, имеющую целых семь аргументов. К счастью, большинство из них приходится использовать крайне редко. Аргумент szName задает имя файла, а dwAccess — желаемый доступ к файлу, обычно это GENERIC_READ, GENERIC_WRITE или оба значения, объединенные логическим или. Параметр dwShareMode определяет, что могут делать с файлом другие процессы, пока мы с ним работаем. Возможные значения — FILE_SHARE_READ, FILE_SHARE_WRITE, FILE_SHARE_DELETE и их комбинации, однако часто этот параметр просто устанавливают в ноль. Параметр dwCreationDisposition определяет, как именно мы хотим открыть файл, может быть, например, CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS. О семантике этого хозяйства нетрудно догадаться самостоятельно. С помощью dwFlags можно указать дополнительные свойства файла, например, хранить ли его в зашифрованном или сжатом виде, или сказать, что файл является скрытым, временным или системным. Обычно сюда передают FILE_ATTRIBUTE_NORMAL. Наконец, про lpSecurityAttributes и hTemplateFile сейчас знать не нужно, сюда можно смело передавать NULL.

В случае успешного создания или открытия файла, процедура CreateFile возвращает его хэндл. В случае ошибки возвращается специальное значение INVALID_HANDLE_VALUE. Узнать подробности об ошибке можно с помощью GetLastError.

Чтение из файла в буфер lpBuff размером dwBuffSize. В переменную dwCount записывается реальное количество прочитанных байт. Последний опциональный аргумент называется lpOverlapped и о нем сейчас знать не нужно.

Читайте также:  Зайти в любую почту

Аргументы и семантика процедуры WriteFile полностью аналогичны ReadFile.

Файловые дескрипторы закрываются с помощью CloseHandle. На самом деле, эта процедура используется не только для работы с файлами, так что мы еще не единожды с нею встретимся.

Посмотрим теперь на все это хозяйство в действии. Следующая программа пишет в файл counter.dat количество собственных запусков. Первые пять запусков ничем не примечательны. На шестой и последующие запуски программа сообщает, что у нее истек триал и просит приобрести полную версию.

#define MAX_TRIAL_RUNS 5

const TCHAR szCounterFileName [ ] = L "counter.dat" ;
const TCHAR szMsgTmpl [ ] = L "Вы запустили программу в %d-й раз. %s." ;
const TCHAR szCheckOk [ ] = L "Все в порядке, продолжайте работу" ;
const TCHAR szCheckFailed [ ] = L "Триал истек, купите полную версию" ;

DWORD ReadCounter ( ) <
DWORD dwCounter , dwTemp ;
HANDLE hFile = CreateFile ( szCounterFileName , GENERIC_READ , 0 , NULL ,
OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( INVAL >== hFile ) <
return 1 ;
>
ReadFile ( hFile , & dwCounter , sizeof ( dwCounter ) , & dwTemp , NULL ) ;
if ( sizeof ( dwCounter ) != dwTemp ) <
CloseHandle ( hFile ) ;
return 1 ;
>
CloseHandle ( hFile ) ;
return dwCounter ;
>

VO >( DWORD dwCounter ) <
DWORD dwTemp ;
HANDLE hFile = CreateFile ( szCounterFileName , GENERIC_WRITE , 0 , NULL ,
CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( INVAL >== hFile ) <
return ;
>
WriteFile ( hFile , & dwCounter , sizeof ( dwCounter ) , & dwTemp , NULL ) ;
CloseHandle ( hFile ) ;
>

int main ( ) <
TCHAR szMsg [ 256 ] ;
DWORD dwCounter = ReadCounter ( ) ;
LPCWSTR lpCheckResult = dwCounter > MAX_TRIAL_RUNS ?
szCheckFailed : szCheckOk ;
wsprintf ( szMsg , szMsgTmpl , dwCounter , lpCheckResult ) ;
MessageBox ( 0 , szMsg , L "Сообщение" , 0 ) ;

if ( dwCounter MAX_TRIAL_RUNS ) <
WriteCounter ( dwCounter + 1 ) ;
>

Как обычно, программа также успешно компилируется при помощи MinGW и запускается под Wine.

В качестве домашнего задания можете попробовать модифицировать программу так, чтобы она выводила время, когда производились все ее запуски. Для этого вам понадобятся процедуры GetLocalTime, SetFilePointer и GetFileSizeEx. Если это задание покажется вам слишком простым, попробуйте найти информацию о том, как при помощи процедур, упомянутых в этой заметке, (1) написать консольное приложение и (2) открыть диск C: на чтение, словно он является обычным файлом.

Читайте также:  Как выйти в интернет через смартфон

Если у вас есть дополнения или возникли вопросы, смелее пишите комментарии, не стесняйтесь!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector