我想执行命令行工具来处理数据.它不需要阻止.我希望它是低优先级.所以我写了下面的内容
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;,应用运行正常.
Win 7/UAC让我发疯.
在我的C++应用程序中,我需要运行一个需要在Windows 7上提升的可执行文件.我想解决这个问题并等待它继续完成.最简单的方法是什么?
我通常会通过这种方式执行此类操作CreateProcess(),但对于需要提升的可执行文件,它会失败.
我尝试使用cmd.exe /c ...直通CreateProcess,它可以工作,但弹出一个丑陋的cmd终端窗口.
我正在阅读,这ShellExecute()将允许提升,但使用时等待exe完成似乎并不容易ShellExecute().像system()工作一样简单吗?
非常感谢任何其他想法!
我已经坚持了几个小时,直到我终于成功了.已有链接指向我正确的方向:
但我认为这个问题的简单概述可以帮助某人:).
我需要从Delphi软件执行Windows"find"命令.我试图使用该ShellExecute命令,但它似乎不起作用.在C中,我会使用该system程序,但在这里...我不知道.我想做这样的事情:
System('find "320" in.txt > out.txt');
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢你的答案:)我试图运行'查找'作为可执行文件,而不是作为cmd.exe的参数.
我已经设法在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来查看它.
在我的应用程序中,我可以通过编程方式打开资源管理器并使用以下代码选择文件:
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如何实现这一点,我很想知道它.
我正在使用第三方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.aspx 和 Process.Start与UAC的不同凭据
基于这一切,我得出结论,没有直接的方法来做到这一点.我错过了什么吗?这看起来真的不应该那么难.感觉UAC从未被设计用于处理非交互式用例.
如果有任何微软人员最终阅读此内容,我注意到ShellExecute内部处理提升的方式是通过调用应用程序信息服务(AIS).为什么通过某些Win32或.NET API不能同样调用AIS? http://msdn.microsoft.com/en-us/library/bb756945.aspx
抱歉,跑了一会儿.谢谢你的任何想法.
在我的程序中,我正在编写一封电子邮件,使用安装在用户计算机上的默认电子邮件客户端软件进行发送.
我已经写了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是如何工作的,如果它会这样做.
所以我的要求是:
将电子邮件发送到用户的邮件程序中.
允许一个或多个附件.
在XP上(即XP,Vista或7)使用任何Windows机器上的所有电子邮件客户端(希望如此).
有这样的动物吗?或者也许有人知道如何使用mailto/ShellExecute技术获取附件?
大多数人做什么?
编辑:
MAPI解决方案甚至是Indy解决方案都有一些答案. …
如何获取由shellexecute函数调用的exe的返回值.
ShellExecute(NULL, NULL, TEXT ( ".\\dpinstx86.exe" ), NULL, NULL, SW_SHOWNORMAL);
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我想要"dpinstx86.exe"的返回值.
我有一个VB6应用程序,使用以下命令打开文件及其关联的应用程序
ShellExecute(0, "open", filename, params, vbNullString, vbNormalFocus)
Run Code Online (Sandbox Code Playgroud)
这非常有效.
现在我有一个客户(使用Adobe Reader运行XP)无法使用上述命令打开任何PDF文件.但是从Windows资源管理器中双击它时,同一个文件正在打开而没有任何问题.我还测试了我的机器上的文件名/路径组合,以排除这些问题.
我正在寻找任何有关我可以检查以确保ShellExecute工作的提示.或者是什么导致ShellExecute以这种方式失败?
shellexecute ×10
winapi ×5
c++ ×4
uac ×3
delphi ×2
api ×1
attachment ×1
c ×1
c# ×1
command-line ×1
email ×1
explorer ×1
file ×1
mailto ×1
process ×1
registry ×1
vb6 ×1
visual-c++ ×1
windows ×1