2014-01-30 120 views
0

我想创建一个与德尔福的DLL,我设置了一些文件属性,但然后我想从工作目录运行.exe文件。 我试图与此代码德尔福执行应用

ShellExecute(Handle, 'open', 'start.exe', nil, nil, SW_SHOWNORMAL); 

运行exe文件,但我得到的错误: 未声明的标识符“句柄”。

未声明的标识符“SW_SHOWNORMAL”

什么是运行exe文件的最好方法?

回答

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; 
+0

以及如何在这种情况下使用CreateProcess函数? – Dany

+1

@Dany似乎是一个新问题? –

+0

@Dany我修改了我的答案以包含一个(未经测试的)CreateProcess示例。 –

4

一定要ShellAPI的添加到您单位的使用条款。

uses ShellApi; 

如果程序没有窗口句柄,第一个参数可以是0。

ShellExecute(0, 'open', ('start.exe'), nil, nil, SW_SHOW); 

“手柄”参数是不是在你的START.EXE程序

Procedure TForm1.StartEXE; 
begin 
ShellExecute(0, 'open', ('start.exe'), nil, nil, SW_SHOW); 
end; 

这将使您TForm1中的任何其他函数或过程人皆可访问的定义。

4

你在问题中描述的错误是:

未声明的标识符“句柄”

只有你知道哪些处理通过。如果您的应用程序没有窗口句柄,请将句柄传递给窗体或Application对象的句柄,或者甚至可以使用0

未声明的识别符 'SW_SHOWNORMAL'

即符号在Windows单元定义。您只需将该设备添加到您的uses列表中即可。