COM Aufruf Invoke, freeze des Client
-
Hallo,
ich habe eine VB ActiceX Komponente und möchte diese mit einem C++ Client starten. Das funktioniert grundsätzlich, jedoch wenn sich beim Starten der Mauszeiger auf dem C++ Clientfenster befindet, dann friert mir die Applikation ein. Die ActiveX Komponente kenne ich nicht so genau. Es sind aber wohl irgendwelche Tastenhooks implementiert. Wahrscheinlich verheddert sich dort die Nachrichentenschleife.
Wenn ich dann beim Freeze eine Taste drücke, dann funktioniert wieder alles.Nun aber zu meiner Frage, da ich euch die komplette Applikation schlecht posten kann.
Wenn ich in meinem Client folgendes mache, dannn gibt es keinen Freeze:
CString sCommand = "\"C:\\Program Files\\MyActiveX.exe\" MyParameter"; int iret = system(sCommand);Dann habe ich aber den Nachteil, dass ein CMD Fenster geöffnet wird und stehen bleibt.
Also mach ich das via COM:
HRESULT hr; IDispatch* IDispApp; CLSID clsid; hr = CoInitialize(NULL); hr = CLSIDFromProgID("MyActiveX.MyClass", &clsid); hr = CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IDispatch, (void**)&IDispApp); DISPID dispid; OLECHAR FAR* szFunction = (OLESTR)"MyFunc"; hr = IDispApp->GetIDsOfNames (IID_NULL, &szFunction, 1, LOCALE_USER_DEFAULT, &dispid); DISPPARAMS dpTypeString; VARIANT vString[1]; vString[0].vt = VT_BSTR; vString[0].bstrVal = sMyParameter; dpTypeString.cArgs = 1; dpTypeString.cNamedArgs = 0; dpTypeString.rgvarg = vString; hr = IDispApp->Invoke (dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dpTypeString, NULL, NULL, NULL); ...Der Invoke Aufruf lässt mir die Applikation einfrieren. Aber nur, wenn ich die Maus auf das C++ Clientfenster positioniere. Wenn der Mauszeiger sich auf dem VB ActiveX Fenster befindet, dann gibt es keinen Freeze.
Vielen Dank schonmal für eure Tipps.
-
Du hast hier zwei vollkommen unabhängige Dinge gemacht...
Einmal startest Du einen externen Prozess (das geht auch viel "schöner" mit "ShellExecute", und dann auch ohne Console) und beim zweiten Mal lädst Du Dir in *Deinen* Prozess ein ActiveX Control....Wenn es auf dem ersten Weg geht, dann nimm immer diesen. Verwende aber "ShellExecute" anstelle von "system".
-
myAppFreezed schrieb:
OLECHAR FAR* szFunction = (OLESTR)"MyFunc";Aua, das war ja wohl nix.
-
Jochen Kalmbach schrieb:
Du hast hier zwei vollkommen unabhängige Dinge gemacht...
Einmal startest Du einen externen Prozess (das geht auch viel "schöner" mit "ShellExecute", und dann auch ohne Console) und beim zweiten Mal lädst Du Dir in *Deinen* Prozess ein ActiveX Control....Wenn es auf dem ersten Weg geht, dann nimm immer diesen. Verwende aber "ShellExecute" anstelle von "system".
Vielen Dank, das ist auch schon die Lösung

Nur rein zum Verständniss; Mit COM Mechanismen sollte man doch auch einen externen Prozess starten können?!?Mox schrieb:
myAppFreezed schrieb:
OLECHAR FAR* szFunction = (OLESTR)"MyFunc";Aua, das war ja wohl nix.
Sorry, es handelt sich um einen gekürzten Codeauszug, den ich an der Stelle nicht ganz korrekt vereinfacht habe.
-
myAppFreezed schrieb:
Nur rein zum Verständniss; Mit COM Mechanismen sollte man doch auch einen externen Prozess starten können?!?
Aber Du startest den Prozess ja direkt und nicht via COM!