我想使用 shell 可执行文件来尊重要启动的应用程序的用户首选项,但我还需要知道该特定应用程序何时关闭。
Process editProcess = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = filename;
startInfo.Verb = "edit";
startInfo.UseShellExecute = true;
editProcess.StartInfo = startInfo;
// start the default editor
editProcess.Start();
editProcess.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
WaitForExit 似乎在 shell 进程退出时返回,而不是在真实进程退出时返回。
有没有比手动解析注册表、找到正确的应用程序来启动并显式启动该应用程序而不执行 shell 更好的方法来了解启动的应用程序何时退出?
首先,我想我必须弄清楚我是否在远程运行,其次我必须弄清楚我的远程连接是独立的远程应用程序还是在终端服务器上运行的应用程序(这可能很棘手)。
但是,一旦我弄清楚了所有这些可怕的事情,有没有办法在本地而不是远程运行像ShellExecute这样的 Windows 函数?
我想要这样做的原因是因为我启动了一个网络浏览器来查看需要 javascript 和 flash 的相当高带宽的东西,并且某些管理我们产品的系统管理员不太热衷于对他们的终端进行不必要和不安全的修改服务器群。
我有一个Delphi应用程序,它使用ShellExecute在按下按钮上调用第二个Delphi应用程序.
应用程序存储在同一服务器上,位于同一网络共享上.他们的路径采用以下格式:
const
JobManager = 'Z:\Apps\Application 1\Application1.exe';
FeeManager = 'Z:\Apps\Application 2\Application2.exe';
Run Code Online (Sandbox Code Playgroud)
对ShellExecute的调用如下:
rh := FindWindow(PChar('TMF'), PChar('Edit Job Details'));
if rh = 0 then
begin
ShellExecute(Handle, 'open', JobManager, nil, nil, SW_SHOWNORMAL);
...
Run Code Online (Sandbox Code Playgroud)
由于我们有三个办公室,我们在每个办公室服务器上都有Apps文件夹的副本.每个服务器的共享上的Apps文件夹映射到"Z:"
在其中一个办公室,我们发现了一个问题,如果路径包含空格,则无法找到应用程序.由于应用程序是彼此的直接副本,并且在其他办公室工作,问题似乎是机器设置.
有任何想法吗?
程序 1 使用 SetEnvironment 并调用 ShellExecute 来启动程序 2。程序 2 调用 GetEnvironment 并从中检索值。令人惊讶的是,正如我在 MSDN 中读到的那样,SetEnvironment 是特定于流程的(至少在我的情况下)。ShellExecute 是否在内部调用 CreateProcess(作为子进程),这又允许程序 2 访问在程序 1 中创建和设置的 ENV 变量...我使用 SetEnvironment 来创建和使用与 Windows 用户和系统变量完全不同的 ENV 变量。
我们公司正在将我们的帮助系统迁移到 Flare 下的 HTML5 格式。我们还在 URI 命令行上使用 Flare CSHID 为帮助系统添加了基于主题的访问,以直接访问主题,例如index.html#CSHID=GettingStarted启动GettingStarted.html帮助页面。
我们的应用程序是用 C++ 编写的,并利用 Win32ShellExecute()函数生成与 HTTP 关联的默认应用程序以显示帮助系统。我们注意到,ShellExecute()当没有指定标签时,它可以正常工作,例如
ShellExecute(NULL, _T("open"), _T("c:\\Help\\index.html"), NULL, NULL, SW_SHOWNORMAL);
Run Code Online (Sandbox Code Playgroud)
此函数将启动与查看 HTML 页面相关联的默认浏览器,在这种情况下,File:///协议处理程序将启动,浏览器将启动,您将file:///c:/Help/index.html在地址栏中看到。
但是,一旦添加了#该主题的信息,就ShellExecute()无法打开页面
ShellExecute(NULL,_T("open"),_T("c:\\Help\\index.html#cshid=GettingStarted"),NULL,NULL,SW_SHOWNORMAL);
Run Code Online (Sandbox Code Playgroud)
如果浏览器完全打开,您将被定向到file:///c:/Help/index.htm没有#cshid=GettingStarted主题标识的l 。
请注意,这只是一个问题,如果 File 协议处理程序通过 参与ShellExecute(),如果帮助系统存在于网络上,并且 Http 或 Https 协议处理程序参与,一切正常。
对于我们的客户,其中一些在专用 LAN 上,我们不能总是依赖 Internet 访问,因此我们的帮助系统必须随应用程序一起提供。
我需要使用 Angular JS 单击按钮来执行 shell 脚本,谁能告诉我如何实现?
在执行之前,我需要从 GUI/UI 向该 shell 脚本传递一些输入(参数、参数)。
从注册表中,对于给定的文件类型,我得到一个包含以下内容的字符串:
"C:\Program Files\AppName\Executable.exe" /arg1 /arg2 /arg3
Run Code Online (Sandbox Code Playgroud)
或有时:
"C:\Program Files\AppName\Executable.exe" /arg1 /arg2 /arg3 "%1"
Run Code Online (Sandbox Code Playgroud)
为了让我执行这个程序,并传递一个文件名作为参数(我知道它接受),我是否必须自己解析这个字符串,或者是否有一个运行时类为我做这个?请注意,我不是要求处理两者之间是否有"%1"的区别,而是我需要拆分可执行文件的名称,分别获取命令行参数.
我尝试只是附加/注入文件的完整路径和文件的名称传递到上面的字符串并将整个shebang传递给Process.Start,但当然它只需要文件名作为单个参数,所以这不是工作.
基本上,上面必须像这样手动完成:
Process proc = new Process();
proc.StartInfo.FileName = @"C:\Program Files\AppName\Executable.exe";
proc.StartInfo.Arguments = "/arg1 /arg2 /arg3 \"" + fileName + "\"";
proc.Start();
Run Code Online (Sandbox Code Playgroud)
我尝试使用UseShellExecute,但这没有帮助.还有其他指针吗?
要清楚,我想要这个:
String commandPath = ReadFromRegistry();
String fullCommand = commandPath + " " + fileName; // assuming not %1
Process.Start(fullCommand); // <-- magic happens here
Run Code Online (Sandbox Code Playgroud) 我在一个线程中使用此代码(通过Indy Onexecute事件).有什么问题吗 ?
function TFrmMain.ShellExecute_AndWait(FileName, Params: string): bool;
var
exInfo: TShellExecuteInfo;
Ph: DWORD;
begin
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
exInfo.lpVerb := 'open';
exInfo.lpParameters := PChar(Params);
lpFile := PChar(FileName);
nShow := SW_NORMAL;
end;
if ShellExecuteEx(@exInfo) then
Ph := exInfo.hProcess
else
begin
Result := true;
exit;
end;
while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do
begin
end;
CloseHandle(Ph);
Result := true;
end;
Run Code Online (Sandbox Code Playgroud) 以下是当unoconv命令以apache运行时我得到的错误,使用root它可以正常工作.
[root@tux1 apache]# sudo -u apache unoconv -f pdf /var/www/html/testing/example.xlsx
Run Code Online (Sandbox Code Playgroud)
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
创建可执行内存区域失败:权限被拒绝
错误:无法连接或启动自己的侦听器.中止.
我正在尝试在Windows注册表中添加自定义上下文菜单,我发现一个shell密钥和shellex密钥,似乎都工作相同的东西?为什么有2个,它们用于什么?