找回密码
 加入
搜索
查看: 2938|回复: 10

[AU3基础] 获取进程相对应的版本号-有部分进程获取不到【已解决】

  [复制链接]
发表于 2011-9-19 19:02:26 | 显示全部楼层 |阅读模式
本帖最后由 huaisha1224 于 2011-9-26 10:27 编辑

我想查询到进程所对应的版本号(比如QQ这个进程 我查到的版本号就是)
我现在的方式是这样的
1、先通过ProcessExists获取进程ID、
2、然后再通过进程ID获取到进程的映像路径
3、最后使用FileGetVersion来获取程序的版本

但是在我完成代码时候发现有一些进程获取不到映像路径当然也获取不到进程的版本号
只有一部分进程的映像路径可以获取得到

我现在的代码如下:
;通过进程获得程序路径、然后获取程序的版本号
Local $procName="qq.exe"
Local $ProcID=ProcessExists($procName) 
Local $nVer

If ($ProcID) Then
    MsgBox(0, "进程路径", "进程路径:" & _ProcessGetLocation($ProcID))

EndIf


$nVer = FileGetVersion(_ProcessGetLocation($ProcID),"FileVersion")
MsgBox(0,"范例","程序版本:" &$nVer)


Func _ProcessGetLocation($iPID)
    Local $aProc = DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $iPID)
    If $aProc[0] = 0 Then Return SetError(1, 0, '')
    Local $vStruct = DllStructCreate('int[1024]')
    DllCall('psapi.dll', 'int', 'EnumProcessModules', 'hwnd', $aProc[0], 'ptr', DllStructGetPtr($vStruct), 'int', DllStructGetSize($vStruct), 'int_ptr', 0)
    Local $aReturn = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', 'hwnd', $aProc[0], 'int', DllStructGetData($vStruct, 1), 'str', '', 'int', 2048)
    If StringLen($aReturn[3]) = 0 Then Return SetError(2, 0, '')
    Return $aReturn[3]
EndFunc
我把论坛里面的帖子都翻转了都没有找到相关的内容
请高手指点指点
或者有其他办法能够通过进程来获取到相应的版本号的话也是可以的
求指点
 楼主| 发表于 2011-9-19 19:05:30 | 显示全部楼层
我在论坛有前辈用_WinAPI_GetModuleFileNameEx来实现的
但是我发现最新版本的AU3里面没有这个_WinAPI_GetModuleFileNameEx
发表于 2011-9-19 21:53:45 | 显示全部楼层
你要处理一下GetModuleFileNameEx返回的路径,比如winlogon.exe进程返回的路径是\??\C:\WINDOWS\SYSTEM32\winlogon.exe,前面会有“\??\”。获取csrss.exe的路径,还要开启SeDebugPrivilege特权。
 楼主| 发表于 2011-9-20 10:02:03 | 显示全部楼层
这么复杂的呀
发表于 2011-9-20 10:05:08 | 显示全部楼层
你要处理一下GetModuleFileNameEx返回的路径,比如winlogon.exe进程返回的路径是\??\C:\WINDOWS\SYSTEM32\w ...
pusofalse 发表于 2011-9-19 21:53



    这就很麻烦了,P版有成型的代码吗
 楼主| 发表于 2011-9-20 14:22:41 | 显示全部楼层
有没有其他比较简便的可行方案
发表于 2011-9-20 16:30:54 | 显示全部楼层
3恨的
#Include <WinAPIEx.au3>
 #include <array.au3>
 
$list = ProcessList()
ReDim $list[UBound($list)][3]
$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, 1)
 
for $i=1 to $list[0][0] 
                $list[$i][2]=_WinAPI_GetProcessFileName($list[$i][1])
Next
 
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, 2)
_WinAPI_CloseHandle($hToken)
 
_arraydisplay($list)
 楼主| 发表于 2011-9-21 13:44:57 | 显示全部楼层
回复 7# gzh888666
这个方式的话可以获取到程序的路径的、可是怎么样吧获取的路径赋值给另外一个变量
比如:
$nRoute
$nVer
通过这个方式获取到了程序的映像路径并赋值吧这个路径赋值给$nRoute
然后用FileGetVersion去获取这个路径下面的程序版本号赋值给$nVer
发表于 2011-9-21 13:52:00 | 显示全部楼层
回复  gzh888666
这个方式的话可以获取到程序的路径的、可是怎么样吧获取的路径赋值给另外一个变量
比如 ...
huaisha1224 发表于 2011-9-21 13:44



    其实这个帖子正像P版所说的那样,winlogon.exe, csrss.exe路径的问题并没有加以判断。还需要你自己完善,
路径赋值给另外一个变量用得到的数组进行传递就可以了!
_arraydisplay($list)
里面不是已经显示好了多维数组的值了吗?
发表于 2011-9-21 13:59:18 | 显示全部楼层
本帖最后由 gzh888666 于 2011-9-21 14:05 编辑

我以前有个未完成的工具,正好符合你的要求,如果想正确显示winlogon.exe路径可以使用:
$objWMIService = ObjGet("winmgmts:\\.\root\CIMV2:win32_process")
$colItems = $objWMIService.instances_
For $objItem In $colItems 
$Name = $objItem.Name 
$Pid = $objItem.ProcessId    
$Path = $objItem.executablepath
        If $Name="System Idle Process" Then ContinueLoop
        If $Name="System" Then ContinueLoop
        _GUICtrlListView_AddItem($nListView, $Name, 0);添加项目到列表的末尾  
    _GUICtrlListView_AddSubItem($nListView,$n, $Pid , 1);写入控件子项
        _GUICtrlListView_AddSubItem($nListView, $n,$Path, 2);写入控件子项
        _GUICtrlListView_AddSubItem($nListView,$n,$Status[0],3);写入控件子项
        $n += 1
Next
csrss求教一下P版吧!我也不会开启SeDebugPrivilege特权!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-9-21 14:24:59 | 显示全部楼层
本帖最后由 netegg 于 2011-9-21 14:27 编辑

_winapi_getprocesscommandline试试看
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-1 15:23 , Processed in 0.087898 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表