2010-06-15 101 views
2

我想使用ShellExecute命令创建并打开一个txt文件。ShellExecute无法从IDE工作,但以其他方式工作

我已经使用这个代码多年,德尔福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

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

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

+0

就是这样!但我有这个选项检查多年!与Win 98和Win XP一起工作! 离开这个不是更好吗? 1+并标记为“接受”。 非常感谢。 – Ampere 2010-06-15 20:52:40

+0

显然,如果您要调试生成的进程,最好将其保留。那是你想要做的吗?如果您没有源代码或任何调试信息,那么您可能没有太多的工作要做,所以您最好不要关闭它,以免每个新进程都被打断。 – 2010-06-15 21:30:23

1

昨天我遇到了一个问题,调试器崩溃了我的应用程序,但在IDE之外运行它可以正常运行。我在开发中使用软件包。

我用process explorer来验证我发现我是从另一个位置加载一个副本比预期的。我有两份相同的BPL浮动。一旦我删除了一个我没有编译的版本,我很好。

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

+0

这可能是我的情况。我会查的。谢谢! – Ampere 2010-06-15 20:48:44

1

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

2

这不是你的问题(我投罗布肯尼迪&克里斯·桑顿)的答案,但你可以在更紧凑的方式编写程序:

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

注意指针()代替PChar类型( )为第四个参数。这是PChar/Pointer强制转换的记录行为(请参阅帮助)。

+0

谢谢!我想这样做,但我不确定它会起作用。由于时间不够,我选择了安全的方式。非常感谢! 1+ – Ampere 2010-06-15 20:50:36

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

+1 - 很好的一段代码 – Ampere 2011-01-19 16:09:30

0

ShellExecuteW解决我的问题(XE2/Win7的/ 32位)与 “调试子进程” 选项关闭 :) mybe因为字符串和pchar是从2010年的宽指针

相关问题