/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
ShellExecute og lukke programmet igen?
Fra : Carsten Madsen


Dato : 04-06-01 17:47

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

mitbillede.bmp åbnes i MSPaint :
var
MyHWND : HWND;
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




 
 
carl (05-06-2001)
Kommentar
Fra : carl


Dato : 05-06-01 11:21

Har du prøvet med

TerminateProcess(MyHWND, 0);

Mvh Carl

"Carsten Madsen" <carstensm@hotmail.com> skrev i en meddelelse
news:3b1bb98a$0$4010$ba624c82@nntp01.dk.telia.net...
> Fra mit program åbner jeg et dokument/en fil i dens associerede program,
eks
> :
>
> mitbillede.bmp åbnes i MSPaint :
> var
> MyHWND : HWND;
> 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
>
>
>



Carsten Madsen (05-06-2001)
Kommentar
Fra : Carsten Madsen


Dato : 05-06-01 13:47

> TerminateProcess(MyHWND, 0);

Virker ikke.

Jeg tog fejl. Det er ikke en HWND, men en HINSTANCE-integer man får som
resultat af en ShellExecute. Iøvrigt kan jeg se at resultatet altid er 42 i
mit program, men jeg ved ikke hvordan jeg kan bruge det.

Jeg har stillet spørgsmålet i Eksperten http://www.eksperten.dk/spm/78660 :
<snip>
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...
</snip>

> > mitbillede.bmp åbnes i MSPaint :
> > var
> > MyHWND : HWND;
> > 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;




carl (05-06-2001)
Kommentar
Fra : carl


Dato : 05-06-01 15:11

Unskyld jeg havde ikke checket min kode ordenlig

Jeg bruger ShellExecuteEx for af få Thandle på programmet der startes

Her er et eksempel på hvordan jeg har brugt det

Mvh
Carl

//*******************************************************************
// shellexecute
// Input: file name (use extension to find job)
// Output: Processid
//
//*******************************************************************

function TJeJob.ShellExeFile(Name, Param: string; var Handle: THandle):
Integer;
var
sei: TShellExecuteInfo;
var
AssociatedProgram: string;
begin
try
FillChar(sei, sizeof(sei), 0);
sei.cbSize := sizeof(sei);
sei.fMask := SEE_MASK_NOCLOSEPROCESS;
sei.Wnd := Handle;
// First check for associated program this are nessesary to be able to
tramsfer parameter to script's
AssociatedProgram := GetProgramAssociation(ExtractFileExt(Name));
if AssociatedProgram <> '' then
begin
Param := Name + ' ' + Param;
Name := AssociatedProgram;
end else sei.lpVerb := StrNew(pchar('open'));
sei.lpFile := StrNew(pchar(Name));
sei.lpParameters := StrNew(pchar(Param));
sei.nShow := sw_Normal;
if ShellExecuteEx(@sei) then
begin
Handle := sei.hProcess;
Result := 0;
end
else begin
Handle := 0;
Result := GetLastError;
end;
finally
StrDispose(sei.lpVerb);
StrDispose(sei.lpFile);
StrDispose(sei.lpParameters);
end;
end;

"Carsten Madsen" <carstensm@hotmail.com> skrev i en meddelelse
news:3b1cd2af$0$191$ba624c82@nntp01.dk.telia.net...
> > TerminateProcess(MyHWND, 0);
>
> Virker ikke.
>
> Jeg tog fejl. Det er ikke en HWND, men en HINSTANCE-integer man får som

>
>



Carsten Madsen (05-06-2001)
Kommentar
Fra : Carsten Madsen


Dato : 05-06-01 19:13

> function TJeJob.ShellExeFile(Name, Param: string; var Handle: THandle):

Det er jo smukt

Tusind tak Carl, det virker med de programmer jeg har prøvet indtil videre -
både dokumenter og exe-filer.

Det er dog som om at Windows2000 ikke altid rigtig giver slip på filen lige
efter TerminateProcess(Handle, 0); hvis den startede fil er et program
(f.eks. Notepad).
Jeg kan nemlig ikke slette filen lige bagefter (jeg opretter en temporær fil
og bruger den i ShellExecuteEx() ) hvilket jeg har brug for. Efter ca. 5-10
minutter bliver filen dog frigivet, og jeg kan slette den igen. Jeg får
fejlen "Cannot delete <filnavn>: Access is denied. The source file may be in
use.". Jeg kan heller ikke overskrive filen i denne tilstand.

Jeg tror ideen er at jeg ikke skal kalde DeleteFile(<filnavn>) lige efter
TerminateProcess(), men hvornår ved jeg egentlig om filen ikke længere er
optaget??


Med venlig hilsen
Carsten



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste