04. juni 2001 - 18:59Der 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?
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\"
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...
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...
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;
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?
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.
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.
carstensm >> læs i din online hjælp der står en masse om sådan noget.
Jens B
Synes godt om
Ny brugerNybegynder
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.