ShellExecute und auf Ende warten
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
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.