VC++的CreateProcess函数和ShellExecute函数

创建进程
CreateProcess 函数创建一个新进程,该进程独立于创建进程运行。 但是,为简单起见,关系称为父子关系。

以下代码演示如何创建进程。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

如果 CreateProcess 成功,它将返回 一个PROCESS_INFORMATION 结构,其中包含新进程及其主线程的句柄和标识符。 线程和进程句柄是使用完全访问权限创建的,但如果指定安全描述符,则访问权限可能会受到限制。 如果不再需要这些句柄,请使用 CloseHandle 函数关闭 它们。

还可以使用 CreateProcessAsUser 或 CreateProcessWithLogonW 函数创建进程。 这样,就可以指定执行进程的用户帐户的安全上下文。


启动应用程序 (ShellExecute、ShellExecuteEx、SHELLEXECUTEINFO)
应用程序找到文件对象后,下一步通常是以某种方式对其执行操作。 例如,应用程序可能想要启动另一个应用程序,以便用户修改数据文件。 如果感兴趣的文件是可执行文件,则应用程序可能只想启动它。 本文档讨论如何使用 ShellExecute 或 ShellExecuteEx 来执行这些任务。

使用 ShellExecute 和 ShellExecuteEx
对象谓词
使用 ShellExecuteEx 从站点提供激活服务
使用 ShellExecute 启动搜索对话框
如何使用 ShellExecuteEx 的简单示例
使用 ShellExecute 和 ShellExecuteEx
若要使用 ShellExecute 或 ShellExecuteEx,应用程序必须指定要对其执行的文件或文件夹对象,以及指定操作的 谓词 。 对于 ShellExecute,请将这些值分配给相应的参数。 对于 ShellExecuteEx,请填写 SHELLEXECUTEINFO 结构的相应成员。 还有一些其他成员或参数可用于微调这两个函数的行为。

文件和文件夹对象可以是文件系统或虚拟对象的一部分,可以通过路径或指向项标识符列表 (PIDL) 的指针来标识它们。

对象谓词
可用于对象的谓词实质上是你在对象的快捷菜单上找到的项。 若要查找可用的谓词,请查看注册表下的

\ HKEY_CLASSES_ROOTCLSID{object_clsid}\壳\动词

其中 object_clsid 是对象的 CLSID) 的类 (标识符,而 谓词 是可用谓词的名称。 谓词\命令子项包含指示调用该谓词时发生的情况的数据。

若要找出哪些谓词可用于 预定义的 Shell 对象,请查看注册表下的注册表

\ HKEY_CLASSES_ROOT\ object_name壳\动词

其中 object_name 是预定义 Shell 对象的名称。 同样, 谓词\命令 子项包含指示调用该谓词时发生的情况的数据。

常用谓词包括:
谓词 说明
edit 启动编辑器并打开文档进行编辑。
find 从指定目录开始启动搜索。
open 启动应用程序。 如果此文件不是可执行文件,则会启动其关联的应用程序。
print 打印文档文件。
properties 显示对象的属性。
runas 以管理员身份启动应用程序。 用户帐户控制 (UAC) 将提示用户同意运行提升的应用程序,或输入用于运行应用程序的管理员帐户的凭据。
每个谓词对应于用于从控制台窗口启动应用程序的命令。 开放式谓词是一个很好的示例,因为它通常受支持。 对于.exe文件, 只需 启动应用程序即可打开。 但是,它更常用于启动对特定文件进行操作的应用程序。 例如,Microsoft WordPad 可以打开.txt文件。 因此,.txt文件的 打开 谓词对应于类似于以下命令的内容:

"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"

使用 ShellExecute 或 ShellExecuteEx 打开.txt文件时,Wordpad.exe将指定文件作为其参数启动。 某些命令可以具有其他参数(例如标志),这些参数可以根据需要添加以正确启动应用程序。 有关快捷菜单和谓词的进一步讨论,请参阅 “扩展快捷菜单”。

一般情况下,尝试确定特定文件的可用谓词列表有点复杂。 在许多情况下,只需将 lpVerb 参数设置为 NULL,这会调用文件类型的默认命令。 此过程通常等效于将 lpVerb 设置为“open”,但某些文件类型可能具有不同的默认命令。 有关详细信息,请参阅 扩展快捷菜单 和 ShellExecuteEx 参考文档。

使用 ShellExecuteEx 从站点提供激活服务
网站链的服务可以控制项目激活的许多行为。 从Windows 8开始,可以提供指向 ShellExecuteEx 的站点链的指针以启用这些行为。 若要向 ShellExecuteEx 提供站点,请执行以下操作:

在 SHELLEXECUTEINFO 的 fMask 成员中指定SEE_MASK_FLAG_HINST_IS_SITE标志。
在 SHELLEXECUTEINFO 的 hInstApp 成员中提供 IUnknown。
使用 ShellExecute 启动搜索对话框
当用户右键单击Windows资源管理器中的文件夹图标时,菜单项之一是“搜索”。 如果他们选择该项目,Shell 将启动其搜索实用工具。 此实用工具显示可用于搜索指定文本字符串的文件的对话框。 应用程序可以通过调用 ShellExecute、将“find”用作 lpVerb 参数和目录路径作为 lpFile 参数,以编程方式启动目录的搜索实用工具。 例如,以下代码行为 c:\MyPrograms 目录启动搜索实用工具。

ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);

如何使用 ShellExecuteEx 的简单示例
以下示例控制台应用程序演示 了 ShellExecuteEx 的使用。 为了清楚起见,省略了大多数错误检查代码。

#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>

main()
{
    LPITEMIDLIST pidlWinFiles = NULL;
    LPITEMIDLIST pidlItems = NULL;
    IShellFolder *psfWinFiles = NULL;
    IShellFolder *psfDeskTop = NULL;
    LPENUMIDLIST ppenum = NULL;
    STRRET strDispName;
    TCHAR pszParseName[MAX_PATH];
    ULONG celtFetched;
    SHELLEXECUTEINFO ShExecInfo;
    HRESULT hr;
    BOOL fBitmap = FALSE;

    hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);

    hr = SHGetDesktopFolder(&psfDeskTop);

    hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
    hr = psfDeskTop->Release();

    hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);

    while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
    {
        psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
        StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
        CoTaskMemFree(pidlItems);
        if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
        {
            fBitmap = TRUE;
            break;
        }
    }

    ppenum->Release();

    if(fBitmap)
    {
        ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
        ShExecInfo.fMask = NULL;
        ShExecInfo.hwnd = NULL;
        ShExecInfo.lpVerb = NULL;
        ShExecInfo.lpFile = pszParseName;
        ShExecInfo.lpParameters = NULL;
        ShExecInfo.lpDirectory = NULL;
        ShExecInfo.nShow = SW_MAXIMIZE;
        ShExecInfo.hInstApp = NULL;

        ShellExecuteEx(&ShExecInfo);
    }

    CoTaskMemFree(pidlWinFiles);
    psfWinFiles->Release();

    return 0;
}

应用程序首先检索Windows目录的 PIDL,并枚举其内容,直到找到第一个.bmp文件。 与前面的示例不同, IShellFolder::GetDisplayNameOf 用于检索文件的分析名称,而不是检索其显示名称。 由于这是文件系统文件夹,因此分析名称是一个完全限定的路径,这是 ShellExecuteEx 所需的路径。

找到第一个.bmp文件后,相应的值将分配给 SHELLEXECUTEINFO 结构的成员。 lpFile 成员设置为文件分析名称,并将 lpVerb 成员设置为 NULL,以开始默认操作。 在这种情况下,默认操作为“open”。 然后,该结构将传递给 ShellExecuteEx,后者启动位图文件的默认处理程序(通常MSPaint.exe)以打开该文件。 函数返回后,将释放 PIDL,并释放Windows文件夹的 IShellFolder 接口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ShellExecuteCreateProcess是Windows操作系统中的两个不同的函数,用于启动和执行其他应用程序。 ShellExecute函数可以用于打开指定类型的文件、URL、应用程序或者执行其他操作。它属于Shell32.dll动态链接库中的一个功能函数,具有简单易用的特点。ShellExecute函数将指定的文件或操作交给操作系统来处理,操作系统会根据文件类型或者操作种类的不同来决定采取什么措施,例如用关联的程序打开文件、打开指定的网址等。ShellExecute还可以更改操作系统的默认处理程序,以便自定义文件、操作的打开方式。ShellExecute函数适用于不需要对新启动的程序进行严格控制和监控的场景。 CreateProcess函数可以用于启动和执行另一个可执行文件。它属于Kernel32.dll动态链接库中的一个功能函数,具有更多的参数和选项,可以更加灵活地控制和监控新启动的程序。CreateProcess函数可以指定新进程的可执行文件路径、命令行参数、环境变量等,并且可以创建一个新的进程并使其运行。CreateProcess函数还可以指定新进程的启动方式、窗口样式和权限等参数,用于实现更加复杂的操作和需求。CreateProcess函数适用于需要对新启动的程序进行精细控制和监控的场景。 总结来说,ShellExecute函数适用于简单地启动和执行外部应用程序或者操作,而CreateProcess函数则适用于更加复杂的、需要对新进程进行精细控制和监控的情况。在实际应用中,我们可以根据具体需求选择合适的函数来启动和执行其他应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百口可乐__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值