shellexecuteex参数(MFC使用什么函数能让程序重启)

:暂无数据 2026-07-11 14:00:01 1

shellexecuteex参数(MFC使用什么函数能让程序重启)

大家好,关于shellexecuteex参数很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于MFC使用什么函数能让程序重启的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

本文目录

MFC使用什么函数能让程序重启

用ShellExecuteEx启动另外一个程序,传递一个reboot参数,然后在新启动的程序中接收这个参数,来判断自身是“重启”的结果,然后寻找之前的窗体,最后TerminateProcess
之前的进程。

Delphi深度探索之外壳执行操作记录器

记录外壳的活动

  记录外壳活动有很多好处 比如当需要监控用户的行为 回溯系统崩溃前的过程 实现这一功能的关键工具相当简单 它就是接口IShellExecuteHook 编写一个实现了这一接口的对象后 再在系统中注册 就可以容易地控制并影响Windows外壳的运行 Windows 和Windows 都支持IShellExecuteHook外壳扩展 而在Windows 和Windows NT 上则必须安装活动桌面扩展后才支持(也就是说必须安装IE )

  一个实现了IShellExecuteHook接口的对象可以截获所有对ShellExecute和ShellExecuteEx函数的调用 ShellExecute和ShellExecuteEx函数主要用于执行应用程序 它们可以接收一个文件名并能自动获得同文件名相关的可执行文件名 此外 它们还支持系统安全认证 如果在NT上设定了用户的可执行权限 ShellExecute和ShellExecuteEx函数将会在创建新的进程前检查权限(CreateProcess和WinExec函数则没有这项功能) 函数调用的流程如下

  ( )获得将要运行的可执行文件名

  ( )根据程序名检查用户执行权限

  ( )激活全部已注册的IshellExecuteHook扩展

  ( )当所有扩展和权限都同意执行 创建新的进程并返回

  Windows外壳大量调用ShellExecute和ShellExecuteEx函数来执行几乎是所有的资源管理器的操作 比如双击目录 浏览文件夹内容 打印文档 查看文件属性 选择文档的上下文相关菜单等等 此外 开始菜单的运行对话框和DOS方式下的Start exe也使用ShellExecuteEx函数来执行程序 简单地说几乎用户的所有外壳操作都可以被扩展截获 包括其他应用程序对ShellExecute和ShellExecteEx的调用

编写外壳活动记录器

  首先需要创建一个进程内对象 选菜单命令New | ActiveX Library 然后点击菜单New|Com Object 创建对象框架 按图 填充对话框的内容 然后点击OK按钮 Delphi就会自动生成框架文件 并保存生成的文件

  IShellExecuteHook的接口定义在shlobj pas单元中 添加shlobj到单元uses部分 然后添加IShellExecuteHooko方法原型到对象声明部分 声明部分代码如下

unit ShellExecuteHookObj;

interface

uses

Windows ActiveX ComObj ShlObj ShellAPI;

type

TTShellExecuteHook = class (TComObject IShellExecuteHook)

protected

function Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult; stdcall;

end;

const

Class_TShellExecuteHook: TGUID = { FA D D B E B AE BE } ;

  下面就是用来截获并记录外壳操作的实现部分 一旦外壳扩展被注册后 每次ShellExecute 和ShellExecuteEx函数运行时都会调用对象的Execute函数 我们的核心代码就是通过Execute方法实现的 方法定义如下

function TTShellExecuteHook Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult;

  Execute方法会从外壳获得一个类型为TshellExecuteInfo的参数 参数定义如下

_SHELLEXECUTEINFOA = record

cbSize: DWORD;

fMask: ULONG;

Wnd: HWND;

lpVerb: PAnsiChar;

lpFile: PAnsiChar;

lpParameters: PAnsiChar;

lpDirectory: PAnsiChar;

nShow: Integer;

hInstApp: HINST;

{ Optional fields }

lpIDList: Pointer;

lpClass: PAnsiChar;

eyClass: HKEY;

dwHotKey: DWORD;

hIcon: THandle;

hProcess: THandle;

end;

  这个记录结构中的lpFile包含了要运行的文件名 而lpVerb则表明执行的动作 动作由一些标准的字符串代表 比如 open(打开) print(打印) edit() explore(浏览) properties(属性) find(查找)和其他上下文菜单的命令名 有时 lpFile并不包含可执行文件名 这是因为ShellExecute接到的运行参数是一个文档名 比如当我们在资源管理器中双击文本文件时 Windows用文本文件名作为参数调用ShellExecute函数 而ShellExecute函数则获得同文本文件相关联的可执行文件名 然后执行

  TShellExecuteInfo结构中还记录了要运行程序的很多信息 然而这里我们只能在Execute方法中修改nCmdShow参数 nCmdShow参数定义了窗口在运行后的显示状态 包括最大化 最小化 正常等选项 对于其他参数的修改都会被外壳忽略 除此之外 在Execute方法中可以根据情况允许外壳继续缺省的任务或通知外壳取消执行 这可以通过Execute函数的返回值来实现

  如果Execute的返回值为S_FALSE 外壳就继续缺省的任务 如果返回S_OK 则外壳认为扩展已经成功 就不再继续执行了 另外如果返回一个错误代码或系统无法识别的值 则外壳会弹出错误信息 这给了我们一个控制程序运行的机会 比如可以限制任何对记事本的调用 代码如下

function TTShellExecuteHook Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult;

var

FileName: String;

begin

Result := S_FALSE;

with ShellExecuteInfo do

begin

FileName := UpperCase(ExtractFileName(lpFile));

if Pos( NOTEPAD FileName) = then

begin

Result := S_OK;

hInstApp := ;

MessageBox(Wnd 不允许记事本运行! 错误 MB_OK or MB_ICONERROR);

end;

end;

end;

  进一步 我们甚至可以利用这点实现一个自定义的安全认证机制 根据用户要求限制运行的程序 有兴趣的朋友可以试验一下 一定很有意思

  有一点要注意的是 在Execute方法下不能调用ShellExecute和ShellExecuteEx函数外部程序 如果是这样的话 我们的Execute方法又会被新的ShellExecute调用 这样系统就会进入死循环 如果我们确实想在Execute方法中调用外部程序的话 可以使用CreateProcess或WinExec函数来替代 这两个函数不会被ShellExecuteHook截获

  对于外壳动作记录器来说 只要在Execute方法中记录程序信息到日志文件中就可以了 代码非常简单 因为所有需要的信息都在TShellExecuteInfo记录中包含了 这里只记录运行的动作 文件名和时间 需要记录其他信息的话 大家可自行修改 代码示意如下

function TTShellExecuteHook Execute(var ShellExecuteInfo: TShellExecuteInfo): HResult;

var

FileStream: TFileStream;

a:TStringList;

S:string;

begin

Result := S_FALSE;

with ShellExecuteInfo do

begin

FileStream:=TFileStream Create( c:\shellexecutehook txt fmopenwrite);

S:=string(lpVerb)+ : +string(lpFile)+DateTimeToStr(Now)+# # ;

FileStream Seek(FileStream Size soFromBeginning);

FileStream Write(PChar(S)^ Length(S));

FileStream Free;

end;

end;

注册ShellExecuteHook

  要想使对象被外壳加载 需要在注册表中注册一些信息 在下面这个子键中添加类的GUID及描述字符串后就可以了(描述字符串可以不赋值 但不妨给一个以便于识别)

HKEY_LOCAL_MACHINE

SOFARE

Microsoft

Windows

CurrentVersion

Explorer

ShellExecuteHooks

{CLSID}= 描述字符串

  修改注册表可以通过重载的类工厂的UpdateRegistry方法来实现 代码示意如下

implementation

uses ComServ SysUtils;

resourcestring

sCreateRegKeyError = 创建注册表项失败 ;

type

TShellExComObjectFactory = class(TComObjectFactory)

public

procedure UpdateRegistry(Register: Boolean); override;

end;

{ TShellExComObjectFactory }

procedure TShellExComObjectFactory UpdateRegistry(Register: Boolean);

const

hellExecuteHooksKey= SOFARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks ;

var

Handle: HKey;

Status Disposition: Integer;

ClassID: String;

begin

ClassID := GUIDToString(Class_TShellExecuteHook);

if Register then

begin

Status := RegCreateKeyEx(HKEY_LOCAL_MACHINE PChar(ShellExecuteHooksKey) REG_OPTION_NON_VOLATILE KEY_READ or KEY_WRITE nil Handle @Disposition);

if Status = then

begin

Status := RegSetValueEx(Handle PChar(ClassID) REG_SZ

PChar(Description) Length(Description) + );

RegCloseKey(Handle);

end;

end else

begin

Status := RegOpenKeyEx(HKEY_LOCAL_MACHINE PChar(ShellExecuteHooksKey)

KEY_READ or KEY_WRITE Handle);

if Status = then

begin

Status := RegDeleteValue(Handle PChar(ClassID));

RegCloseKey(Handle);

end;

end;

if Status 《》 then raise EOleError Create(sCreateRegKeyError);

inherited UpdateRegistry(Register);

end;

initialization

TShellExComObjectFactory Create(ComServer TTShellExecuteHook Class_TShellExecuteHook TShellExecuteHook ShellExecute hook sample ciMultiInstance tmApartment);

end   如果系统中有多个ShellExecuteHook的话 外壳会按照ShellExecuteHook的安装顺序进行调用 如果要想使某个外壳扩展优先运行 可先删除其他扩展然后添加优先扩展 原来的扩展依次放在后面 不过这样做也可能意义不大 因为别人也会这么干 最后 程序运行的结果

  记住ShellExecuteHook并不是一个完善的用于监视系统运行的扩展 它只能监视ShellExecute和ShellExecuteEx的运行 它不能保证记录系统所有的行为 特别是很多情况下外壳并不使用ShellExecute来进行一些常用的操作 比如我们在资源管理器中选择一个文件 然后调用右键菜单的属性命令后 记录器没有记录这个动作 但如果直接调用ShellExecute(如下示)的话 ShellExecuteHook却会正确执行

ShellExecute(nil properties foo txt nil nil SW_SHOW);

lishixinzhi/Article/program/Delphi/201311/24787

如何在C++调用外部程序时传值

Windows 的话, ShellExecuteEx 可以调用外部程序并附加参数, Linux 不知
另外貌似也可以直接用 System() 直接跑命令行来实现
***隐藏网址***

exe文件如何加参数运行

1、首先进入exe文件位置,右键单击文件。

2、将exe文件的快捷方式发送到桌面快捷方式。

3、右键单击此快捷方式--属性。

4、在快捷方式属性界面,点击目标后面的链接。

5、在用于steam联机优化,后面先打一个空格然后输入 -nofriendsui,然后点击确定按钮。

6、最后空格添加 -tcp即可加参数运行。

c#如何调用dll中的shellexecuteex函数来打开exe文件

首先那个shellexecuteex 修饰符应该是public的

这是调用:

//加载程序集(dll文件地址),使用Assembly类   
            Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Bin/App_Code.dll");
            //获取类型,参数(名称空间+类)   
            Type type = assembly.GetType("NiHao.Test");
            //创建该对象的实例,object类型,参数(名称空间+类)   
            object instance = assembly.CreateInstance("NiHao.Test");
            //设置SayHello方法中的参数类型,Type类型;如有多个参数可以追加多个   
            Type;
            params_type = Type.GetType("System.String");
            //设置SayHello方法中的参数值;如有多个参数可以追加多个   
            Object;
            params_obj = "jiaopeng";
            //执行SayHello方法   
            object value = type.GetMethod("SayHello", params_type).Invoke(instance, params_obj);

 这是dll中的类:

namespace NiHao
{
    public class Test
    {
        public string SayHello(string str)
        {
            if (string.IsNullOrEmpty(str))
                return "你没有传参数进来";
            else
                return str+"你好";
        }
    }
}

vc中通过ShellExecuteEx()调用外部exe文件,并传递给exe文件五个整形参数,怎么写代码

先定义一个SHELLEXECUTEINFO变量,然后用ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);
***隐藏网址***

以上就是我们为大家找到的有关“shellexecuteex参数(MFC使用什么函数能让程序重启)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。

shellexecuteex参数(MFC使用什么函数能让程序重启)

本文编辑:admin

本文相关文章:


timestamp without time zone(Postgresql中to_date()函数使用问题)

timestamp without time zone(Postgresql中to_date()函数使用问题)

各位老铁们好,相信很多人对timestamp without time zone都不是特别的了解,因此呢,今天就来为大家分享下关于timestamp without time zone以及Postgresql中to_date()函数使用问题

2026年9月7日 09:40

matlab中fplot函数(matlab二维平面绘图函数plot和fplot的区别,举例说明)

matlab中fplot函数(matlab二维平面绘图函数plot和fplot的区别,举例说明)

今天给各位分享matlab二维平面绘图函数plot和fplot的区别,举例说明的知识,其中也会对matlab二维平面绘图函数plot和fplot的区别,举例说明进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年8月30日 15:20

releasesemaphore参数(请问用C语言在windows上建立多线程需要用什么函数最好,)

releasesemaphore参数(请问用C语言在windows上建立多线程需要用什么函数最好,)

本篇文章给大家谈谈releasesemaphore参数,以及请问用C语言在windows上建立多线程需要用什么函数最好,对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,

2026年8月30日 07:30

mysql自定义聚合函数(MySQL函数的聚合函数)

mysql自定义聚合函数(MySQL函数的聚合函数)

其实mysql自定义聚合函数的问题并不复杂,但是又很多的朋友都不太了解MySQL函数的聚合函数,因此呢,今天小编就来为大家分享mysql自定义聚合函数的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年8月16日 02:30

matlab定义函数的方法(matlab 中怎么定义函数)

matlab定义函数的方法(matlab 中怎么定义函数)

本篇文章给大家谈谈matlab定义函数的方法,以及matlab 中怎么定义函数对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年7月23日 09:00

sleep函数java(在JAVA里有什么函数可以像C语言里的system(“cls“)和Sleep()一样的功能啊)

sleep函数java(在JAVA里有什么函数可以像C语言里的system(“cls“)和Sleep()一样的功能啊)

大家好,如果您还对sleep函数java不太了解,没有关系,今天就由本站为大家分享sleep函数java的知识,包括在JAVA里有什么函数可以像C语言里的system(“cls“)和Sleep()一样的功能啊的问题都会给大家分析到,还望可以

2026年7月12日 18:50

countifs函数的使用方法及实例视频(countifs函数怎么使用)

countifs函数的使用方法及实例视频(countifs函数怎么使用)

本篇文章给大家谈谈countifs函数的使用方法及实例视频,以及countifs函数怎么使用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年7月9日 12:50

更多文章:


数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)

数据库管理系统和数据库系统分别侧重(数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例)

今天给各位分享数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例的知识,其中也会对数据库,数据库管理系统,数据库系统,这三个分别是什么意思并举个实例进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月7日 17:00

编程语言出现的先后顺序(最早的编程语言是哪一个)

编程语言出现的先后顺序(最早的编程语言是哪一个)

今天给各位分享最早的编程语言是哪一个的知识,其中也会对最早的编程语言是哪一个进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月7日 16:10

小程序源码有什么用(大商创小程序源码好用吗)

小程序源码有什么用(大商创小程序源码好用吗)

“小程序源码有什么用”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看小程序源码有什么用(大商创小程序源码好用吗)!

2026年9月7日 15:40

springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)

springmvc的依赖(springMVC的注入方式有哪几种,这与springMVC依赖)

大家好,关于springmvc的依赖很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于springMVC的注入方式有哪几种,这与springMVC依赖的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还

2026年9月7日 14:00

it培训评价网(it培训排名机构十大IT培训机构)

it培训评价网(it培训排名机构十大IT培训机构)

这篇文章给大家聊聊关于it培训评价网,以及it培训排名机构十大IT培训机构对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年9月7日 13:00

个人博客页面布局(新手站长怎样做好独立博客初期运营工作)

个人博客页面布局(新手站长怎样做好独立博客初期运营工作)

大家好,如果您还对个人博客页面布局不太了解,没有关系,今天就由本站为大家分享个人博客页面布局的知识,包括新手站长怎样做好独立博客初期运营工作的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月7日 12:40

display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)

display flex 自动换行(overflow-y:hidden;overflow-x:auto;无效解决方法)

大家好,关于display flex 自动换行很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于overflow-y:hidden;overflow-x:auto;无效解决方法的知识点,相信应该可以解决大家的一些困惑和问题,如

2026年9月7日 11:00

小程序免认证源码(小程序源码都能干嘛)

小程序免认证源码(小程序源码都能干嘛)

本篇文章给大家谈谈小程序免认证源码,以及小程序源码都能干嘛对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月7日 10:50

timestamp without time zone(Postgresql中to_date()函数使用问题)

timestamp without time zone(Postgresql中to_date()函数使用问题)

各位老铁们好,相信很多人对timestamp without time zone都不是特别的了解,因此呢,今天就来为大家分享下关于timestamp without time zone以及Postgresql中to_date()函数使用问题

2026年9月7日 09:40

网页制作代码特效大全(谁知道网页打字机特效的代码)

网页制作代码特效大全(谁知道网页打字机特效的代码)

大家好,如果您还对网页制作代码特效大全不太了解,没有关系,今天就由本站为大家分享网页制作代码特效大全的知识,包括谁知道网页打字机特效的代码的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年9月7日 04:20

最近更新

热门文章

yoga pro 14s carbon(yoga14s接口类型)
2026-07-03 17:50:01 浏览:5
domino directory(帮我翻译一下Recipient’s Domino Directory entry does not specify a valid Notes mail file)
2026-08-03 19:20:01 浏览:4
标签列表