【发布时间】:2014-05-27 15:24:35
【问题描述】:
我正在尝试从 Codegear Delphi 2007 中编写的代码启动可执行文件。我已经成功地这样做了,但是一旦启动可执行文件(这是一个 winforms 应用程序),它就不会启动它的 Task被编程为。
这是我用来从 Delphi 启动进程的代码:
procedure TfrmMain.OpenDatabase1Click(Sender: TObject);
var filename: string;
var parameters: string;
var
sei: TShellExecuteInfo;
ExitCode: DWORD;
begin
if (OpenDatabaseDialog.Execute)then begin
//Connect to mysql, check for new data and insert data into sdb file before opening.
filename := 'C:\mysqlhelper\SSOAP Mysql Helper.exe';
parameters := '"' + OpenDatabaseDialog.FileName + '"';
ZeroMemory(@sei, SizeOf(sei));
sei.cbSize := SizeOf(TShellExecuteInfo);
sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb := PChar('runas');
sei.lpFile := PChar(filename); // PAnsiChar;
if parameters <> '' then
sei.lpParameters := PChar(parameters); // PAnsiChar;
sei.nShow := SW_SHOWNORMAL; //Integer;
if ShellExecuteEx(@sei) then begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(sei.hProcess, ExitCode) ;
until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
end;
OpenDatabase(OpenDatabaseDialog.Filename);
end;
end;
这是 C# 中的代码,可以作为独立运行良好:
public Form1()
{
InitializeComponent();
//get command line arguments (should be ssoap database filename
string[] args = Environment.GetCommandLineArgs();
//open connections
OpenMySQLConnection();
OpenAccessConnection(args[1]);
//init the lists for FM's and RG's
flowMeters = new List<FlowMeter>();
rainGauges = new List<RainGauge>();
Task t = new Task(new Action(DoWork));
t.Start();
}
我已经调试到我只是觉得Task 没有启动。我在整个过程中都放置了MessageBox.Show() 点,它弥补了它的t.Start(); 部分。
澄清一下,我的问题是,我到底为什么可以启动可执行文件,给它预期的参数,而它只是不启动Task?
【问题讨论】:
-
是什么让您认为
Task没有执行?向我们展示DoWork方法 -
在调用执行任务之前放置
MessageBox.Show("Blah")。与DoWork()方法的第一行相同的放置不起作用。该方法太大,无法在此处发布,我认为此时它无关紧要。 -
我不太喜欢你在 Delphi 程序中的繁忙循环,但这是你的问题。同样,您泄漏的进程句柄。我想知道当您独立运行 C# 应用程序时如何启动它。我相信您使用“以管理员身份运行”来匹配您从 Delphi 程序启动它的方式。
-
好吧,我对 Delphi 很陌生,这是我能够找到等待另一个程序执行完成的唯一方法。我完全愿意接受更好的做法的建议。是的,我既以管理员身份运行,又以正常身份运行。结果相同。
-
那你为什么用
runas呢?