Здравствуйте. Помогите, пожалуйста, понять - почему так .data FNM1 db 20 DUP(0) . . .data? hFile HANDLE ? MEMSIZE DWORD ? . . .code start: . . ; invoke CreateFile,ADDR FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\ ; NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL invoke CreateFile,offset FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\ NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL mov hFile,eax .IF EAX == -1 JMP EXIT_ERR .ENDIF invoke GetFileSize,hFile,NULL mov MEMSIZE,EAX . . ........ У знакомого когда-то была подобная ситуация,-под дебагером на NT и без дебагера под Win98 отрабатывало нормально, а без дебагера под NT- нет. Может кто-то еще наступал на такие грабли и знает в чем глюк? Заранее благодарю.
В догонку - в FNM1 помещаю имя файла с 0 в конце, полученого из командной строки. Под дебагером переход на EXIT_ERR не происходит, файл открывается нормально. С таким-же именем файла без дебагера - происходит переход на EXIT_ERR. Если в FNM1 принудительно в исходнике помещаю нужное имя - срабатывает нормально и без отладчика.
... invoke GetCommandLine mov CommandLine,eax ; в MsgBoxCng получаем имя ini-файла ;---------------------------------------------------------------- MOV CL,[EAX] LEA ESI,FNM1 XOR CH,CH .WHILE CL != 0 ;--тут отсекаю путь и имя исполняемого файла между 2-мя (") .IF CL == '"' INC CH .ENDIF .IF CH == 2 INC CH ADD EAX,2 MOV CL,[EAX] .ENDIF ;-- ниже заношу имя передаваемого файла в FNM1 .IF CH > 2 INC CH mov [ESI],CL inc ESI .ENDIF inc EAX MOV CL,[EAX] .ENDW MOV CL,0 MOV [ESI],CL ;------------------------------------------------------------------ invoke CreateFile,ADDR FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\ NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL ...
У меня ситуация, когда под отладчиком работает, а без отладчика - нет, иногда встречается и всегда означает залезание за пределы выделенной памяти в каком-то месте программы (условно говоря, выделил 16 байт и перезаписал 17-й). (При наличии отладчика немного меняется стратегия выделения памяти.) Весь код - в студию...
.386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\user32.inc includelib \masm32\lib\user32.lib .const .data MsgCaption db " ",0 MsgBoxCng DB 19 DUP(0) FileNM1 DB 19 DUP(0) FileNM2 DB 19 DUP(0) FNM1 db 19 DUP(0) ofn OFSTRUCT <> .data? hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы CommandLine LPSTR ? hFile HANDLE ? hMemory DWORD ? pMemory DWORD ? ;MsgBoxCng DB 20 DUP(?) MEMSIZE DWORD ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax ; имя файла ;---------------------------------------------------------------- MOV CL,[EAX] ; MOV ECX, offset MsgBoxCng LEA ESI,FNM1 ; MOV EDI,MsgBoxCng XOR CH,CH .WHILE CL != 0 .IF CL == '"' INC CH .ENDIF .IF CH == 2 INC CH ADD EAX,2 MOV CL,[EAX] .ENDIF .IF CH > 2 INC CH ; (СH - 2) - получим кол-во байт в имени mov [ESI],CL inc ESI .ENDIF inc EAX MOV CL,[EAX] .ENDW MOV CL,0 MOV [ESI],CL ;------------------------------------------------------------------ invoke CreateFile,ADDR FNM1,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\ NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL mov hFile,eax .IF EAX == -1 JMP EXIT_ERR .ENDIF invoke GetFileSize,hFile,NULL mov MEMSIZE,EAX invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE mov hMemory,eax invoke GlobalLock,hMemory mov pMemory,eax invoke MessageBox, NULL,addr FNM1, addr MsgCaption, MB_OK EXIT_ERR: invoke ExitProcess,NULL end start
Fakir Попробуй сделать SetCurrentDirectory(...) Да и зачем FILE_ATTRIBUTE_ARCHIVE? Сделай FILE_ATTRIBUTE_NORMAL
Под Тotal Commanderom отработало!!! Через "Run" тоже! Из под Far-а (DOS-сесия??) не хочет. Возможно в этом причина? Можно-ли обойти?
Ну конечно! Кто сказал, что имя exe-шника всегда обрамляется в кавычки? В общем случае кавычек может и не быть. (например, при запуске из Far'а это проявляется).
БЛАГОДАРЮ! А не подскажите способ/функцию получения из коммандной строки только передаваемых параметров? Как новичек в асме под Win32 - прошу снисходительности.