C++ Builder Tokyo > ProcessLogger > 지정된 .exe 파일의 프로세스 ID를 로깅하는 v0.1(XE4에서 마이그레이션 가능)

운영 환경
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
RAD Studio 10.2 Tokyo Update 3

XE4에서 도쿄로 마이그레이션


  • C++ Builder XE4 > ProcessLogger > 지정된 .exe 파일의 프로세스 ID 로깅 v0.1

  • XE4의 구현은 도쿄에서 빌드할 수 없는 것 같다.

    아래의 변경을 한다.
  • 변경 전: #include <Tlhelp32.hpp>
  • 변경 후: #include <Tlhelp32.h>
  • 이유 : THelp에서 C:\\Program Files(x86)\\Embarcadero\Studio\19.0 다음을 검색 할 때 tlhelp32.h
  • 변경 전: TProcessEntry32
  • 변경 후: PROCESSENTRY32
  • 참고: htps : // / cs. mic로소 ft. 코 m / 엔 - s / 우 엔드 ws /에서 sk와 p / ap / tl에 lp32 / n s tl에 lp32 - gp 로세센 try32


  • 구현 v0.1



    Unit1.h
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    #include <Vcl.ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE で管理されるコンポーネント
        TMemo *Memo1;
        TEdit *E_exeName;
        TButton *Button1;
        TCheckBox *CHK_log;
        TTimer *TMR_logging;
        void __fastcall FormDestroy(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall TMR_loggingTimer(TObject *Sender);
    private:    // ユーザー宣言
        int __fastcall ListUpProcess_NameOf(String exename);
        void __fastcall checkProcessID(void);
        TStringList *m_logSL; // ロギング用
    public:     // ユーザー宣言
        __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    
    

    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    //(2018.11.19) XE4からTokyoへの対応
    //#include <Tlhelp32.hpp>
    #include <Tlhelp32.h>
    //
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    
    static const String kFilename_log = L"ProcLogger.csv"; // ログ用
    
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        Memo1->Lines->Clear();
    
        //
        m_logSL = new TStringList();
    
        // ログタイマー設定
        TMR_logging->Enabled = false;
        TMR_logging->Interval = 10000; // msec
        TMR_logging->Enabled = true;
    }
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
        delete m_logSL;
    }
    //---------------------------------------------------------------------------
    
    int __fastcall TForm1::ListUpProcess_NameOf(String exename)
    {
        HANDLE ListHandle;  // タスクマネージャ > プロセスリスト 用ハンドル
    
        //(2018.11.19) XE4からTokyoへの対応
        //TProcessEntry32 Pentry; // 個々のプロセス閲覧用
        PROCESSENTRY32 Pentry; // 個々のプロセス閲覧用
    
        ListHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
        if (ListHandle == INVALID_HANDLE_VALUE) {
            return 0;
        }
    
        //(2018.11.19) XE4からTokyoへの対応
        //Pentry.dwSize = sizeof(TProcessEntry32);
        Pentry.dwSize = sizeof(PROCESSENTRY32);
        //
        Process32First(ListHandle, &Pentry);
        while(1) {
            String pnam = Pentry.szExeFile;
            int procId = Pentry.th32ProcessID;
            if (pnam.Pos(exename) > 0) {
                return procId;
            }
    
            if (Process32Next(ListHandle, &Pentry) == false) {
                break;
            }
        }
        return 0;
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        checkProcessID();
    }
    
    void __fastcall TForm1::checkProcessID(void)
    {
        int procId = ListUpProcess_NameOf(E_exeName->Text);
    
        String msg;
        msg = Now().FormatString(L"yyyy/mm/dd,hh:nn:ss");
        msg += L",procID," + IntToStr(procId);
        Memo1->Lines->Add(msg);
    
        m_logSL->Add(msg);
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::TMR_loggingTimer(TObject *Sender)
    {
        if (CHK_log->Checked) {
            checkProcessID();
            m_logSL->SaveToFile(kFilename_log);
        }
    }
    //---------------------------------------------------------------------------
    

    동작 예



    좋은 웹페이지 즐겨찾기