none
VC++ 如何使用程序名 取得 程序ID RRS feed

  • 問題

  • Hi   這可能是個困難的問題

    我已前有做過VB的 Get ProcessID By Name

    但 翻譯到C++ 來好像有些錯誤

    #include "stdafx.h"
    #include "windows.h"
    #include "Tlhelp32.h"
    #include "atlstr.h"
    #include <iostream>
    using namespace std;
    
    DWORD GetProcessIDByName(char* szProcessName)
    {
    	PROCESSENTRY32 pe;
    	HANDLE hSnap;
    	DWORD dwProcessId = NULL;
    	BOOL Ret;
    	pe.dwSize = sizeof(pe);
    	hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	Ret = Process32First(hSnap, &pe);
    	while(Ret)
    	{
    	if (szProcessName == pe.szExeFile)
    	{	
    		dwProcessId = pe.th32ProcessID;
    		break;
    	}
    	 Ret = Process32Next(hSnap, &pe);
    	}
    	return dwProcessId;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	cout << "Enter the processname get the PID." << endl;
    	char aaa[260];
    	cin.getline(aaa, 260);
    	DWORD PID;
    	PID = GetProcessIDByName(aaa);
    	cout << "PID = " << PID << endl;
    	system("PAUSE");
    	return 0;
    }
    

    我輸入  "iexplore" 都返回 0

    我照VB程式碼  一句一句 翻過來

    還是不知道哪錯了

    請大大指點

    如果需要 VB 程式碼 請儘管跟我要

    謝謝!!

    2011年5月7日 上午 09:29

解答

所有回覆

  • How to get handle to any running process by its name

    http://www.codeproject.com/KB/threads/getprocessid.aspx

    • 已標示為解答 Just Lin 2011年5月9日 上午 11:30
    2011年5月7日 下午 01:09
  • 您可以利用EnumProcesses函數

    • 已標示為解答 Just Lin 2011年5月9日 上午 11:32
    2011年5月8日 下午 12:35
  • 謝謝上面兩位大大

    但請問有沒有 原生C++ 的

    要如合引進 C++.net 呢?

    這是VB的程式碼

    Option Explicit
    Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
    Public Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
    Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Const TH32CS_SNAPPROCESS = &H2
    Public Const MAX_PATH As Integer = 260
    Public Type PROCESSENTRY32
      dwSize As Long
      cntUsage As Long
      th32ProcessID As Long
      th32DefaultHeapID As Long
      th32ModuleID As Long
      cntThreads As Long
      th32ParentProcessID As Long
      pcPriClassBase As Long
      dwFlags As Long
      szExeFile As String * MAX_PATH
    End Type
    Public Function GetProcessIdByName(ByVal szProcessName As String) As Long
    Dim pe As PROCESSENTRY32
    Dim hSnap As Long
    Dim dwProcessId As Long
    Dim Ret As Long
    pe.dwSize = Len(pe)
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    Ret = Process32First(hSnap, pe)
    Do While Ret <> 0
      If InStr(UCase$(pe.szExeFile), UCase$(szProcessName)) <> 0 Then
       dwProcessId = pe.th32ProcessID
       Exit Do
      End If
      Ret = Process32N
    End Function

    因為我怕程式碼太亂 所以我之前才沒貼的,抱歉

    2011年5月9日 上午 11:37
  • VB.net 型態問題

    http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/bec0bd90-ce74-4168-9404-414232fb5ab7/#d370be9a-52bc-4178-a5e4-0a2eff19539b

    Process.GetProcessesByName 方法

    http://msdn.microsoft.com/zh-tw/library/system.diagnostics.process.getprocessesbyname(VS.80).aspx

    搞不懂您的邏輯,既然用CLI,.Net有內建類別,用GetProcessesByName方法,得到Process,ID就是所要的,何必繞個圈,還要PInvoke API...

    • 已標示為解答 Just Lin 2011年5月9日 下午 02:12
    2011年5月9日 下午 01:44