ShellExceute zmiana nazwy pliku test.exe -> test.dat

0

Ta procedura działa:

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

A ta nie działa:

ShellExecute(0,'open', PCHAR('test.dat'), nil , nil, SW_SHOW);

Zna ktoś jakiś trik jak uruchomić program exe z innym rozszerzeniem?

PS. Kopiowanie, zamiana nazw plików (rozszerzeń), późniejsze ich usuwanie - to to wiem jak zrobić więc proszę o tym nie pisać.

WinExec -> działa ale ma wadę że po uruchomieniu czeka na odpowiedź od uruchomianego programu. A program który uruchamiam zamyka aplikację ją uruchamiającą i w przypadku WinExec mamy zawieszenie. Natomiast ShellExecute działa idealnie.

0
WinExec('test.dat', SW_NORMAL);
0

Załączam sprawdzoną i przetestowaną procedurę.

function WinExec32(FileName: string; Visibility: integer; DoWait : boolean = false ): integer;
var
  zAppName: array[0..512] of char;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  Res : DWORD;
begin
  StrPCopy(zAppName, FileName);
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  if CreateProcess (nil,zAppName,nil,nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                    nil,nil,StartupInfo,ProcessInfo) then
  begin
    if DoWait then
    begin
      WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess, Res);
      Result:=Res;
    end
    else begin
      Result:=0;
    end;
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end
  else begin
    Result := -1
  end;
end;
0

Lazarus posiada fajną klasę TProcess dla tego typu rzeczy, Delphi nie posiada żadnego odpowiednika? :P

0
Patryk27 napisał(a):

....Delphi nie posiada żadnego odpowiednika? :P

Niestety nie :(, też to już przerabiałem, zamiast TProcess wykorzystuje TDosCommand plus pewne modyfikacje :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1