我正在尝试使用delphi创建一个dll,我设置了一些文件属性,但后来我想从工作目录运行一个.exe文件。 我试图用这段代码运行exe文件
ShellExecute(Handle, 'open', 'start.exe', nil, nil, SW_SHOWNORMAL);
但我得到错误: 未声明的标识符'Handle'。
未声明的标识符'SW_SHOWNORMAL'
运行exe文件的最佳方法是什么?
答案 0 :(得分:4)
请务必将ShellApi添加到Unit的使用条款中。
uses ShellApi;
如果程序没有窗口句柄,则第一个参数可以为0.
ShellExecute(0, 'open', ('start.exe'), nil, nil, SW_SHOW);
您的start.exe过程中未定义“Handle”参数
Procedure TForm1.StartEXE;
begin
ShellExecute(0, 'open', ('start.exe'), nil, nil, SW_SHOW);
end;
这将使其可以通过TForm1中的任何其他功能或程序进行普遍访问。
答案 1 :(得分:4)
您在问题中描述的错误是:
未声明的标识符'处理'
只有你知道要传递哪个句柄。如果您的应用程序没有可用的窗口句柄,则将句柄传递给表单或Application
对象的句柄,或者甚至是0
。
未声明的标识符'SW_SHOWNORMAL'
该符号在Windows
单位中定义。您只需将该单元添加到uses
列表中即可。
答案 2 :(得分:0)
将Windows
单位添加到进行此调用的单元的实现子句中,程序将编译。虽然CreateProcess
函数在这种情况下是更好的选择。像这样的事情(没有经过测试,并且不在我的头顶): -
Procedure ExecNewProcess(Const ProgramName : String; pWait : Boolean);
Var
lOK : Boolean;
lStartInfo : TStartupInfo;
lProcInfo : TProcessInformation;
Begin
FillChar(lStartInfo, SizeOf(TStartupInfo), #0);
FillChar(lProcInfo, SizeOf(TProcessInformation), #0);
lStartInfo.cb := SizeOf(TStartupInfo);
lOK := CreateProcess(Nil, PChar(ProgramName), Nil, Nil, False,
CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, Nil, Nil, lStartInfo, lProcInfo);
If lOK Then
Begin
If pWait Then
WaitForSingleObject(lProcInfo.hProcess, INFINITE);
End
Else
ShowMessage('Unable to run ' + ProgramName);
CloseHandle(lProcInfo.hProcess);
CloseHandle(lProcInfo.hThread);
End;