已知窗口句柄,能获得该程序的运行所在的目录吗?

ttyp 2002-07-19 09:54:07
如题
...全文
40 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttyp 2002-07-20
  • 打赏
  • 举报
回复
也贴出来看看:)
Chice_wxg 2002-07-20
  • 打赏
  • 举报
回复

如果是9X,那么以上代码可以得到完全的EXE名,就可以知道路径了

如果是2K,那就麻烦了。

1、你可以用钩子注入一个DLL,然后用DLL得到路径。
(VB做不到)

2、或者你试试 GetModuleFileName(GetModuleHandle("myexe.exe"))
(估计成功可能性不大)
ttyp 2002-07-20
  • 打赏
  • 举报
回复
非常感谢楼上两位,但好像只能列举进程的程序名,无法知道程序的工作目录:(
junwhj 2002-07-20
  • 打赏
  • 举报
回复
根据进程取得文件名的方法(需要一个ListView控件,三列):

Option Explicit

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSapshot As Long, lppe As PROCESSENTRY32) As Long

Private Type PROCESSENTRY32
dwSize As Long
cntUseage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
swFlags As Long
szExeFile As String * 1024
End Type

Private Const TH32CS_SNAPPROCESS = &H2



Private Sub Form_Load()
Call ShowProcessInfo
End Sub



Private Sub ShowProcessInfo()
Dim pe As PROCESSENTRY32
Dim r As Long, i As Long
Dim ListItemX As ListItem

ListView1.ListItems.Clear
r = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If r <> 0 Then
pe.dwSize = 1060
Process32First r, pe
Set ListItemX = ListView1.ListItems.Add(, , GetFileName(pe.szExeFile))
ListItemX.SubItems(1) = Hex(pe.th32ProcessID)
ListItemX.SubItems(2) = pe.szExeFile
Do
i = Process32Next(r, pe)
If i > 0 Then
Set ListItemX = ListView1.ListItems.Add(, , GetFileName(pe.szExeFile))
ListItemX.SubItems(1) = Hex(pe.th32ProcessID)
ListItemX.SubItems(2) = pe.szExeFile
Else
Exit Do
End If
Loop
End If
End Sub



Private Function GetFileName(strFullPath As String) As String
Dim i As Integer
Dim strFileName As String

For i = Len(strFullPath) To 1 Step -1
If Mid(strFullPath, i, 1) = "\" Then
strFileName = Right(strFullPath, Len(strFullPath) - i)
strFileName = UCase(Left(strFileName, 1)) & LCase(Right(strFileName, Len(strFileName) - 1))
GetFileName = strFileName
Exit Function
End If
Next i
End Function



Private Sub Command1_Click()
Call ShowProcessInfo
End Sub



Private Sub Command2_Click()
Unload Me
End Sub
Chice_wxg 2002-07-20
  • 打赏
  • 举报
回复
BOOL GetProcessName(DWORD dwProcessId,char *s)
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == (HANDLE)-1) return (FALSE);
pe32.dwSize = sizeof(PROCESSENTRY32);

if (Process32First(hProcessSnap, &pe32))
{
BOOL bGotModule = FALSE;
MODULEENTRY32 me32 = {0};
do
{
if(pe32.th32ProcessID == dwProcessId)
{
strcpy(s,pe32.szExeFile);
break;
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE;

CloseHandle (hProcessSnap);
return (bRet);
}
Chice_wxg 2002-07-19
  • 打赏
  • 举报
回复
我只用C写够ToolHelp系列API的调用

没有VB代码 :(

Sorry
ttyp 2002-07-19
  • 打赏
  • 举报
回复
怎么知道?详细些,用什么API?
Chice_wxg 2002-07-19
  • 打赏
  • 举报
回复


GetWIndowThreadProcessId

然后

用ToolHelp系列列举所有进程,找到同名进程,然后就知道了。

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧