ShellExecute und auf Ende warten



  • Zeig doch einfach mal wie du das bisher machst...



  • Hi!

    Ich hab nach der Funktion gegoogelt, aber nur Delphi-Code gefunden, und da kenn ich mich nicht besonders gut aus.

    Mein Versuch:

    LPSHELLEXECUTEINFO lpExecInfo;
    HWND h;
    lpExecInfo->cbSize = sizeof(lpExecInfo);
    lpExecInfo->fMask = SEE_MASK_NOCLOSEPROCESS;
    lpExecInfo->hwnd = GetActiveWindow();
    lpExecInfo->lpVerb = "open";
    lpExecInfo->lpFile = "C:\\Windows\\notepad.exe";
    lpExecInfo->lpParameters = 0;
    lpExecInfo->nShow = SW_SHOW;
    lpExecInfo->hInstApp = h;
    ShellExecuteEx(lpExecInfo);
    

    Die Zugriffsverletzung kommt gleich in der dritten Zeile. Was stimmt daran nicht?

    -kaljinka-



  • LPSHELLEXECUTEINFO lpExecInfo; wäre dasselbe wie SHELLEXECUTEINFO *lpExecInfo;
    LP steht für Large Pointer. Du hast somit lediglich einen Zeiger irgendwohin 😉
    Du musst noch Speicher für die Struktur reservieren 😉

    // Entweder so, dann wird von alleine Speicher geholt:
    SHELLEXECUTEINFO ExecInfo;
    // ...und dann so drauf zugreifen:
    ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO );
    // ...etc...
    ShellExecuteEx(&ExecInfo);
    
    // ...oder z.B. selber Speicher holen:
    LPSHELLEXECUTEINFO lpExecInfo;
    lpExecInfo=(SHELLEXECUTEINFO*)malloc( sizeof(SHELLEXECUTEINFO) );
    lpExecInfo->cbSize = sizeof(lpExecInfo);
    // ...etc...
    ShellExecuteEx(lpExecInfo);
    // ...Speicher dann auch wieder freigeben:
    free(lpExecInfo);
    


  • Hi!

    Danke! Eigentlich logisch... wenn man's weiß.

    Okay, hab's jetzt in das Programm rein, wo's eigentlich reingehört. Die Registrierung funktioniert auch, aber er wartet nicht!

    Schaut jetzt so aus:

    SHELLEXECUTEINFO ExecInfo;
    HWND h;
    ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ExecInfo.hwnd = GetActiveWindow();
    ExecInfo.lpVerb = "open";
    ExecInfo.lpFile = "regsvr32.exe";
    ExecInfo.lpParameters = "/s cfx32.ocx";
    ExecInfo.nShow = SW_SHOW;
    ExecInfo.hInstApp = h;
    ShellExecuteEx(&ExecInfo);
    WaitForSingleObject(h, 3600);
    

    Was stimmt denn jetzt schon wieder nicht?

    -kaljinka-



  • versuchs mal so:

    SHELLEXECUTEINFO ExecInfo;
    
    ExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ExecInfo.hwnd = GetActiveWindow();
    ExecInfo.lpVerb = "open";
    ExecInfo.lpFile = "regsvr32.exe";
    ExecInfo.lpParameters = "/s cfx32.ocx";
    ExecInfo.nShow = SW_SHOW;
    ExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ExecInfo);
    WaitForSingleObject(ExecInfo.hProcess, 3600);
    


  • danke! Funktioniert jetzt, aber nur wenn ich

    HWND h;
    //.....
    ExecInfo.hInstApp = h;
    

    drin lass. Bei

    ExecInfo.hInstApp = NULL;
    

    krieg ich ne Zugriffsverletzung. Ich brauch des h für nix...

    -kaljinka-



  • @Kaljinka, ich hatte letzte Woche einen ähnlichen Fall. Ich hab es jedoch mit CreateProcess gelöst. Anschließend kannst du prüfen ob der Prozess immer noch läuft.



  • Hi!

    Danke für deinen Tip! Ich schmeiß des halt jetzt nur ungern wieder raus, nachdem's eigentlich funktioniert... Macht des irgendwelche Unterschiede, Probleme, etc., wenn h drinnen bleibt?

    -kaljinka-



  • Warum registrierst du das OCX nicht direct durch dein Programm.
    Einfach LoadLibrary() und anschliessend DllRegisterServer().
    Mehr macht regsvr32 auch nicht. 😉



  • Hört sich gut an! LoadLibrary denk ich, is mir klar, aber wie funktioniert DllRegisterServer ?

    -kaljinka-



  • Die Dll dessen DllRegisterServer() du aufrufst legt die passenden Registry-Einträge etc. an...



  • Was DllRegisterServer macht, is mir schon klar. Aber wir ruf ich's auf? Mein BCB 5 kennt die Funktion nicht. 😕


Anmelden zum Antworten