배경 참고 사항:
얼마 전에 저는 데이터 변환 시스템을 개발했습니다. 비즈니스 로직에서는 데이터를 .tar.gz 형식으로 압축해야 한다고 명시했습니다.
저는 Windows 시스템에서 사용하는데 먼저 배치 파일을 생성한 후 WinExec을 호출하여 배치 파일을 실행하고 일정 시간을 기다린 후 데이터 자동 압축을 완료합니다.
나중에 압축할 파일의 크기가 불확실하며, WinExec 실행 시 단순히 일정 시간 동안 휴면 상태로 있을 경우 압축 실패, 파일 불완전 또는 손상이 발생할 수 있다는 사실이 밝혀졌습니다.
최적화 계획:
WinExe 대신 CreateProcess를 사용하여 프로세스를 시작하고 배치 파일을 실행하는 동시에 시스템이 자동으로 TProcessInformation 구조를 채웁니다.
이때 프로그램은 자동으로 일괄 처리를 차단하고 일괄 처리 프로세스가 종료되거나 시간 초과될 때까지 기다립니다. 이렇게 하면 압축 손상 문제가 해결됩니다.
데모 예시를 들어보세요:
D7 코드는 다음과 같습니다.
uMain; 인터페이스는 Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, RzButton, StdCtrls를 사용합니다. TFrmMain = class(TForm) mmMsg: TMemo; btnExecute: TRzBitBtn: TRzBitBtn; 프로시저 MsgDsp(v_Str: 문자열); btnExecuteClick(Sender: TObject); 절차 btnClearClick(Sender: TObject); private { 개인 선언 } public { 공개 선언 } end;var FrmMain: TFrmMain;implementation{$R *.dfm}procedure TFrmMain.MsgDsp(v_Str: string); mmMsg.Lines.Add('[ 관리자 ] - [' + v_Str + '] - [' + FormatDateTime('YYYY-MM-DD hh:mm:ss zzz', Now()) + ']');end;procedure TFrmMain.btnExecuteClick(Sender: TObject);var sInfo: TStartupInfo ; pInfo: TProcessInformation; cmdLine: 문자열; 시작 MsgDsp('초기화 매개변수'); cmdLine := 'C:/Program Files/7-Zip/7zFM.exe'; FillChar(sInfo, sizeof(sInfo), #0); sInfo.dwFlags := STARTF_USESHOWWINDOW sInfo.wShowWindow := SW_NORMAL; MsgDsp('매개변수 초기화가 완료되었습니다. WinExec 디버깅을 시작합니다.'); //CreateProcess를 사용하여 프로세스를 시작합니다. 프로세스가 시작된 후 TProcessInformation 구조가 채워집니다. //이때 프로그램은 핸들, CreateProcess(nil, pchar(cmdLine), nil, nil, false, CREATE_NEW_CONSOLE 또는 NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo) 그런 다음 MsgDsp('WinExec 디버깅에 실패했습니다! '); MessageBox(Application.handle, '지정된 프로그램을 시작하지 못했습니다!', '오류', MB_OK 또는 MB_ICONSTOP) end else start //지정된 핸들의 프로세스가 종료되거나 시간 초과될 때까지 기다립니다. WaitForSingleObject(pInfo.hProcess , INFINITE); GetExitCodeProcess( pInfo.hProcess,exitCode); MsgDsp('WinExec 디버깅 성공!'); TFrmMain.btnClearClick(보내기: TObject);시작 mmMsg.Clear;끝;끝.
실행 효과는 다음과 같습니다.
요약
위 내용은 델파이의 외부 프로그램 호출과 외부 프로그램 차단에 대한 편집자의 소개입니다. 궁금한 점이 있으시면 메시지를 남겨주시면 편집자가 시간에 맞춰 답변해 드리겠습니다. 또한 Wulin.com 웹사이트를 지원해 주신 모든 분들께 감사드립니다!
이 글이 도움이 되셨다면 재인쇄하셔도 좋고, 출처를 밝혀주시면 감사하겠습니다!