为什么 ShellExecuteA 有时无法完成某个操作?

问题描述 投票:0回答:1

我正在使用 RAD Studio C++ Builder。 我还没有使用他们的 clang 编译器(长话短说),所以我的代码不能使用 C++17 函数。 (由于这是一个标准的 VCL 应用程序,我相信 CoInitialize 会自动运行)

我正在尝试创建一个快捷方式(按钮)来从我的一个应用程序中打开“Internet 信息服务 (IIS) 管理器”。 我正在使用一些多年来一直致力于开放应用程序的代码,但是,它不适用于:

  • %windir%\system32\inetsrv\InetMgr.exe(取自管理工具快捷方式)
  • C:\WINDOWS\system32\inetsrv\InetMgr.exe(相同,没有变量)

我已经检查过,文件确实存在。
这是我正在使用的代码:

void __fastcall TLaunch::OpenApplication ( const AnsiString& Location 
                                         , const AnsiString& FileName
                                         )
{
    HWND       hwnd         = NULL;
    LPCSTR     lpOperation  = "open";
    LPCSTR     lpFile       = FileName.c_str();   
    LPCSTR     lpParameters = "";
    LPCSTR     lpDirectory  = Location.c_str();   
    INT        nShowCmd     = SW_SHOWNORMAL;   
    HINSTANCE AppHandle = ShellExecuteA ( hwnd
                                        , lpOperation
                                        , lpFile
                                        , lpParameters
                                        , lpDirectory
                                        , nShowCmd
                                        );
}

// This Does nothing
OpenApplication ( "C:\Windows\system32\inetsrv\" 
                , "InetMgr.exe" 
                );
// This also Does nothing (the Administrative tools shortcut does not specify a "Start In")
OpenApplication ( "" 
                , "C:\Windows\system32\inetsrv\InetMgr.exe" 
                );

当我查看管理工具快捷方式以获取文件详细信息时,目标不包含任何引号或参数,因此我在调用中未包含任何引号或参数。
我还尝试从 CMD 在没有管理员权限的情况下打开手动运行 C:\WINDOWS\system32\inetsrv\InetMgr.exe。该应用程序已显示,因此我不需要使用“runas”。因此,我有点困惑为什么这不能通过 ShellExecuteA 工作。 (就像我说的,这段代码很高兴打开其他应用程序)。

任何人都可以阐明我做错了什么吗?
或者为什么这个应用程序的行为与我要求 ShellExecuteA 打开的其他所有应用程序不同?

也许???这可能与为什么我使用 ShellExecuteA 签署应用程序时遇到问题有关?
打开应用程序是我的问题,这只是可能相关的事情。如果我使用从 MS Windows 10 SDK 安装的 signtool.exe 来签署我的应用程序,我必须使用类似于下面的命令行脚本

 "C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe" sign /a /f "C:\Development\( RESOURCE )\_Certs\V12.pfx" /p "PasswordExample" /d "Company Name : App" /tr "http://timestamp.digicert.com" /td sha256 /fd sha256 /v "R:\(Distribute)\V12.1.1 [24-05]\(2024-05-03)\ACMS V1211.2405 (x86-Distro)\MyApp.exe" 

但是,如果我使用 ShellExecuteA 运行此程序,则不会将数字签名分配给我的应用程序。如果我将发送到 ShellExecuteA 的(精确)文本保存到批处理文件中并手动运行它,则不会收到任何错误,并且应用程序最终会获得数字签名。我很困惑。
(我很久以前就删除了对 ShellExecute 代码签名的尝试,所以我无法提供任何损坏的示例)

我们将非常感激您提供的任何帮助。 干杯:)

c++ winapi
1个回答
0
投票

我无法对您的代码进行一些更改来重现。

#include <Windows.h>

void OpenApplication(const char* Location
    , const char* FileName
)
{
    HWND       hwnd = NULL;
    LPCSTR     lpOperation = "open";
    LPCSTR     lpFile = FileName;
    LPCSTR     lpParameters = "";
    LPCSTR     lpDirectory = Location;
    INT        nShowCmd = SW_SHOWNORMAL;
    HINSTANCE AppHandle = ShellExecuteA(hwnd
        , lpOperation
        , lpFile
        , lpParameters
        , lpDirectory
        , nShowCmd
    );
}


int main()
{
    OpenApplication("C:\\Windows\\system32\\inetsrv\\" 
        , "InetMgr.exe"
    );

    OpenApplication(""
        , "C:\\Windows\\system32\\inetsrv\\InetMgr.exe"
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.