ShellExecute无法在IDE中运行,但在其他方面有效

时间:2010-06-15 19:02:32

标签: delphi

我想使用ShellExecute命令创建然后打开一个txt文件。

我已经使用这段代码多年来使用Delphi 7并且它有效:

function Executa(CONST ExeName, Parameters: string): Boolean;
begin
 if Parameters= ''
 then Result:= ShellExecute(0, 'open', PChar(ExeName), NIL              , nil, SW_SHOWNORMAL)> 32
 else Result:= ShellExecute(0, 'open', PChar(ExeName), PChar(Parameters), nil, SW_SHOWNORMAL)> 32;
end;

现在,我切换到Windows 7,当它从IDE运行时代码不再工作。 Delphi显示CPU窗口,标题为“CPU-Process unknown(2352)”。我关闭CU窗口,一切正常,直到我关闭应用程序,当Delphi再次显示CPU窗口时。 如果我从IDE外部运行应用程序,它可以正常工作。

看起来调试器有话要对我说,但我不知道是什么。

6 个答案:

答案 0 :(得分:6)

听起来就像你打开了“debug spawned processes”选项一样。启用后,调试器会尽早中断新进程。按“运行”按钮让它继续运行。

您可以在下次调试程序时确认此假设。将进程ID(在您的示例中为2352)与任务管理器显示的进程列表进行比较。该列表中的哪个进程与调试器报告的进程ID匹配?

答案 1 :(得分:2)

这不是你问题的答案(我投票给Rob Kennedy& Chris Thornton),但你可以用更紧凑的方式编写你的日常工作:

function Executa(const ExeName, Parameters: string): Boolean;
begin
  Result := 
    (ShellExecute(0, 'open', PChar(ExeName), Pointer(Parameters), nil, SW_SHOWNORMAL) > 32);
end;

注意第4个参数的指针()而不是PChar()。这是PChar / Pointer强制转换的记录行为(请参阅帮助)。

答案 2 :(得分:1)

我昨天遇到问题,调试器崩溃了我的应用程序,但是在IDE外面运行它会运行正常。我在开发中使用了包。

我使用process explorer来验证我发现我正在从另一个位置加载一个比预期更多的副本。我有两份相同的BPL副本。一旦我删除了我没有编译的那个我就没事了。

将此应用于此问题,我会检查以确保您没有包含以下内容的编译代码的任何副本:.DCU,.DCP,.BPL,.EXE。然后我还要确保你可以按住“ShellExecute”来查看声明。您可能以无法找到源的方式设置库路径。

答案 3 :(得分:1)

在黑暗中拍摄,但尝试以管理员身份运行IDE,然后不以管理员身份运行IDE。这可能是一个因素。某些用户使用管理员选项集创建快捷方式,以便自动更新成功运行。因此,您可能正在以管理员身份运行IDE,如果您已经这样做了。

答案 4 :(得分:1)

同样,我通过将ShellExecute替换为以下内容来解决它:

function TformMain.CreateProcessSimple(
  sExecutableFilePath : string )
    : string;

function GetExeByExtension(sExt : string) : string;
var
   sExtDesc:string;
begin
   with TRegistry.Create do
   begin
     try
       RootKey:=HKEY_CLASSES_ROOT;
       if OpenKeyReadOnly(sExt) then
       begin
         sExtDesc:=ReadString('') ;
         CloseKey;
       end;
       if sExtDesc <>'' then
       begin
         if OpenKeyReadOnly(sExtDesc + '\Shell\Open\Command') then
         begin
           Result:= ReadString('') ;
         end
       end;
     finally
       Free;
     end;
   end;
end;
var
  pi: TProcessInformation;
  si: TStartupInfo;
  fapp: string;
begin
  fapp:=GetExeByExtension(ExtractFileExt(sExecutableFilePath));
  FillMemory( @si, sizeof( si ), 0 );
  si.cb := sizeof( si );
  if Pos('%1',fApp)>0 then begin
    sExecutableFilePath:=StringReplace(fapp,'%1',sExecutableFilePath,[rfReplaceAll]);
  end else begin
    sExecutableFilePath:=fApp+' "'+sExecutableFilePath+'"';
  end;
  CreateProcess(
    Nil,

    // path to the executable file:
    PChar( sExecutableFilePath ),

    Nil, Nil, False,
    NORMAL_PRIORITY_CLASS, Nil, Nil,
    si, pi );

  // "after calling code" such as
  // the code to wait until the
  // process is done should go here  

  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );
end;

答案 5 :(得分:0)

ShellExecuteW解决了我的问题(XE2 / Win7 / 32bit),关闭了“debug spawned processes”选项 :) mybe因为字符串和pchar是2010年的广泛指针