我想使用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外部运行应用程序,它可以正常工作。
看起来调试器有话要对我说,但我不知道是什么。
答案 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年的广泛指针