我正在使用 RAD Studio C++ Builder。 我还没有使用他们的 clang 编译器(长话短说),所以我的代码不能使用 C++17 函数。 (由于这是一个标准的 VCL 应用程序,我相信 CoInitialize 会自动运行)
我正在尝试创建一个快捷方式(按钮)来从我的一个应用程序中打开“Internet 信息服务 (IIS) 管理器”。 我正在使用一些多年来一直致力于开放应用程序的代码,但是,它不适用于:
我已经检查过,文件确实存在。
这是我正在使用的代码:
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 代码签名的尝试,所以我无法提供任何损坏的示例)
我们将非常感激您提供的任何帮助。 干杯:)
我无法对您的代码进行一些更改来重现。
#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"
);
}