Задать вопрос
@Retr0Hacker

Почему не получается открыть файл?

Приветствую всех гениев цифровой эпохи

На повестке дня вот такая задачка: "Используйте функцию GetOpenFileName для выбора файла. Проверить, если возраст файла не превышает 3 дней, выполните его. В противном случае вывести диалоговое окно с вопросом о удалении файла. Если пользователь пригодится, вытереть." (Внимание. Если в задании сказано использовать структуру, то она должна быть размещена в динамически выделенной памяти)

После успешного выполнения функции GetOpenFileName я хочу открыть выбранный файл. Я пробовал двумя вариантами:
1) Через функцию CreateFile(с необходимыми только для открывания и чтения файла параметрами)
2) Через функцию OpenFile

От OpenFile я отказался, так как она устаревшая.
Разобрался немного с CreateFile, но почему то регистр eax заполняется FFFFFFFF, и дебагер пишет: "Синтаксическая ошибка в имени файла, имени папки или метке тома", хотя по идеи не должен был бы(

File.inc
include WINDOWS.inc

include user32.inc
include kernel32.inc
include comdlg32.inc

includelib user32.lib
includelib kernel32.lib
includelib comdlg32.lib

.data
	
	Time_title	db ' Ëàáîðàòîðíà ðîáîòà ¹3',0
	buf db 255 dup(0)
	pmem dd 0


File.asm
.386
.model flat,STDCALL
option casemap :none  ;case sensitive
include Third.inc
include RADbg.inc

Mem_Alloc PROC Buf_Size:DWORD
	add Buf_Size,4
	invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,Buf_Size
	push eax
	invoke GlobalLock,eax
	pop [eax]
	add eax,4
	ret
Mem_Alloc endp

Mem_Free PROC DATA:DWORD
	mov eax,DATA

	sub eax,4
	mov eax,[eax]
	push eax
	push eax
	call GlobalUnlock 
	call GlobalFree	
	ret
Mem_Free endp


.code
Begin:
	call main
	invoke ExitProcess,NULL
	
main proc
	LOCAL hFile:DWORD
	LOCAL ftCreate, ftLocale: FILETIME;
	LOCAL stUTC, stLocal: SYSTEMTIME;
	
	invoke Mem_Alloc, sizeof OPENFILENAME
	mov pmem, eax
	mov edi, pmem
	assume edi: ptr OPENFILENAME
	xor eax, eax
	mov [edi].lStructSize, sizeof OPENFILENAME
	mov [edi].lpstrFile, offset buf
	mov [edi].nMaxFile, 255
	invoke GetOpenFileName, edi
	invoke CreateFile, addr [edi].lpstrFile, GENERIC_READ,\	;немного разобрался
		FILE_SHARE_READ, NULL, OPEN_EXISTING,\
		FILE_ATTRIBUTE_NORMAL, NULL
	mov hFile,eax
	invoke GetFileTime, hFile, addr ftCreate, NULL, NULL
	invoke FileTimeToLocalFileTime, addr ftCreate, addr ftLocale
	invoke FileTimeToSystemTime, addr ftCreate, addr stUTC

	jne l1
	
	jmp l2
	
	assume edi: dword
	invoke Mem_Free, hFile
l1:
	
	
l2:
	
	ret
	
main endp	
end Begin
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
invoke CreateFile, addr [edi].lpstrFile, GENERIC_READ,

addr [edi].lpstrFile выглядит неправильно. Должно быть либо [edi].lpstrFile (значение указателя, а не его адрес), либо offset buf.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы