Toon posts:

[CBuilder] automatisch programma starten

Pagina: 1
Acties:
  • 58 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik heb een aantal tips/oplossingen nodig..

Ik wil graag een verbinding maken tussen 2 programma's op 1 computer. (doormiddel van een doorgelusde compoort)
Het ene programma1 stuurt programma2 aan en programma1 moet programma2 opstarten als deze nog niet actief is:

vraag 1: Heeft iemand hier tips over. Het path van het programma wordt opgehaald maar hoe voer je de .exe uit?

Verder kan het voorkomen dat programma2 vastloopt. Wanneer dit gebeurd moet ik programma2 kunnen "killen". Ik weet dat ik daarvoor handle's moet gebruiken.

vraag 2 heeft iemand hier tips over handle's die ik kan gebruiken?

Alvast Bedankt!!

Greetz

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

antwoord 1: ShellExecute of WinExec of CreateProcess

antwoord 2: handle van de top level window of het process of de thread.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Owke ik ben bezig met createProcess omdat die waarschijnlijk de beste is.
ik heb de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
       // filePath is een variabele die de gehele path bevat (mijn geval D:\simulatieprog\winnie.exe)


        STARTUPINFO si;
        PROCESS_INFORMATION pi;

        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );

        // Start the child process.
        if( !CreateProcess(NULL, // No module name (use command line).
                "\+filePath",       // Command line.
                NULL,             // Process handle not inheritable.
                NULL,             // Thread handle not inheritable.
                FALSE,            // Set handle inheritance to FALSE.
                0,                // No creation flags.
                NULL,             // Use parent's environment block.
                NULL,             // Use parent's starting directory.
                &si,              // Pointer to STARTUPINFO structure.
                &pi )             // Pointer to PROCESS_INFORMATION structure.
          )
        {
                Application->MessageBox("Could Not Open Program!","",0);
        }

        // Wait until child process exits.
        WaitForSingleObject( pi.hProcess, INFINITE );

        // Close process and thread handles.
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );


Alleen 1 probleem: het programma start niet op!! waarom niet???
please help?

Greetz

  • Thijsch
  • Registratie: Februari 2002
  • Laatst online: 22-08 19:17
zet er even [code][/code] omheen :)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

CreateProcess kan waatschijnlijk wel technisch het meest. Maar over het algemeen is ShellExecute makkelijker en meer dan genoeg.

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 06 november 2002 @ 15:57:
Owke ik ben bezig met createProcess omdat die waarschijnlijk de beste is.
ik heb de volgende code:

[code]
if( !CreateProcess(NULL, // No module name (use command line).
"\+filePath", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
"\+filePath", // Command line.
Dat lijkt me niet de bedoeling. Of heet je programma \+filepath? :p

Maar nogmaals, ik zou het eerst eens met een ShellExecute proberen

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
die filePath is een variable die het volledige path bevat waar het programma staat!
het programma heet winnie.exe en staat in d:\simulatieproggie

dan: filePath = D:\Simulatieprggie\winnie.exe

dit moet ik dan toch kunnen gebruiken?

P.s Die filePath variable is een AnsiString en dat moet volgens builder een const char zijn..

wa doe ik nou verkeerd?
Heb zelfde probleem met shellexecute

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

lees eerst eens wat je zelf typt: "\+filePath"
Bekijk het eens in de debugger of do ShowMessage("\+filePath"); en wat zie je dan?

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
owke ik ben er inderdaad achter dat "\+filePath" niet het goede path gaf maar gewoon die string. Nu heb ik gewoon filePath er staan:
code:
1
ShellExecute(handle, "open", filePath, NULL, NULL, SW_SHOWNORMAL);


alleen nu krijg ik de melding:

cannot convert AnsiString to const char.

hoe los ik dat op dan?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Tis een beetje basic, maar probeer eens filePath.c_str(); // of iets in die trand...

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
owke heel erg bedankt!

Het is me inmiddels gelukt om het gewenste programma op te starten! dat was inderdaad niet zo moeilijk maar ik heb het idee dat het automatisch afsluiten van het programma iets meer problemen op gaat leveren.
Ondertussen ben ik met een closehandle aan het stoeien geweest.

Wat is nu de beste manier om programma2 vanuit programma1 volledig af te sluiten??
(waarschijnlijk zal dit op dezelfde manier moeten als de ctrl-alt-del functie)
welke handle zouden jullie gebruiken (eventueel hoe?)?

greetz

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Wat maakt het uit welke handle het is? CloseHandle lijkt mij niet de manier iig. Het gaat er toch om hoe je een process netjes afsluit. Welke en of je een handle daarvoor nodig hebt is bijzaak toch?

Zoek even op deze woorden in volgorde van voorkeur: WM_CLOSE, SC_CLOSE, TerminateProcess, TerminateThread

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Owke ik heb de terminateprocess gebruikt maar het werkt weer eens niet.
Zelfs mijn stage begeleider weet niet waarom !!

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/******************************************************************************/
/*            Start een applicatie met de meegegeven filePath.                */
/******************************************************************************/
void TInterfaceForm::StartApplication(AnsiString filePath)
{
        hProcess = ShellExecute(hProcess, "open", filePath.c_str(), NULL, NULL, SW_SHOWNORMAL);
}
/******************************************************************************/
/*            De Child Applicatie dient afgesloten te worden.                 */
/******************************************************************************/
AnsiString TInterfaceForm::TerminateApplication()
{
        TerminateProcess(hProcess,0);
}


waarom werkt dit niet????

greetz

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LordLarry schreef op 06 november 2002 @ 16:05:
CreateProcess kan waatschijnlijk wel technisch het meest. Maar over het algemeen is ShellExecute makkelijker en meer dan genoeg.
Mmmm ShellExecute kan technisch veeeeeeeel meer dan CreateProcess. Probeer jij maar eens een JPEG of CPP file in CreateProcess te stoppen :z

Alleen op securitygebied is CreateProcess een stuk rijker.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 07 november 2002 @ 10:59:
Owke ik heb de terminateprocess gebruikt maar het werkt weer eens niet.
Zelfs mijn stage begeleider weet niet waarom !!
<...knip...>
waarom werkt dit niet????
Omdat je de documentatie weer eens niet hebt gelezen? Bij ShellExecute staat namelijk duidelijk:
To obtain information about the application that is launched as a result of calling ShellExecute, use ShellExecuteEx.
ShellExecute geeft een HINSTANCE terug, en het is onzin om die in TerminateProcess te stoppen want die verwacht een process-handle. Kijk dus eens bij ShellExecuteEx, en dan vooral naar de member hProcess van de SHELLEXECUTEINFO struct.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Oh en voor netjes afsluiten zou ik echt niet TerminateProcess gebruiken.... wellicht dat je eens naar LordLarry zou kunnen luisteren en WM_CLOSE gebruiken.

Hints: EnumWindows, GetWindowThreadProcessId, PostMessage.

Overigens gebruik de search eens, ik heb hier al eens oplossingen voor aangedragen.

Professionele website nodig?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

De handle die je van ShellExecute terugkrijgt is geen Process Handle die je voor TerminateProcess nodig hebt, maar een Instance of Application Handle.

Je zou de Instance Handle om kunnen zetten naar een Process Handle (ingewikkelde code), toch met CreateProcess of ShellExecuteEx een process starten of met FindWindow(Ex) het juiste top level window vinden.

TerminateProcess is ook wel erg drastisch. Beter is gewoon het aan de applicatie vragen of ie zichzelf wil sluiten.

PS: WM_QUIT, ExitProcess zijn nog wat functies om een process af te sluiten. En WinExec is nog een manier om een process te starten die ik nog niet had genoemd.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
Het programma wat ik wil afsluiten is ergens een simulatie van! om de apparaten te testen. Het kan dus nogal voorkomen dat deze applicatie een error krijgt en daardoor niet meer reageert. Daarom wil ik hem dus wel kunnen killen!

Dat is het belangrijkste! En als ik het eenmaal voor elkaar heb dat hij kan killen dan denk ik dat het ook niet moeilijk meer is om te implementeren dat hij eventueel ook "netjes" afgesloten kan worden ;)

Verwijderd

Topicstarter
Sorry maar ik kom er echt niet uit!
Ik heb nu de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HANDLE StartSimulation(AnsiString filePath)
{
  STARTUPINFO           si;
  PROCESS_INFORMATION   pi;
  HANDLE                hProcess;

  // Initialize the STARTUPINFO structure.
  memset(&si, 0, sizeof(si));
  si.cb = sizeof(si);
  CreateProcess(
  NULL,                     // pointer to name of executable module
  filePath.c_str(),    // pointer to command line string
  NULL,                     // pointer to process security attributes
  NULL,                     // pointer to thread security attributes
  FALSE,                    // handle inheritance flag
  0,                        // creation flags
  NULL,                     // pointer to new environment block
  NULL,                     // pointer to current directory name
  &si,                      // pointer to STARTUPINFO
  &pi                       // pointer to PROCESS_INFORMATION
  );

  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION  |
                         PROCESS_TERMINATE          |
                         SYNCHRONIZE , 0, pi.dwProcessId);

  return hProcess;

}

En voor het afsluiten:
[code]
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
[\code]

Kunnen jullie misschien iets duidelijker zijn want met die instructie's op MSDN kom ik ook niet echt verder!!

PLEASE??

greetz

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ik zal het nog een keer zeggen: HIER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Professionele website nodig?


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

zie curry

Doet iets met Cloud (MS/IBM)

Pagina: 1

Dit topic is gesloten.