标签: shellexecute

如何启动优先级较低的流程?C#

我想执行命令行工具来处理数据.它不需要阻止.我希望它是低优先级.所以我写了下面的内容

 Process app = new Process();
 app.StartInfo.FileName = @"bin\convert.exe";
 app.StartInfo.Arguments = TheArgs;
 app.PriorityClass = ProcessPriorityClass.BelowNormal;
 app.Start();
Run Code Online (Sandbox Code Playgroud)

但是,我得到一条System.InvalidOperationException消息"没有进程与此对象关联." 为什么?如何以低优先级正确启动此应用程序?

没有这条线app.PriorityClass = ProcessPriorityClass.BelowNormal;,应用运行正常.

c# process shellexecute

31
推荐指数
3
解决办法
1万
查看次数

如何运行需要提升并等待的子进程?

Win 7/UAC让我发疯.

在我的C++应用程序中,我需要运行一个需要在Windows 7上提升的可执行文件.我想解决这个问题并等待它继续完成.最简单的方法是什么?

我通常会通过这种方式执行此类操作CreateProcess(),但对于需要提升的可执行文件,它会失败.

我尝试使用cmd.exe /c ...直通CreateProcess,它可以工作,但弹出一个丑陋的cmd终端窗口.

我正在阅读,这ShellExecute()将允许提升,但使用时等待exe完成似乎并不容易ShellExecute().像system()工作一样简单吗?

非常感谢任何其他想法!

c++ winapi uac createprocess shellexecute

30
推荐指数
1
解决办法
3万
查看次数

24
推荐指数
1
解决办法
4万
查看次数

如何在Delphi中运行命令行程序?

我需要从Delphi软件执行Windows"find"命令.我试图使用该ShellExecute命令,但它似乎不起作用.在C中,我会使用该system程序,但在这里...我不知道.我想做这样的事情:

System('find "320" in.txt > out.txt');
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢你的答案:)我试图运行'查找'作为可执行文件,而不是作为cmd.exe的参数.

delphi command-line shellexecute

23
推荐指数
2
解决办法
7万
查看次数

如何等待ShellExecute运行?

我已经设法在VC++中使用ShellExecute来启动文档.现在我希望运行一个接收一些参数的命令行工具,并在后台运行(隐藏,而不是最小化)并让它阻止我的程序流程,这样我就可以等待它完成了.如何更改命令行:

ShellExecute(NULL,"open",FULL_PATH_TO_CMD_LINE_TOOL,ARGUMENTS,NULL,SW_HIDE);
Run Code Online (Sandbox Code Playgroud)

问题是,我有工具将html转换为pdf,我希望一旦工具完成,也就是pdf准备好,让另一个ShellExecute来查看它.

shellexecute visual-c++

23
推荐指数
1
解决办法
3万
查看次数

以编程方式在资源管理器中选择文件

在我的应用程序中,我可以通过编程方式打开资源管理器并使用以下代码选择文件:

void BrowseToFile(LPCTSTR filename)
{
    CString strArgs; 
    strArgs = _T("/select,\"");
    strArgs += filename; 
    strArgs += _T("\"");

    ShellExecute(0, _T("open"), _T("explorer.exe"), strArgs, 0, SW_NORMAL);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我第二次使用不同的文件调用此函数,但在同一文件夹中,资源管理器中的选择不会更改为新文件,而是保留在以前的文件中.

例如,如果我调用我的函数C:\path\to\file1.txt,将打开一个新的资源管理器窗口file1.txt并将被选中.如果我第二次调用我的函数C:\path\to\file2.txt,将激活现有的资源管理器窗口,但选择仍将打开file1.txt.

有没有办法强制资源管理器更新选择或更好的方法来实现这一目标?

编辑:

上面提到的行为是在Windows XP上.似乎Vista/Win7上的行为是不同的.每次调用都会打开一个新的资源管理器实例并选择该文件.

我的主要目标是将Visual Studio选项复制到文档的Open Containing Folder.Visual Studio中的此功能在XP,Vista和Win7上的行为相同.如果具有相同文件夹的另一个实例已打开,则不会创建新实例,但会将选择更新为新文件.

如果有人知道Visual Studio如何实现这一点,我很想知道它.

c++ windows explorer shellexecute

17
推荐指数
1
解决办法
1万
查看次数

从非交互式服务启动UAC升级进程(win32/.net/powershell)

我正在使用第三方Windows服务,通过使用CreateProcessAsUser()运行脚本和可执行文件来处理一些自动化任务.由于UAC,我在Windows Server 2008上遇到了问题,并且通过API处理LUA提升的方式.

该服务作为LocalSystem运行,并且未启用"Interact With Desktop".这些进程作为Administrators组中的用户运行,但不是管理员帐户(免除许多UAC限制).所有UAC默认设置都已到位.

我可以将任意命令或powershell代码传递给服务,但我似乎无法"突破"由服务启动的非提升的非交互式进程.

问题的症结似乎是启动提升过程的唯一(公共)API选项是具有'runas'动词的ShellExecute(),但据我所知,无法从非交互式调用服务或您收到"此操作需要交互式窗口站"之类的错误.

我发现的唯一解决方法在这里提到:http: //www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx

在Vista中,官方记录的提升进程的方法仅使用shell API ShellExecute(Ex)(不是CreateProcess或CreateProcessAsUser).因此,您的应用程序必须调用ShellExecute(Ex)来启动升级的帮助程序以调用SendInput.此外,由于Session 0隔离,服务只能使用CreateProcessAsUser或CreateProcessWithLogonW(不能使用ShellExecute(Ex))来指定交互式桌面.

..我认为没有直接的方法从Windows服务产生提升的进程.我们只能首先使用CreateProcessAsUser或CreateProcessWithLogonW将非提升的进程生成到用户会话(交互式桌面)中.然后在非提升的进程中,它可以使用ShellExecute(Ex)为真实任务生成提升的进程.

要从.net/powershell代码执行此操作,看起来我必须做一些精心设计的P/Invoke来调用CreateProcessAsUser或CreateProcessWithLogonW,因为.Net System.Diagnostics.ProcessStartInfo没有相应的lpDesktop,我可以设置为"winsta0\default".而且我不清楚LocalSystem是否有权调用CreateProcessAsUser或CreateProcessWithLogonW.

我还查看了 http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessas-in-net.aspxProcess.Start与UAC的不同凭据

基于这一切,我得出结论,没有直接的方法来做到这一点.我错过了什么吗?这看起来真的不应该那么难.感觉UAC从未被设计用于处理非交互式用例.

如果有任何微软人员最终阅读此内容,我注意到ShellExecute内部处理提升的方式是通过调用应用程序信息服务(AIS).为什么通过某些Win32或.NET API不能同样调用AIS? http://msdn.microsoft.com/en-us/library/bb756945.aspx

抱歉,跑了一会儿.谢谢你的任何想法.

winapi uac shellexecute createprocessasuser

16
推荐指数
1
解决办法
2万
查看次数

Delphi程序如何通过DEFAULT电子邮件客户端发送带附件的电子邮件?

在我的程序中,我正在编写一封电子邮件,使用安装在用户计算机上的默认电子邮件客户端软件进行发送.

我已经写了mailto地址,主题,多字体,我有几个附件要包括在内.

我几乎使用mailto和ShellExecute工作如下:

  Message := 'mailto:someone@somewhere.com'
    + '?subject=This is the subjectBehold Error Report'
    + '&body=This is line 1' + '%0D%0A'
    + 'This is line 2' + '%0D%0A'
    + 'This is line 3'
    + '&Attach=c:\file1.txt';
  RetVal := ShellExecute(Handle, 'open', PChar(Message), nil, nil, SW_SHOWNORMAL);
  if RetVal <= 32 then
    MessageDlg('Cannot find program to send e-mail.', mtWarning, [mbOK], 0);
Run Code Online (Sandbox Code Playgroud)

在Windows Vista计算机上使用Delphi 2009,这将打开Microsoft Mail"创建邮件"窗口,正确填充"收件人","主题"和"正文".但是文件没有附加.

当我研究这个时,我注意到一些评论说这种技术不适用于所有邮件客户端.然而,大多数评论都相当陈旧,因为我意识到这是一种非常古老的技术.

然后我发现Zarko Gajic说 "这种方法没问题,但是你无法以这种方式发送附件".

我看过还有Windows Simple Mail API(MAPI),但Zarko说只有最终用户拥有符合MAPI标准的电子邮件软件才有效.有关使用MAPI和Delphi的文档很好(例如使用mapi发送电子邮件),但他们都有免责声明MAPI并不总是与Windows一起安装.

此外,我真的希望在用户的默认电子邮件程序中首先显示该消息,因此他们将其作为其电子邮件记录的一部分,并且他们可以编辑它并决定是否以及何时发送它.我不确定MAPI是如何工作的,如果它会这样做.

所以我的要求是:

  1. 将电子邮件发送到用户的邮件程序中.

  2. 允许一个或多个附件.

  3. 在XP上(即XP,Vista或7)使用任何Windows机器上的所有电子邮件客户端(希望如此).

有这样的动物吗?或者也许有人知道如何使用mailto/ShellExecute技术获取附件?

大多数人做什么?


编辑:

MAPI解决方案甚至是Indy解决方案都有一些答案. …

mailto delphi email attachment shellexecute

14
推荐指数
2
解决办法
4万
查看次数

如何获取ShellExecute调用的exe的返回值

如何获取由shellexecute函数调用的exe的返回值.

ShellExecute(NULL, NULL, TEXT ( ".\\dpinstx86.exe" ), NULL, NULL, SW_SHOWNORMAL);
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我想要"dpinstx86.exe"的返回值.

c c++ api winapi shellexecute

14
推荐指数
1
解决办法
2万
查看次数

哪些原因可能导致ShellExecute失败?

我有一个VB6应用程序,使用以下命令打开文件及其关联的应用程序

ShellExecute(0, "open", filename, params, vbNullString, vbNormalFocus)
Run Code Online (Sandbox Code Playgroud)

这非常有效.

现在我有一个客户(使用Adobe Reader运行XP)无法使用上述命令打开任何PDF文件.但是从Windows资源管理器中双击它时,同一个文件正在打开而没有任何问题.我还测试了我的机器上的文件名/路径组合,以排除这些问题.

我正在寻找任何有关我可以检查以确保ShellExecute工作的提示.或者是什么导致ShellExecute以这种方式失败?

vb6 registry winapi file shellexecute

13
推荐指数
3
解决办法
2万
查看次数