ShellExecute und auf Ende warten
-
Hi!
Ich muss beim Programmstart eine OCX registrieren (mit ShellExecute regsvr32 aufrufen). Mein Problem ist jetzt, dass das Programm weiterläuft und ich 'nen Fehler krieg, dass die OCX (noch) nicht registriert ist. Wie schaff ich es, dass das Programm erst weiterläuft, wenn die OCX registriert ist?
-kaljinka-
-
Hallo
indem du statt ShellExecute() ShellExecuteEx() benutzt, und auf das Prozeßende mit WaitForSingleObject() wartest.
bis bald
akari
-
Danke erstmal!
Ich hab des jetzt mit dem SHELLEXECUTEINFO versucht, brauch ich ja für ShellExecuteEx oder? Ich krieg aber ne Zugriffsverletzung, wenn ich die Werte zuweisen will. Wie schreib ich des richtig?
-kaljinka-
-
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.