大佬们问一个问题
vb吧
全部回复
仅看楼主
level 1
SPLUSVABLEwow 楼主
VB如何获取在运行程序的电脑上某一个文件的路径,并把VB里的资源文件解压进这个路径替换掉?
例如:在某台电脑上有一个叫 vb123.exe的文件,怎么让vb自动找到这个文件的路径,并把资源文件里的文件放进这个路径里,然后运行这个资源文件?
2023年02月07日 06点02分 1
level 1
得获得这个程序的句柄才能做到,这个程序有窗口吗?
2023年02月07日 07点02分 2
没有 能直接搜吗?
2023年02月07日 07点02分
那比如我要获取这个QQ.exe 的文件路径 然后让程序解压的路径到这个QQ.exe的路径下 应该怎么写这个代码?
2023年02月07日 07点02分
@SPLUSVABLEwow 名称、窗体、句柄是三个东西,其中名称是可重复的,最不靠谱,硬搜也不是不可以,我没试过。我只尝试过用窗体找文件所在位置,用来删弹窗。
2023年02月07日 07点02分
@SPLUSVABLEwow 如果正在运行直接用tasklist命令获取路径,没运行就搜索,但是搜索太慢了,文件夹又多又深的话半个小时一个小时都不一定能搜到。
2023年02月07日 18点02分
level 1
SPLUSVABLEwow 楼主
大概意思就是:在这个电脑上有一个vb123.exe在运行,我想获取他这个程序的路径,然后释放资源编号:101的文件到这个路径下,然后运行这个101里的文件
2023年02月07日 07点02分 3
level 1
我懂你的意思,但是如果没有这个进程的句柄,你什么都做不到,你得想一个办法获得这个进程的句柄。如果这个程序有打开的窗体,就能用窗体查出窗体句柄,再得到进程句柄
2023年02月07日 07点02分 4
可以做到的 大佬 那能不能两个都实现呢?就是在句柄获取不到的情况下 硬搜
2023年02月07日 08点02分
@SPLUSVABLEwow 有办法也是先找句柄再获得路径,只是获取句柄的方式不同
2023年02月07日 08点02分
level 1
不获取句柄的情况下不可能搜得到,所有的方法都是建立在句柄上的。不过有用名字搜句柄的办法。
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "psapi.dll" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Private Function GetFileName(hwnd As Long) As String
Dim lpid As Long
Dim sBuffer As String
Dim hHandle As Long
Dim hInst As Long
Dim lRet As Long
sBuffer = Space(255) '必要
GetWindowThreadProcessId hwnd, lpid '获取进程ID
hHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, lpid) '获取进程句柄
lRet = GetModuleFileNameEx(hHandle, 0, sBuffer, 255) '获取进程所在文件路径
GetFileName = sBuffer
End Function
Private Sub Command1_Click()
Dim WinName As String
WinName = InputBox("请输入需要查找的任务名称:", "路径查找器")
If WinName = "" Then Exit Sub
Dim hwndWow As Long
hwndWow = FindWindow(vbNullString, WinName)
If hwndWow <= 0 Then
MsgBox "您搜索的程序 """ & WinName & """ 不存在,请重新查找。", vbOKOnly, "路径查找器"
Exit Sub
End If
Cls
Print "选中窗体名称:" & WinName
Print "选中窗体句柄:" & hwndWow
Print "选中窗体路径:" & GetFileName(hwndWow) '获取句柄窗体文件的路径
End Sub
2023年02月07日 08点02分 5
大佬我另外想了一个PID的办法 那个可以吗?不同电脑的PID是不是会有变化?
2023年02月07日 08点02分
@SPLUSVABLEwow ID,句柄每次打开都不一样,且同一时间独一无二,所以所有的办法都是建立在找他们两个上面,我下面一楼贴了代码
2023年02月07日 08点02分
我试跑了一下您给的代码,可以获取到,非常感谢,我看看能不能在您给的代码基础上改动到我需要的功能
2023年02月07日 08点02分
@嘟嘟逸凡 大佬您看看楼下的代码
2023年02月07日 08点02分
level 1
SPLUSVABLEwow 楼主
Dim TempDataPath As String
Private Sub Form_Load()
Dim TempData() As Byte
TempDataPath = "c:\123.exe" '释放文件路径位置
TempData = LoadResData(101, "CUSTOM") '资源文件编号 101
Open TempDataPath For Binary Access Write As #1
Put #1, , TempData
Close #1
'释放后运行Battle.net
Shell "c:\123.exe"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Kill TempDataPath
End Sub
@嘟嘟逸凡
大佬您看看,我是想在代码里直接写获取 vb123.exe的路径,然后让我现在这个代码释放文件到 这个获取得到的vb123.exe的目录下,然后 杀掉vb123.exe的进程,然后运行我这个123.exe 他是一个自解压做成的压缩包,他在里面有一个另外改的vb123.exe文件,替换掉,然后Shell 运行这个替换好的vb123.exe 主要是玩暴雪游戏的 有几个朋友在网吧 他们每次替换都很麻烦,他们又是电脑小白,我总得给他们远程替换文件才能改成国外的版本一起玩,就很麻烦,想自己能不能问问贴吧的大佬们,看看做一个自动替换的,我本来想那个自解压的也可以了,结果他们连路径都找不到[喷],我自己水平也不太够,写不出来这代码
2023年02月07日 08点02分 6
2023年02月07日 08点02分
你现在是哪一步有问题?
2023年02月07日 10点02分
@嘟嘟逸凡 我现在遇到了 我该怎么通过最快的办法获取到这个文件路径 然后完成我上面描述的操作 我VB太小白了 只能勉强看懂一些
2023年02月07日 11点02分
@SPLUSVABLEwow 他的文件路径是在游戏目录下?那为什么不能右键直接打开文件所在文件夹?让别人直接复制粘贴游戏目录,你用Dir再判断一下这个目录是否正确,会比你直接找容易的多
2023年02月07日 11点02分
1