vc中winexec使用?

vc中winexec使用?,第1张

函数只提供对16位机子的兼容。应用程序应该使用CreateProcess函数。

Declare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long

说明

运行指定的程序

返回值

Long,大于31表示成功,请参考FindExecutable函数

 参数

参数 类型及说明

lpCmdLine String,包含要执行的命令行

nCmdShow Long,定义了以怎样的形式启动程序的常数值。参考ShowWindow函数的nCmdShow参数

注解

请参考对CreateProcess函数的说明,了解在目录中查找指定文件的顺序

VC中如何使用

WINSHELLAPI void WINAPI WinExecErrorA(HWND hwnd, int error, LPCSTR lpstrFileName, LPCSTR lpstrTitle)

WINSHELLAPI void WINAPI WinExecErrorW(HWND hwnd, int error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle)

参数说明:

hwnd,窗口句柄,一般为NULL。

error,出错信息。

lpstrFileName 文件名。

lpstrTitle标题名。

使用WinExec命令

⑴ 函数原型:

UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow)

⑵ 参数:

lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。

uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。

⑶ 返回值:

若函数调用成功,则返回值大于31。若函数调用失败,则返回值为下列之一:

① 0:系统内存或资源已耗尽。

② ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。

③ ERROR_FILE_NOT_FOUND:指定的文件未找到。

④ ERROR_PATH_NOT_FOUND:指定的路径未找到。

大于 31 {调用成功}

等于 0 {内存不足}

ERROR_FILE_NOT_FOUND = 2 {文件名错误}

ERROR_PATH_NOT_FOUND = 3 {路径名错误}

ERROR_BAD_FORMAT = 11 {EXE 文件无效}

//uCmdShow 参数可选值:

SW_HIDE = 0 {隐藏, 并且任务栏也没有最小化图标}

SW_SHOWNORMAL = 1 {用最近的大小和位置显示, 激活}

SW_NORMAL = 1 {同 SW_SHOWNORMAL}

SW_SHOWMINIMIZED = 2 {最小化, 激活}

SW_SHOWMAXIMIZED = 3 {最大化, 激活}

SW_MAXIMIZE = 3 {同 SW_SHOWMAXIMIZED}

SW_SHOWNOACTIVATE = 4 {用最近的大小和位置显示, 不激活}

SW_SHOW = 5 {同 SW_SHOWNORMAL}

SW_MINIMIZE = 6 {最小化, 不激活}

SW_SHOWMINNOACTIVE = 7 {同 SW_MINIMIZE}

SW_SHOWNA = 8 {同 SW_SHOWNOACTIVATE}

SW_RESTORE = 9 {同 SW_SHOWNORMAL}

SW_SHOWDEFAULT = 10 {同 SW_SHOWNORMAL}

SW_MAX = 10 {同 SW_SHOWNORMAL}

案例:

1)执行完关闭窗口2000和xp中:

WinExec( "cmd   /c   type   aaa.txt ",SW_NORMAL)   //执行完后立即关闭DOS窗口

WinExec( "cmd   /k   type   aaa.txt ",SW_NORMAL)   //执行完后不关闭DOS窗口

2)WINEXEC是异步执行。不能等待命令结束。

例如,移动文件夹,小心还未复制结束,就已经被删除了。

可用

CreateProcess( "测试程序.exe ",   NULL,   NULL,   NULL,

FALSE,   0,   NULL,   NULL,   &si,   &mProcessInfor)

//用下面地代码等待程序执行结束:

WaitForSingleObject(mProcessInfor.hProcess,   INFINITE)

WinExec是异步处理,所以不会等待程序返回而直接执行后面的代码。

可以调用WaitForsingleObject来同步等待进程结束,使用该函数会挂起调用此函数的进程,接受到信号量,立刻返回主线程。

以上实现方法:

WaitForsingleObject(Handle,INFINITE)

Handle这里要替换成你创建进程的句柄

因为进程结束后会返回个信号量以表示进程已结束,可以利用这个特性实现你所述的功能。

终止指定进程

#include "tlhelp32.h"

void KillExe(const char* szExeName)

{

if (szExeName == NULL)

return 0

int lsr = lstrlen(szExeName)

if (lsr == 0)

return 0

PROCESSENTRY32 my

HANDLE l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)

if (((int)l) != -1)

{

my.dwSize = sizeof(my)

if (Process32First(l, &my))

{

do

{

if (lstrcmpi(szExeName, my.szExeFile + lstrlen(my.szExeFile) - lsr) == 0)

{

HANDLE hProcessHandle

hProcessHandle = OpenProcess(0x1F0FFF, true, my.th32ProcessID)

if (hProcessHandle != NULL)

{

if (TerminateProcess(hProcessHandle, 0) != NULL)

{

CloseHandle(hProcessHandle)

}

}

CloseHandle(l)

return

}

}while (Process32Next(l, &my))

}

CloseHandle(l)

}

}

调用方式

KillExe("c:\\windows\\notepad.exe")

完整或部分路径名,不区分大小写


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8109335.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存