Code (Text): include '%fasm%/win64ax.inc' section '.code' executable start: stdcall del,'3d_maker_embeded' stdcall del,'Coverlabel' stdcall del,'GeoModule' stdcall del,'MusicEditor' stdcall del,'Online' stdcall del,'PhotoDesigner' stdcall del,'Video_deluxe_MX_Premium_en-GB_SetupRes' stdcall del,'Video_deluxe_MX_Premium_en-GB_setup.exe' stdcall del,'Video_deluxe_MX_Premium_en-GB_SetupInfo.ini' stdcall del,'license.txt' stdcall del,'support.rtf' exit: invoke ExitProcess,NULL FO_DELETE = 3 FOF_SILENT = 4 FOF_NOCONFIRMATION = 10h proc del a sub rsp,40 ; это я так на всякий случай, толку от выравнивания не вижу пока. mov qword [lpFileOp.fFlags],FOF_SILENT + FOF_NOCONFIRMATION mov qword [lpFileOp.wFunc],FO_DELETE invoke RtlZeroMemory,x,MAX_PATH invoke ExpandEnvironmentStrings,\ '%ProgramFiles(x86)%\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version\',x,MAX_PATH invoke lstrcat,x,qword [a] mov qword [lpFileOp.pFrom],x invoke SHFileOperation,lpFileOp ret endp section '.data' readable writeable a rb MAX_PATH x rb MAX_PATH struct SHFILEOPSTRUCT hwnd dq NULL wFunc dq NULL pFrom dq NULL pTo dq NULL fFlags dq NULL fAnyOperationsAborted dq NULL hNameMappings dq NULL lpszProgressTitle dq NULL ends lpFileOp SHFILEOPSTRUCT section '.idata' import readable library kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL' import kernel32,\ ExitProcess,'ExitProcess',\ ExpandEnvironmentStrings,'ExpandEnvironmentStringsA',\ lstrcat,'lstrcatA',RtlZeroMemory,'RtlZeroMemory' import shell32,\ SHFileOperation,'SHFileOperationA' Чё-то тишина. Код работоспособный под x86. Если напрямую записать параметр в самой процедуре тогда работает, правда это ни на какую мысль не наводит.
Помогите с программой pastebin.com/jn8FAy4G где-то в районе [69] как-то не стабильно работает... Code (Text): mov [lpFileOp.wFunc],FO_RENAME invoke RtlZeroMemory,x,MAX_PATH invoke RtlZeroMemory,y,MAX_PATH invoke SHGetSpecialFolderPath,NULL,x,CSIDL_PROGRAM_FILESX86,NULL invoke lstrcat,x,'\MAGIX\Movie_Edit_Pro_MX_Premium_Download_Version' mov [lpFileOp.pFrom],x invoke SHGetSpecialFolderPath,NULL,y,CSIDL_PROGRAM_FILESX86,NULL invoke lstrcat,y,'\MAGIX\Videodeluxe' mov [lpFileOp.pTo],y invoke SHFileOperation,lpFileOp mov [lpFileOp.wFunc],FO_MOVE invoke RtlZeroMemory,x,MAX_PATH invoke RtlZeroMemory,y,MAX_PATH invoke SHGetSpecialFolderPath,NULL,x,CSIDL_PROGRAM_FILESX86,NULL invoke lstrcat,x,'\MAGIX\Videodeluxe' mov [lpFileOp.pFrom],x invoke SHGetSpecialFolderPath,NULL,y,CSIDL_PROGRAM_FILES,NULL invoke lstrcat,y,'\' mov [lpFileOp.pTo],y invoke SHFileOperation,lpFileOp если у меня всё правильно, тогда дело в другом значит. Этот код у меня копирует папку после работы MSI инсталлера, и выполняет другие задачи походу. Пакет огромный, поэтому нагрузка на файловую систему идёт сильная. Честно говоря я не понимаю почему пакет 250мб так долго и мучительно устанавливается. Но возможности избавиться от msi нет, поэтому я сделал как бы постинстал конфиг на асме Запускается это во время t12 установки WinXP, хотя там как бы весь набор библиотек присутствует. На текущей системе иногда работает иногда нет, на установке win всегда сбой. Хотя по моему впечатлению здесь проблемма в скорости выполнения, как бы сбой из-за сильной нагрузки на фс. Разве нет? Либо я плохо код написал? Процедур у меня здесь нет, так как с ними в x64 вообще засада, к сожалению. Насчёт копирования есть не очевидная на первый взгляд проблемма, если выполнить A 2 B и при этом папка B существует, то получиться B\A поэтому сначала идёт переименование и затем копирование.
Всё нормально, это msi собака rollback врубает и удаляет себя, потому что я там подпортил кое чё Значится код я написал нормально, хотя жаль что без процедур пока.