• VC做任务管理器涉及到的函数


    以下是做进程管理器所用到的API函数。
    若是链接错误,则加上
    #include <pdh.h>
    #pragma comment ( lib , "Pdh.lib" )


    第一组函数:枚举进程信息

    HANDLE WINAPI CreateToolhelp32Snapshot(
      DWORD dwFlags,       
      DWORD th32ProcessID  
    );


    BOOL WINAPI Process32First(
      HANDLE hSnapshot,      
      LPPROCESSENTRY32 lppe  
    );


    BOOL WINAPI Process32Next(
      HANDLE hSnapshot,      
      LPPROCESSENTRY32 lppe  
    );
    BOOL CloseHandle(
      HANDLE hObject   // handle to object
    );

    =================================================================================
    第二组函数: //返回当前系统信息
    VOID GetSystemInfo(SYSTEM_INFO  si);
     
    typedef struct _SYSTEM_INFO {
        union {
            DWORD dwOemId;          // Obsolete field...do not use
            struct {
                WORD wProcessorArchitecture;    //处理器的体系结构
                WORD wReserved;                 //保留
            };
        };
        DWORD  dwPageSize;                      //分页大小
        LPVOID lpMinimumApplicationAddress;     //最小寻址空间
        LPVOID lpMaximumApplicationAddress;     //最大寻址空间
        DWORD_PTR dwActiveProcessorMask;        //处理器掩码,0..31表示不同的处理器
        DWORD dwNumberOfProcessors;             //处理器数目
        DWORD dwProcessorType;                  //处理器类型
        DWORD dwAllocationGranularity;          //虚拟内存空间的粒度
        WORD wProcessorLevel;              //处理器等级
        WORD wProcessorRevision;                //处理器版本
    } SYSTEM_INFO, *LPSYSTEM_INFO;


    第三组 ,用于获取进程相关的时间
             成功调用返回true,失败则返回false
    BOOL GetProcessTimes(
      HANDLE hProcess,           // handle to process         进程句柄
      LPFILETIME lpCreationTime, // process creation time     进程的创建时间
      LPFILETIME lpExitTime,     // process exit time         进程的退出时间
      LPFILETIME lpKernelTime,   // process kernel-mode time  进程在内核模式下的所有时间
      LPFILETIME lpUserTime      // process user-mode time    进程在用户模式下的所有时间
    );

    关于FILETIME结构的说明
    typedef struct _FILETIME
    {
    DWORD  dwLowDateTime;   //时间的低32位
            DWORD  dwHightDateTime; //时间的高32位
    }FILETIME,*PFILETIME;

    调用GetProcessTimes(hPro,&createTime,&exiTime,&kTime,&utime);
    之后要把文件时间转化为系统时间,使用函数:
    _SYSTEMTIME temp;
    FileTimeToSystemTime(&createTime,&temp);
    于是,我们就要了解结构体:  _SYSTEMTIME  
    typedef struct _SYSTEMTIME
     {  
    WORD wYear; 
    WORD wMonth;  
    WORD wDayOfWeek;  
    WORD wDay;  
    WORD wHour; 
    WORD wMinute;  
    WORD wSecond;  
    WORD wMilliseconds;
    } SYSTEMTIME, *PSYSTEMTIME;


    (*)枚举进程的ID号
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    return 0;
    然后数组aProcess中就放入了当前系统中的进程的ID号,cbNeeded放的是进程数目。
    for ( i = 0; i < cbNeeded/sizeof(DWORD) ; i++ )
    PrintMemoryInfo( aProcesses[i] );



    (*)由指定的进程号ID,获得该进程的句柄方法:
    HANDLE  hProcess;
    hProcess=OpenProcess(PROCESS_QUERY_INFORMATIION | PROCESS_VM_READ,
    FALSE , processID );
    if(hProcess==NULL)   return;
    ====================================================================================
    第四组  返回指定进程的内存使用信息

    BOOL GetProcessMemoryInfo(
      HANDLE Process,                          // handle to process
      PPROCESS_MEMORY_COUNTERS ppsmemCounters, // buffer
      DWORD cb                                 // size of buffer
    );

    BOOL QueryWorkingSet(
      HANDLE hProcess,  // handle to process
      PVOID pv,         // information buffer
      DWORD cb          // size of buffer
    );

    关于进程的内存使用的结构体
    typedef struct _PROCESS_MEMORY_COUNTERS 
    {  
    DWORD cb;                          //结构体大小
    DWORD PageFaultCount;              //缺页中断次数
    SIZE_T PeakWorkingSetSize;         //内存使用高峰值
    SIZE_T WorkingSetSize;             //当前内存使用值
    SIZE_T QuotaPeakPagedPoolUsage;    //使用页面缓存池高峰
    SIZE_T QuotaPagedPoolUsage;        //使用页面缓存池
    SIZE_T QuotaPeakNonPagedPoolUsage; //使用非分页缓存池高峰
    SIZE_T QuotaNonPagedPoolUsage;     //使用非分页缓存池
    SIZE_T PagefileUsage;              //使用分页文件
    SIZE_T PeakPagefileUsage;          //使用分页文件高峰
    } PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;

    (2)获取系统内存信息
    GlobalMemoryStatus,Win32 API函数。


      此函数用来获得当前可用的物理和虚拟内存信息,函数定义为:


      VOID GlobalMemoryStatus


      (


      LPMEMORYSTATUS lpBuffer


      );


      此函数无返回值,参数是一个指向名为MEMORYSTATUS的结构的指针。函数的返回信息会被存储在MEMORYSTATUS结构中。


      此函数用来替代用来支持16位应用程序的GetFreeSpace函数。


      应用程序应该在申请内存前调用此函数以防止影响到其他程序运行。


      这个函数的返回值是动态的,并且可能返回相同的值。


      关于MEMORYSTATUS结构:


      机构定义:


      typedef struct _MEMORYSTATUS { // mst


      DWORD dwLength; // sizeof(MEMORYSTATUS)


      DWORD dwMemoryLoad; // percent of memory in use


      DWORD dwTotalPhys; // bytes of physical memory


      DWORD dwAvailPhys; // free physical memory bytes


      DWORD dwTotalPageFile; // bytes of paging file


      DWORD dwAvailPageFile; // free bytes of paging file


      DWORD dwTotalVirtual; // user bytes of address space


      DWORD dwAvailVirtual; // free user bytes


      } MEMORYSTATUS, *LPMEMORYSTATUS;


      结构成员的含义:


      dwLength


      MEMORYSTATUS结构的大小,在调GlobalMemoryStatus函数前用sizeof()函数求得,用来供函数检测结构的版本。


      dwMemoryLoad


      返回一个介于0~100之间的值,用来指示当前系统内存的使用率。


      dwTotalPhys


      返回总的物理内存大小,以字节(byte)为单位。


      dwAvailPhys


      返回可用的物理内存大小,以字节(byte)为单位。


      dwTotalPageFile


      显示可以存在页面文件中的字节数。注意这个数值并不表示在页面文件在磁盘上的真实物理大小。


      dwAvailPageFile


      返回可用的页面文件大小,以字节(byte)为单位。


      dwTotalVirtual


      返回调用进程的用户模式部分的全部可用虚拟地址空间,以字节(byte)为单位。


      dwAvailVirtual


      返回调用进程的用户模式部分的实际自由可用的虚拟地址空间,以字节(byte)为单位。


      MEMORYSTATUS结构,


      结构的定义如下:


      MEMORYSTATUS STRUCT


      dwLength DWORD ? ;本结构的长度


      dwMemoryLoad DWORD ? ;已用内存的百分比


      dwTotalPhys DWORD ? ;物理内存总量


      dwAvailPhys DWORD ? ;可用物理内存


      dwTotalPageFile DWORD ? ;交换文件总的大小


      dwAvailPageFile DWORD ? ;交换文件中空闲部分大小


      dwTotalVirtual DWORD ? ;用户可用的地址空间


      dwAvailVirtual DWORD ? ;当前空闲的地址空间


      MEMORYSTATUS ENDS
    ====================================================================================
    第五组
    获取GUI对象

    DWORD GetGuiResources (
      HANDLE hProcess,  // handle to process
      DWORD uiFlags     // GUI object type
    );

    ===================================================================================
    第六组
    获取指定的进程的所有的I/O操作

    BOOL GetProcessIoCounters(
      HANDLE hProcess,           // handle to process
      PIO_COUNTERS lpIoCounters  // I/O accouting information
    );
    涉及到的结构体
    typedef struct _IO_COUNTERS 
    {  
    ULONGLONG ReadOperationCount;   //读操作的数目
    ULONGLONG WriteOperationCount;  //写操作的数目 
    ULONGLONG OtherOperationCount;  //其他操作数目,除了读、写操作
    ULONGLONG ReadTransferCount;    //读取的字节数
    ULONGLONG WriteTransferCount;   //写入的字节数
    ULONGLONG OtherTransferCount;   //其他的操作的字节数
    } IO_COUNTERS, *PIO_COUNTERS;


    ===================================================================================
    第七组  获得文件的版本信息
    以下三个函数的调用顺序必须满足
    GetFileVersionInfoSize-->GetFileVersionInfo-->VerQueryValue


    获得文件的版本信息的大小,如果这个文件的版本信息可以得到,则返回信息的字节大小,
    否则返回0。只有调用完这个函数以后,才可以调用函数 GetFileVersionInfo,因为函数
    GetFileVersionInfoSize的返回值指明了函数GetFileVersionInfoSize的缓冲区大小。

    DWORD GetFileVersionInfoSize(
      LPTSTR lptstrFilename,  // file name
      LPDWORD lpdwHandle      // set to zero
    );

    BOOL GetFileVersionInfo(
      LPTSTR lptstrFilename,  // file name
      DWORD dwHandle,         // ignored
      DWORD dwLen,            // size of buffer
      LPVOID lpData           // version information buffer
    );


    BOOL VerQueryValue(
      const LPVOID pBlock, // buffer for version resource
      LPTSTR lpSubBlock,   // value to retrieve
      LPVOID *lplpBuffer,  // buffer for version value pointer
      PUINT puLen          // version length
    );

    ==========================================================================
    获取文件版本信息
    struct LANGANDCODEPAGE {
    WORD wLanguage;
    WORD wCodePage;
    }*lpTranslate;

    BOOL MyGetFileVersion(char *pFileName)
    {
    DWORD dwSize = GetFileVersionInfoSize(pFileName,NULL);
    if(dwSize<=0)
    return FALSE;
    LPVOID lpData = (LPVOID)malloc(dwSize);
    if(!GetFileVersionInfo(pFileName,0,dwSize,lpData))
    return FALSE;

    UINT   cbTranslate=0;
    LANGANDCODEPAGE *lpTranslate = NULL;

    VerQueryValue(lpData,TEXT("\VarFileInfo\Translation"),(LPVOID*)&lpTranslate,&cbTranslate);
    CHAR subblock[256];
    LPVOID lpBuffer=NULL;
    UINT   uLen=0;
    for(UINT i=0;  i<(cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++)
    {
    sprintf( subblock,  TEXT("\StringFileInfo\xx\LegalCopyright"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage); 
    if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
    {
    printf("版权:%s ",lpBuffer);
    }

    sprintf( subblock,  TEXT("\StringFileInfo\xx\CompanyName"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage); 
    if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
    {
    printf("公司名:%s ",lpBuffer);
    }

    sprintf( subblock,  TEXT("\StringFileInfo\xx\FileVersion"),lpTranslate[i].wLanguage,lpTranslate[i].wCodePage);
    if(VerQueryValue(lpData, subblock, &lpBuffer, &uLen) )
    {
    printf("文件版本:%s ",lpBuffer);
    }
    }
    return TRUE;
    }



    //会话ID,权限获取,用户名,文件路径,命令参数,页面错误增量
    会话ID我知道怎么做了
    OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken);
    GetTokenInformation(hToken, TokenSessionId, &dwId, sizeof(DWORD), &dwLen);
    printf("%d ", dwId);

    MSDN中函数原型申明:
    BOOL OpenProcessToken(  
       HANDLE ProcessHandle,  //要修改访问权限的进程句柄
       DWORD DesiredAccess,   //指定你要进行的操作类型
       PHANDLE TokenHandle    //返回的访问令牌指针
    );

    HANDLE hToken;     //令牌句柄
    OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, &hToken);得到进程的令牌句柄
  • 相关阅读:
    098实战 Job的调度
    maven在windows下的安装
    Map的知识点梳理(不包含collections工具类)
    001 LRU-缓存淘汰算法
    Android渲染机制和丢帧分析
    Android性能优化典范
    正确使用Android性能分析工具——TraceView
    android View 绘制完成监听
    那些年我们用过的显示性能指标
    view, surfaceView, invalidate, postInvalidate, 刷新屏幕
  • 原文地址:https://www.cnblogs.com/shenlanzifa/p/5288768.html
Copyright © 2020-2023  润新知