如何编写结束一个vb程序的vb程序?

hkdavis 2000-07-01 07:18:00
现在run.exe是一个编译了的vb程序,而且总在一直运行,假设它本身没有结束功能,
我要编写一个vb程序end_run.exe去结束它,这个vb程序如何写?要用到shell()函数,
体如何写原代码?
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject 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 TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Dim ret
Private Sub Form_load()

ret = Shell("f:\run.exe", 1)
'获取参数ret了,但 run.exe使运行,而此时原来的run.exe早就在运行

Dim x As Long
x = OpenProcess(0, False, ret)'ret参数被传递
Dim ret2 As Long
ret2 = TerminateProcess(x, 0)
ret2 = CloseHandle(x)
End Sub
上面的代码有一个问题:
run.exe又运行了一次,而run.exe已经在一直运行,所以我不想要它再运行一次,但是我又必须从原来的run.exe程序中得到参数ret,这怎么办呢?
...全文
462 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hkdavis 2000-07-03
  • 打赏
  • 举报
回复
程序end_run.exe一直在运行,每隔一分钟打开notepad.exe,5秒后关闭notepade.exe,一分钟后又打开notepad.exe,...总是循环结果运行6个小时后死机了!!!再尝试一次6小时后还是死机了!!!我怀疑虽然关闭了notepad.exe,但并没有真正结束notepad.exe?还是虽然结束了,但是占有什么东西?比如进程?...
会是什么原因呢?
hkdavis 2000-07-02
  • 打赏
  • 举报
回复
1已经知道run.exe的窗口标题为"hello”
要结束run.exe这个程序.
怎么写代码?
2要掌握这方面的知识,怎么一般vb书籍上没有这些内容,要好好掌握vb这些知识,能否提供几本有价值的参考书
如:winsock编程,dll调用,API,句柄这些知识在一般书上讲得很少,哪本书值得一读?
我是初学者,谢谢!
wgtech 2000-07-02
  • 打赏
  • 举报
回复
也可以这么做:
用API:GetWindow和API:GetWindowText
将所有进程的窗口标题记录在案,然后
找到“HELLO”为标题的窗口句柄,用
API:SendMessage发送WM_CLOSEQUERY消息
给该窗口即可搞掂。
wgtech 2000-07-02
  • 打赏
  • 举报
回复
你可参考以下页:
http://210.77.145.209/csdn/expert/Topic/13411.shtm
musicbug 2000-07-01
  • 打赏
  • 举报
回复
由于系统中可以运行多个run.exe,所以单凭run.exe是得不到唯一的进程ID的。只能枚举系统所有的进程,看看那个进程的可执行文件名是run.exe然后终止它。枚举系统进程用到的函数是
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID);
BOOL WINAPI Process32First(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
BOOL WINAPI Process32Next(HANDLE hSnapshot,LPPROCESSENTRY32 lppe);

typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
DWORD th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
char szExeFile[MAX_PATH];
} PROCESSENTRY32;
typedef PROCESSENTRY32 * PPROCESSENTRY32;
typedef PROCESSENTRY32 * LPPROCESSENTRY32;

结构PROCESSENTRY32的成员szExeFile就是进程的可执行文件名(包括路径).具体请看MSDN

如果可以能知道run.exe的窗口标题,还有另一种方法:
可以用FindWindow得到窗口句柄,有了窗口句柄,就可以用GetWindowThreadProcessID
DWORD GetWindowThreadProcessId(
HWND hWnd, // handle to window
LPDWORD lpdwProcessId // address of variable for process identifier
);
得到进程ID,然后终止它了。

7,762

社区成员

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

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