Q&A

  • WindowsNT에서 실행하기
안녕하세요!



WindowsNT 상에서 Setup 하고

실행하려고 하는데 아래와 같은 에러 메세지가 났습니다.



//----------------------------------------------------------------------

- project1.exe 시작지점 없음 -

프로시저 시작 지점 process32Next를 DLLKernel32.dll에서 찾을 수 없습니다.

//----------------------------------------------------------------------



어느 부분에서 문제가 있는지를 모르겠습니다.

아시는 분 계시면 답변 부탁드립니다.



99.12.12

문영미 올림

1  COMMENTS
  • Profile
    김영대 1999.12.13 20:34
    문영미 wrote:

    > 안녕하세요!

    >

    > WindowsNT 상에서 Setup 하고

    > 실행하려고 하는데 아래와 같은 에러 메세지가 났습니다.

    >

    > //----------------------------------------------------------------------

    > - project1.exe 시작지점 없음 -

    > 프로시저 시작 지점 process32Next를 DLLKernel32.dll에서 찾을 수 없습니다.

    > //----------------------------------------------------------------------

    >

    > 어느 부분에서 문제가 있는지를 모르겠습니다.

    > 아시는 분 계시면 답변 부탁드립니다.

    >

    > 99.12.12

    > 문영미 올림



    Windows NT에서의 프로세스 처리는 다른 방법을 사용해야 합니다





    기본적으로 Toolhelp32 (Unit TlHelp32) 가 제공됩니다

    Toolhelp32 는 현재 실행중인 프로세스 리스트의 정보를 제공하는데

    현재 실행중인 프로세스의 파일명, 프로세스 ID, 각 쓰레드 ID 등을

    얻을 수 있으며 threadID 를 가지고 EnumThreadWindows() 함수를 사용하시면

    원도우 핸들을 구할 수 있습니다

    반대로 원도우 핸들을 가지고 GetWindowThreadProcessID() 함수를 사용하시면

    프로세스와 쓰레도 ID 를 구할 수 있습니다



    (예제) - 현재 실행된 프로세스중 선택한 프로세스 종료시키기

    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls,

    Forms, Dialogs, StdCtrls, TlHelp32;



    type

    TForm1 = class(TForm)

    ListBox1: TListBox;

    B_Search: TButton;

    B_Terminate: TButton;

    procedure B_SearchClick(Sender: TObject);

    procedure B_TerminateClick(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    {$R *.DFM}



    // kernel32.dll을 사용하여 현재 떠있는 process를 읽어온다

    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

    // 실행화일명과 process object 저장

    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); // closes an open object handle

    end;



    procedure TForm1.B_SearchClick(Sender: TObject);

    begin

    // 현재 실행중인 process를 검색

    ListBox1.Items.Clear;

    Process32List(ListBox1.Items);

    end;



    procedure TForm1.B_TerminateClick(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.







    Windows 95 에서 제공하는 Toolhelp32 (Unit TlHelp32)는 NT 에서 사용할 수

    없습니다

    소문으로는 NT5.0 에 Toolhelp32 를 넣는다고는 하는데...



    NT에서는 두가지 방법으로 프로세스 정보를 구할 수 있습니다

    첫째는 레지스트리의 HKEY_PERFORMANCE_DATA 섹션을 읽는 방법인데

    이것은 동적인 레지스트리라 regedit.exe 로는 볼 수 없고

    그것에 맞는 레지스트리 API 를 사용해서 접근할 수 있습니다

    제가 개인적으로 NT에서 프로세스 관리 프로그램을 만들때 처음에

    이 방법으로 했었는데 정보를 읽는 속도가 너무 느렸습니다

    이 방법보다는 아래 PSAPI.DLL 을 사용하는것을 추천합니다



    두번째 방법은 PSAPI.DLL 을 이용하는 방법입니다

    PSAPI.DLL 는 공식적으로 문서화 되어있지 않으며 PSAPI.DLL 이 시스템

    디렉토리에 없는 NT 버전(서비스팩)도 있습니다



    아래 사이트에 보시면 관련 콤포넌트와 PSAPI.DLL 이 있습니다

    http://www.wilsonc.demon.co.uk/delphi.htm <-- 추천

    http://www.santronics.com

    http://members.tripod.com/~aldyn/ <-- HKEY_PERFORMANCE_DATA 읽기 방식