죄송해요 아래꺼 제목을 잘못 올렸습니다.
비밀번호를 잘못 입력했는지 수정이 안되서
다시 올릴께요..
[첫번째 질문]
exParam := 'File1.exe'+' '+'param1+' '+ 'param2
winexec(Pchar(exParam),SW_SHOWNORMAL)
형식으로 특정 실행화일(File1.exe)을 실행을 시켰습니다.
(이것은 지난주에 안치봉님이 가르쳐주신 방법입니다.
안치봉님께 감사드립니다.)
그런데 위의 화일(File1.exe)을 실행시키기전에
그 화일이 이미 실행이 되어 있으면 그 화일을 종료를 하고
아규먼트를 다른 것을 주고 다시 실행시키고 싶거든요.
어케 하면 되는지 도움 부탁드립니다.
[두번째 질문]
내 컴퓨터의 IP 주소를 가져오는 방법좀 알려주세요.
이전의 Q&A 를 뒤져보니까 몇가지 답변이 있긴 한데요,
서버에 접속한 상태에서의 IP주소를 얻는 방법같아서요.
그냥 실행상태에서 내 IP주소를 알고만 싶은데,
어떻게 안될까요?
> 죄송해요 아래꺼 제목을 잘못 올렸습니다.
> 비밀번호를 잘못 입력했는지 수정이 안되서
> 다시 올릴께요..
>
> [첫번째 질문]
> exParam := 'File1.exe'+' '+'param1+' '+ 'param2
> winexec(Pchar(exParam),SW_SHOWNORMAL)
> 형식으로 특정 실행화일(File1.exe)을 실행을 시켰습니다.
> (이것은 지난주에 안치봉님이 가르쳐주신 방법입니다.
> 안치봉님께 감사드립니다.)
> 그런데 위의 화일(File1.exe)을 실행시키기전에
> 그 화일이 이미 실행이 되어 있으면 그 화일을 종료를 하고
> 아규먼트를 다른 것을 주고 다시 실행시키고 싶거든요.
> 어케 하면 되는지 도움 부탁드립니다.
이수님 안녕하세요~ 저 구창민입니다.
오프때 옆자리에 앉았었는데 혹 기억할려나? ^^
화일이 이미 실행되어 있는지 알아보려면 먼저
현재 실행되어 있는 화일목록을 몽땅 구한다음에
그중에서 있나 찾아보고 죽여버리면 되죠.
아래에 예를 들죠.
먼저 uses 에 TlHelp32추가 하시구요,
...
...
implementation
{$R *.DFM}
//현재 실행되어 있는 프로세서 목록을 구합니다.
procedure Process32List(Slist: TStrings);
var Process32: TProcessEntry32;
SHandle: THandle; // the handle of the Windows object
Next: BOOL;
begin
Process32.dwSize := SizeOf(TProcessEntry32);
SHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(SHandle, Process32) then
begin
Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
repeat
Next := Process32Next(SHandle, Process32);
if Next then
Slist.AddObject(Process32.szExeFile, TObject(Process32.th32ProcessID));
until not Next;
end;
CloseHandle(SHandle);
end;
//실행되어 있는 목록을 구해내는 버튼클릭 이벤트
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
//실행되어 있는 프로세서 목록을 ListBox1에 구해낸다.
Process32List(ListBox1.Items);
end;
//그럼 실행된 프로그램중에 이수님이 죽이기 원하는 프로세서가
//떠있는지는 ListBox1의 목록중에서 뒤져봐야 겠지요?
//그 뒤지는 부분의 코딩은 이수님이 직접 구현하세요.
//IndexOf함수를 쓰면 금방 찾을수 있을겁니다.
//거기 까지 되면 이제 죽여야지요.
//아래는 원하는 프로세서 죽이는 버튼이벤트
procedure TForm1.Button2Click(Sender: TObject);
var
hProcess: THandle;
ProcId: DWORD;
TermSucc: BOOL;
begin
// 현재 실행중인 process를 kill
if ListBox1.ItemIndex < 0 then System.Exit;
ProcId := DWORD(ListBox1.Items.Objects[ListBox1.ItemIndex]);
// 존재하는 process object의 handle을 return한다
hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcId);
if hProcess = NULL then
ShowMessage('OpenProcess error !');
// 명시한 process를 강제 종료시킨다
TermSucc := TerminateProcess(hProcess, 0);
if TermSucc = FALSE then
ShowMessage('TerminateProcess error !')
else
ShowMessage(Format('Process# %x terminated successfully !', [ProcId]));
end;
end.
> [두번째 질문]
>
> 내 컴퓨터의 IP 주소를 가져오는 방법좀 알려주세요.
> 이전의 Q&A 를 뒤져보니까 몇가지 답변이 있긴 한데요,
> 서버에 접속한 상태에서의 IP주소를 얻는 방법같아서요.
> 그냥 실행상태에서 내 IP주소를 알고만 싶은데,
> 어떻게 안될까요?
이건 uses 에 WinSock추가하시구요
아래 코드를 사용하세요.
procedure TForm1.Button1Click(Sender: TObject);
var
WSAData : TWSAData;
HostName, Address ,Domain,ComName: string;
HostEnt : PHostEnt;
I : DWord;
begin
WSAStartup(2, WSAData);
SetLength(HostName,255);
getHostname(PChar(HostName),255);
Label1.Caption := HostName;
SetLength(HostName,strLen(PChar(HostName)));
HostEnt := getHostbyName(PChar(HostName));
with HostEnt^ do
Address := Format('%d.%d.%d.%d',[Byte(h_addr^[0]),Byte(h_addr^[1]),
Byte(h_addr^[2]), Byte(h_addr^[3])]);
Label2.Caption := Address;
WSACleanup;
I :=100;
SetLength(Comname,255);
GetComputername(PChar(Comname),i);
Label7.Caption := Comname;
end;
그럼, 항상 즐거운 프로그래밍 하세요~