Avatar billede carstensm Nybegynder
04. juni 2001 - 18:59 Der er 9 kommentarer og
1 løsning

ShellExecute og lukke programmet igen?

Fra mit program åbner jeg et dokument/en fil i dens associerede program, eks
:

mitbillede.bmp åbnes i MSPaint  :
var
    MyHINST : longint;
begin
    MyHWND := ShellExecute(0, nil, \'C:\\mitbillede.bmp\', nil, nil, 0);
    ...
//Senere vil jeg gerne kunne lukke programmet (eller blot dokumentet), men
følgende virker ikke :
    ...
    PostMessage(MyHWND, WM_QUIT, 0, 0);
end;

Kan jeg ikke bruge MyHWND?
Hvordan får jeg det til at virke?

MVH
Carsten
Avatar billede ziron Nybegynder
05. juni 2001 - 10:55 #1
jeg menere ikke at man kan få et handle for det man åbener, men du kan gøre det sådan...

procedure TForm1.aabenClick(Sender: TObject);
begin
Shellexecute(handle, \'OPEN\', pchar(\'c:\\\'C:\\mitbillede.bmp\'), nil, nil, SW_SHOW);
end;

procedure TForm1.lukClick(Sender: TObject);
var
pro : HWND;
begin

pro := FindWindow(nil, pchar(\'mitbillede.bmp - Paint\'));

If pro <> 0 Then
  begin
    SendMessage(pro, WM_SYSCOMMAND,SC_CLOSE,0);
  end
else
  begin
    showmessage(\'Billed er ikke åben.\');
  end


end;

/ZIRON
Avatar billede carstensm Nybegynder
05. juni 2001 - 13:55 #2
Nu er det ikke det samme dokument jeg vil åbne hver gang, og heller ikke det samme program.

Den løsning jeg har fundet er at bruge EnumWindows() og så lede efter dokumentets navn i titlen på alle vinduer, hvorefter jeg lukker det som Ziron foreslog. MEN hvis dokumentets navn ikke står i titlen virker det jo ikke.

Kan resultatet fra en ShellExecute overhovedet ikke bruges til noget som helst??? Det er en integer-værdi som kaldes HINSTANCE. Her er hvad Win32 Programmers Reference siger om ShellExecute:

\"If the function succeeds, the return value is the instance handle of the application that was run, or the handle of a dynamic data exchange (DDE) server application.
If the function fails, the return value is an error value that is less than or equal to 32\"

Burde have et formål...

Carsten
Avatar billede ziron Nybegynder
05. juni 2001 - 14:02 #3
carstensm >> jeg ved ikke helt om man kan bruge det til noget... men du kan i vært gøre det andet, det var nok hvad jeg vil gøre sådan lige umelbart...

/ZIRON
Avatar billede carstensm Nybegynder
05. juni 2001 - 14:43 #4
Jeg kan se at resultatet (HINSTANCE) af en ShellExecute altid er 42 i mit program, uanset hvilket dokument eller applikation der startes.
Så det kan altså ikke være en pegepind til applicationen der startes, men måske en pegepind til mit eget program - jeg ved det ikke...

Carsten
Avatar billede ziron Nybegynder
05. juni 2001 - 14:47 #5
hmmm... jeg ved det faktisk ikke helt, kan prøve at lege lidt med det lidt senere...

/ZIRON
Avatar billede borrisholt Novice
06. juni 2001 - 09:47 #6
Du kan ikke bruge ShellExecute til dit formål. Du skal BBruge CreateProcess, ellers har du ikke styr på en skid ....

prøv den her :

function ExecAndWait(Filename, Parameter: string; nCmdShow: integer): longword;
var
    zAppName: array[0..max_path] of char;
    zParameter: array[0..max_path] of char;
    zCurDir: array[0..max_path] of char;
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
begin
  StrPCopy(zAppName,FileName);
  StrPCopy(zParameter,Parameter);
  StrPCopy(zCurDir,GetCurrentDir());
  FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  StartupInfo.cb:=Sizeof(StartupInfo);
  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow:=nCmdShow;
  if not CreateProcess(zAppName,zParameter,nil,nil,false,CREATE_NEW_CONSOLE or  NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo) then
    Result:=0
    else
    begin
      WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
      GetExitCodeProcess(ProcessInfo.hProcess,Result);
    end;
end;


og kald den fx. sådan her :

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName : TFileName;
begin
  FileName := \'C:\\C++\\Skellet\\Release\\Skellet.exe\';
  ExecAndWait(FileName,\'\', sw_normal);
  Caption :=  FileName + \' done executing\';
end;


Jens B
Avatar billede carstensm Nybegynder
06. juni 2001 - 18:27 #7
OK, nu har jeg et handle til processen.
Kan man stoppe processen på anden vis end TerminateProcess(hProcess, 0), da den er lidt for destruktiv iflg. Win32?
Avatar billede borrisholt Novice
07. juni 2001 - 08:16 #8
ja du kan bruge ExitProcess()

fra MSDN :

ExitProcess
The ExitProcess function ends a process and all its threads.

VOID ExitProcess(
  UINT uExitCode  // exit code for all threads
);
Parameters
uExitCode
[in] Specifies the exit code for the process, and for all threads that are terminated as a result of this call. Use the GetExitCodeProcess function to retrieve the process\'s exit value. Use the GetExitCodeThread function to retrieve a thread\'s exit value.
Return Values
This function does not return a value.



Jens B
Avatar billede carstensm Nybegynder
07. juni 2001 - 09:44 #9
ExitProcess skal køres inde fra det program der skal lukkes(som jeg har forstået det) - jeg skal have mulighed for at lukke programmet (f.eks. Notepad) udefra.

Carsten
Avatar billede borrisholt Novice
07. juni 2001 - 17:50 #10
carstensm >> læs i din online hjælp der står en masse om sådan noget.

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester