Вот код: Код (Text): format PE console include 'win32axp.inc' include 'shellapiA.inc' .data ns dd ? hout dd ? buffer db 262 dup (?) help db 'Usage: shdel.exe path_to_file',0 Retry db 'Program fails. Please, retry',0 sh _SHFILEOPSTRUCT NULL,FO_DELETE,NULL,NULL,FOF_SILENT or FOF_FILESONLY or FOF_NOCONFIRMATION,NULL,NULL,NULL .code fuck: invoke GetStdHandle,STD_OUTPUT_HANDLE mov [hout],eax invoke GetCommandLine mov esi,eax cycle1: cmp byte [esi],20h je parameter cmp byte [esi],0Dh je najobka inc esi jmp cycle1 parameter: mov edi,buffer mov ecx,260 cycle2: inc esi mov al,byte [esi] cmp al,0Dh je konets mov byte [edi],al inc edi loop cycle2 konets: mov word [edi],0 invoke lstrlen,buffer test eax,eax jz najobka mov eax,buffer mov [sh.pFrom],eax invoke SHFileOperation,sh test eax,eax jz exit retry: invoke WriteConsole,[hout],Retry,28,ns,NULL exit: invoke ExitProcess,0 najobka: invoke WriteConsole,[hout],help,29,ns,NULL jmp exit .end fuck Структуру _SHFILEOPSTRUCT определяю в отдельной инклуде Код (Text): struct _SHFILEOPSTRUCT hwnd dd ? wFunc dd ? pFrom dd ? pTo dd ? fFlags dd ? fAnyOperationsAborted dd ? hNameMappings dd ? lpszProgressTitle dd ? ends FO_MOVE = 1h FO_COPY = 2h FO_DELETE = 3h FO_RENAME = 4h FOF_MULTIDESTFILES = 1h FOF_CONFIRMMOUSE = 2h FOF_SILENT = 4h FOF_RENAMEONCOLLISION = 8h FOF_NOCONFIRMATION = 10h FOF_WANTMAPPINGHANDLE = 20h FOF_ALLOWUNDO = 40h FOF_FILESONLY = 80h FOF_SIMPLEPROGRESS = 100h FOF_NOCONFIRMMKDIR = 200h Получаю в eax 402h - что не так?
Adrax скомпилить этот код не трудно, не хватает информации: 1) ос; 2) полное имя исполняемого файла; 3) передаваемый параметр.
WinXP SP1 Pro Rus FASM 1.67.12 Файл обзываю shdel.exe, передаю и путь к файлу, и имя файла, лежащего в текущей директории - одна и та же ошибка
А ты сам лучше с дебаггерами подружись. *...и опыт - сын ошибок трудных...*(с) а так ошибка в парсере - в коммандной строке нету CR/LF (CR в данном случае). А вообще лучше взять готовый парсер, если не хочешь возиться с ним ибо очень много мелочей тама - типа ["] в параметрах-строках, содержащих пробелы. Короче Оля тебе в помощь, а так код симпатичный и без видимых) изъянов.
Adrax Ответ на 1-ый вопрос ясен. Ответы на 2-ой и 3-тий вопросы не получил, поэтому спрошу по-другому. Покажи строчку, которая содержится по адресу, который вернула GetCommandLine, в ней я надеюсь увидеть _полное_ имя исполняемого файла и пераданный(ые) параметр(ы).
2 asmfan Поподробнее, плиз, про CR - разве он там нужен? Я формирую чисто строку пути-имени с терминальным нулём - большинству файловых API так и надо! А что, SHFileOperation требует CR (0Dh)?? Это многое объяснило бы...
Итак, по порядку FOF_FILESONLY - Performs the operation only on files if a wildcard filename (*.*) is specified. Вывод - флаг излишен. Код Код (Text): cycle1: cmp byte [esi],20h je parameter cmp byte [esi],0Dh je najobka inc esi jmp cycle1 0Dh - он самый CR, которого в нормальной коммандной строке не встретить. Далее - потрейс Олей с различными параметрами коммандной строки и увидишь, что её вид различен: Пример ["D:\yourapp.exe" ] ["D:\yourapp.exe" D:\somedir\somefile.ext] ["D:\yourapp.exe" D:\somedir\somefile.ext "D:\som edir2\somefile2.ext" D:\somedir\somefile.ext] Это всё командные строки. И парсить аргументы надо по-разному, т.к. фигурируют пробелы, ["]... В общем поиск парсеров и работа с Олей - и бедет тебе опыт
2 asmfan Простейший код пишу - т.е. параметром передаю имя или путь одного файла, либо маску... А по поводу CR и LF - они в командной строке есть! В Оле и гонял код... Парсер командной строки писал самостоятельно, уж изволь... С DeleteFile всё получается просто идеально, а к SHFileOperation никак не пристроюсь...
Как их увидеть тогда?) Выкладываю свои парсеры. Просто драг'н'дроп файлы на экзешку и посмоти результат. Всё в одну строку без CR/LF или их комбинаций. В общем серия экспериментов и результат будет, и кстати Оля иногда некорректно высталяет коммандную строку, когда параметры на дефолте - сам убедись: ["D:\yourapp.exe" ] - так должно быть (или не должно, но есть в Виндоуз). ["D:\yourapp.exe"] - так выставляет Оля. Разница в символе 20h перед 0.
2 asmfan Оля показывает CR и LF символами псевдографики, и они реально просачиваются в строки... Не знаю, как в случае с GetCommandLine, но ReadFile/ReadConsole считывает строку с ними - я с ориентиром на них и писал свой парсер... За твои парсеры спасибо - поизучаю