Q&A

  • 프로그램의 유일성 유지하기위한 실제 파일명 구하기 ㅠㅠ
팁게시판의 "프로그램의 유일성 유지하기" 란 글을 보고

begin
Application.Initialize;

ProcessUnique := TProcessUnique.Create;
ProcessUnique.ExecuteProcessUnique;
ProcessUnique.Free;

Application.CreateForm(TForm1, Form1);
Application.Run;
end.

클래스는 다음과 같습니다.

unit ClassProcessUnique;

interface
uses
Windows, Messages, SysUtils, Classes, Forms, Dialogs, TlHelp32, ShellAPI;
type
TProcessUnique = class(TObject)
private
Procedure KillProcess(ProcID:DWORD);
procedure AnalyProcess(PList:TStringlist);
public
Constructor Create;
Procedure ExecuteProcessUnique;
end;

var
ProcessUnique : TProcessUnique;

implementation

Constructor TProcessUnique.Create;
begin
end;

//{UniqueProcess 모듈}====================================================
Procedure TProcessUnique.ExecuteProcessUnique;
var
AppName : String;
ProcessList, AnalyStr, ResultList : TStringList;
num : Integer;
begin
ProcessList := TStringList.Create;
AnalyStr := TStringList.Create;
ResultList := TStringList.Create;

AppName := LowerCase(ExtractFileName(Application.ExeName));
AnalyProcess(ProcessList);

for num := 0 to ProcessList.Count -1 do {자신의 실행 파일 목록과 동일한 것을 추려냄}
begin
AnalyStr.Clear;
AnalyStr.CommaText := ProcessList.Strings[num];
if AppName = AnalyStr.Strings[0] then
ResultList.Add (ProcessList.Strings[num]);
end;

ResultList.Delete(ResultList.Count -1 ); {자신의 프로세스는 삭제}
for num := 0 to ResultList.Count -1 do
begin
AnalyStr.Clear;
AnalyStr.CommaText := ResultList.Strings[num];
KillProcess(StrToInt64(AnalyStr.Strings[1])); {프로세스 삭제}
end;

ProcessList.Free;
AnalyStr.Free;
ResultList.Free;
end;

//{프로세스 종료 Function}====================================================
Procedure TProcessUnique.KillProcess(ProcID:DWORD);
var
hProcess: THandle;
TermSucc: BOOL;
begin
hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcID);
if hProcess <> NULL then TermSucc := TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
end;

//{UniqueProcess 분석 시작}====================================================
procedure TProcessUnique.AnalyProcess(PList:TStringlist);
var
Process32: TProcessEntry32;
SHandle: THandle;
Next: BOOL;
begin
Process32.dwSize := SizeOf(TProcessEntry32);
SHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(SHandle, Process32) then
begin
PList.Add(LowerCase(ExtractFileName(Process32.szExeFile)) + ','+
Inttostr(Process32.th32ProcessID));
repeat
Next := Process32Next(SHandle, Process32);
if Next then
begin
PList.Add(LowerCase(ExtractFileName(Process32.szExeFile)) + ','+
Inttostr(Process32.th32ProcessID));
end;
until not Next;
end;
CloseHandle(SHandle);
end;

end.


이대로 하게 되었는데요.

문제가 발생하네요.

예를 들어 델파이로 제작된 프로그램 이라 하더라도 이름바꾸기를 하여

젤 처음에 프로그램 제작시의 이름과 다르게 바꾸기를 해 놓으면

for num := 0 to ProcessList.Count -1 do {자신의 실행 파일 목록과 동일한 것을 추려냄}
begin
AnalyStr.Clear;
AnalyStr.CommaText := ProcessList.Strings[num];
if AppName = AnalyStr.Strings[0] then
ResultList.Add (ProcessList.Strings[num]);
end;

이부분에서 if AppName = AnalyStr.Strings[0] then 이게 발생하지 않네요.ㅠㅠ

단순히 처음 제작 프로그램의 이름을 바꾸어 놓았을 뿐인데

AppName 은 현재 바뀐 프로그램의 이름으로 되어 있고

ProcessList.Strings[num]은 처음 제작되었을때의 이름으로 되어서

같은 것을 찾을수가 없네요.

만일 AppName 이 알집 같은 다른 외부 프로그램도 마찬가지네요.

다른 압축 파일인데도

ProcessList.Strings[num] 에서는 Alzip.exe 라는 실행파일명으로  두개가

떠 버리니.. 같은 것을 찾을수가 없습니다.

이문제를 해결 할수 있는 방법이 없을까요.

조그마한 가르침이라도 부탁 드려요.


0  COMMENTS