在任务管理器中映像名称如果是中文就不能正常显示?
    我现在需要判断某个进程是否存在,可要是进程名称为中文
    我就无法比较了,请问我该如何处理。谢谢!

解决方案 »

  1.   

    在xp下可以正常显示,其他系统就不知道了,你用下面的代码(查询进程代码)看看查到中文的进程名是否正常显示:新建一个工程project1,窗口form1 ,加入一个listview (lvwPrss) 3个button(cmdRefresh,cmdDelete,cmdExit)
    代码如下
    Option ExplicitPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function ExitProcess Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Const LOCALE_STIMEFORMAT = &H1003
    Private Const LOCALE_SSHORTDATE = &H1F
    Private Const WM_SETTINGCHANGE = &H1A
    Private Const HWND_BROADCAST = &HFFFF&Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Boolean
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long'***************************************'获得进程的句柄
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
    ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
    '终止进程
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, _
    ByVal uExitCode As Long) As Long
    '创建一个系统快照
    Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" _
    (ByVal lFlags As Long, lProcessID As Long) As Long
    '获得系统快照中的第一个进程的信息
    Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" _
    (ByVal mSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    '获得系统快照中的下一个进程的信息
    Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" _
    (ByVal mSnapShot As Long, uProcess As PROCESSENTRY32) As LongPrivate 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 * 260&
    End Type
    Private Const TH32CS_SNAPPROCESS As Long = 2&
    Dim mresult
    Private Sub cmdRefresh_Click()
        doList
    End Sub
    Private Sub Form_Load()
        lvwPrss.ListItems.Clear
        lvwPrss.ColumnHeaders.Clear
        lvwPrss.ColumnHeaders.Add , , "进程ID", 1500
        lvwPrss.ColumnHeaders.Add , , "进程名", 5600
        lvwPrss.LabelEdit = lvwManual
        lvwPrss.FullRowSelect = True
        lvwPrss.HideSelection = False
        lvwPrss.HideColumnHeaders = False
        lvwPrss.View = lvwReport
    End Sub
    Private Sub Form_Activate()
        doList
    End Sub
    'listview的大小随窗体变化
    Private Sub Form_Resize()
        lvwPrss.Move 0, 0, Me.ScaleWidth - cmdRefresh.Width, Me.ScaleHeight
        cmdRefresh.Move lvwPrss.Width - lvwPrss.Left
        cmdDelete.Move lvwPrss.Width - lvwPrss.Left
        cmdExit.Move lvwPrss.Width - lvwPrss.Left
    End SubPrivate Sub doList()
        Dim uProcess As PROCESSENTRY32
        Dim mSnapShot As Long
        Dim mName As String
        Dim i As Integer
        Dim mlistitem As ListItem
         
        lvwPrss.ListItems.Clear
        DoEvents
        uProcess.dwSize = Len(uProcess)
        mSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
        If mSnapShot Then
            mresult = ProcessFirst(mSnapShot, uProcess)
            '失败则返回false
            Do While mresult
                i = InStr(1, uProcess.szexeFile, Chr(0))
                mName = LCase$(Left$(uProcess.szexeFile, i - 1))
                Set mlistitem = lvwPrss.ListItems.Add(, , Text:=uProcess.th32ProcessID)
                mlistitem.SubItems(1) = mName
                mresult = ProcessNext(mSnapShot, uProcess)
            Loop
        End If
        cmdDelete.Enabled = (lvwPrss.ListItems.Count > 0)
    End Sub'强行终止当前进程
    Private Sub cmdDelete_Click()
        If lvwPrss.ListItems.Count = 0 Then
            Exit Sub
        End If
        If MsgBox("真的终止" & lvwPrss.Name & " 进程吗?", vbYesNo + vbQuestion) <> vbYes Then
            Exit Sub
        End If
         
        Dim mProcID As Long
        mProcID = OpenProcess(1&, -1&, lvwPrss.SelectedItem)
        TerminateProcess mProcID, 0&
        DoEvents
        lvwPrss.ListItems.Remove (lvwPrss.SelectedItem.Index)
        lvwPrss.Refresh
    End Sub
    '显示错误信息
    Sub ErrMsgProc(mMsg As String)
        MsgBox mMsg & vbCrLf & Err.Number & Space(5) & Err.Description
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        Unload Form1
    End Sub
      

  2.   

    我试过了!中文不能正确显示.
    我用的是windows2000 高级服务器版
      

  3.   

    回复人: linkinwork(阿拉斯加雪橇犬) ( ) 信誉:85  2006-01-23 15:35:00  得分: 0  
     
     
       我试过了!中文不能正确显示.
    我用的是windows2000 高级服务器版
      
     
    ======================
    那么有没有试过访问wmi的win32_process????
      

  4.   

    没有? wmi的win32_process是指什么?
      

  5.   

    //程序名称是中文的,可在任务管理器中看到对应的映像名称就变成问号或别的字符了。这个程序如果是vb程序的话,通常是编译时,vb未打补丁所致
      

  6.   

    //请问这个补丁能自己手工打上吗?我说的补丁是指vb的补丁,现在出到sp6了,你下载解压后,关闭vb,直接运行里面的setupsp6.exe就可以了,如果程序已经编译好了,你又没有源程序的话,就只有用资源编辑工具修改了
      

  7.   

    SP6我一直都有装
    我的程序是在打了SP6的VB里开发编译的。
      

  8.   

    恩。谢谢!
    这个方法是很不错。
    是这样的。我们头让按照系统设计作。
    设计上让我从一个ini文件中读取要升级程序的名称
    然后判断进程是否存在。呵呵!