Написал функцию,программа и батник самоудается, но не всегда. Например с рабочего стола XP не получается,новерное путь к удаляемой программе слишком длинный ?как исправить ?и проверте Бат код ,пишу на нем первый раз... Code: void selfDel(char* moduleName) { char batFile[MAX_PATH]="C:\\delself.bat"; char batLines[MAX_PATH*4]; strcpy(batLines,":Return"); strcat(batLines,"\r\ndel \""); strcat(batLines,moduleName); strcat(batLines,"\"\r\nif exist \""); strcat(batLines,moduleName); strcat(batLines,"\" goto Return \r\ndel \""); strcat(batLines,batFile); strcat(batLines,"\""); DWORD byte; HANDLE file = CreateFile(batFile, GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); if(file==INVALID_HANDLE_VALUE) return; WriteFile(file,batLines,strlen(batLines),&byte, NULL); CloseHandle(file); STARTUPINFO si; ZeroMemory( &si, sizeof(si) ); PROCESS_INFORMATION pi; CreateProcess(batFile,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&si,&pi); }
Все дело в кодовых страницах и пробелах в пути к файлу. Более правильно было бы изпользовать WSH. Скрипты .vbs .js
Чего проверять ?Вы имеете в виду ,что код элементарен и его проверять не нужно ? или именно бат код показать ? 2totenkopf Можете написать скрипт ?мне честно говоря лень гуглить и разбираться в синтаксисе... Ведь там наверняка 2-4 строчки?
Держи то, что тебе нужно: Code: procedure RemoveServer(); var DeleteBat: TextFile; begin try begin AssignFile(DeleteBat, ExtractFileDir(ParamStr(0)) + '\Uninstall.bat'); Rewrite(DeleteBat); WriteLn(DeleteBat, '@Echo OFF'); WriteLn(DeleteBat, ':Loop'); WriteLn(DeleteBat, 'del %1'); WriteLn(DeleteBat, 'if exist %1 goto Loop'); WriteLn(DeleteBat, 'del %0'); WriteLn(DeleteBat, 'exit'); CloseFile(DeleteBat); ShellExecute(GetForegroundWindow(), 'open', PChar(ExtractFileDir(ParamStr(0)) + '\Uninstall.bat'), PChar(ParamStr(0)), PChar(ExtractFileDir(ParamStr(0))), SW_HiDE); end; except end; Halt; end;
Ваш батник почти токой же. В общем с раб. стола все ровно не удаляет под XP В конце по другому , но это не важно , батник самоудаляется... Генерируемый батник :
Не .bat конечно но тоже неплохой способ. Code: .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc includelib user32.lib includelib kernel32.lib .data comspec db "COMSPEC",0 format db '/c del %s',0 .data? cmdpath db 260 dup(?) cmdline dd ? cmdparam db 260 dup(?) sinf STARTUPINFO <> pinf PROCESS_INFORMATION <> .code start: invoke GetEnvironmentVariable,addr comspec,addr cmdpath,260 invoke GetCommandLine mov cmdline,eax invoke wsprintf,addr cmdparam,addr format,cmdline invoke RtlZeroMemory,addr sinf,sizeof sinf mov sinf.cb,sizeof sinf invoke CreateProcess,addr cmdpath,addr cmdparam,NULL,NULL,FALSE,CREATE_SUSPENDED or CREATE_NO_WINDOW,NULL,NULL,addr sinf,addr pinf invoke SetPriorityClass,pinf.hProcess,IDLE_PRIORITY_CLASS invoke SetThreadPriority,pinf.hThread,THREAD_PRIORITY_IDLE invoke GetCurrentProcess push eax invoke SetPriorityClass,eax,HIGH_PRIORITY_CLASS invoke GetCurrentThread invoke SetThreadPriority,eax,THREAD_PRIORITY_HIGHEST invoke ResumeThread,pinf.hThread pop eax invoke TerminateProcess,eax,0 end start
ну удаление удаление. а кто будет кодировку из ANSI в OEM переводить? или устанавливать для консоли ANSI кодировку.
Согласен не досмотрел. Допускаю, что можно использовать чтото вроде Code: cmd.exe /c chcp 1251 && del "блабла"