Wir sind verpflichtet, ein ActiveX-Steuerelement von Drittanbietern zu verwenden.ActiveX-Steuerelement ohne Formular
Das einzige Problem ist, die Schicht in unserer Software ist eine Business-Schicht und hat keinen Zugriff auf ein Fenster oder ein Formular. Es läuft auch auf separaten Threads (und sollte von jedem Thread funktionieren), die nicht STA sind.
Anstatt unsere Trennung von UI von Business-Logik zu brechen, haben wir diese Abhilfe, damit es funktioniert:
Thread thread = new Thread((ThreadStart)
delegate
{
_myActiveX = new MyActiveXType();
_myActiveX.CreateControl();
//more initialize work
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Dann haben wir die Kontrolle verweisen müssen zu jeder Zeit, rufen wir _myActiveX.BeginInvoke()
oder Invoke()
.
Bei der Entsorgung dieser Klasse (Beenden unserer App), entsorgen wir die Steuerung und brechen den Thread ab.
Meine Frage ist, gibt es irgendwelche Probleme damit? Gibt es einen besseren Weg, damit umzugehen?
Gibt es eine bessere integrierte Möglichkeit, mit einem ActiveX-Steuerelement aus einer unbekannten Multithread-Umgebung zu arbeiten? Wir versuchen, unsere Klasse so zu schreiben, dass sie das Steuerelement umschließt, aber von jedem Thread funktioniert.
UPDATE: Als Antwort vorgeschlagen, würden wir lieber das Standard-COM-Objekt verwenden und überhaupt kein Steuerelement verwenden. Unser Problem dabei war, dass wir den Fehler "(Ausnahme von HRESULT: 0x8000FFFF (E_UNEXPECTED)") bei der ersten Methode oder Eigenschaft, die wir beim COM-Objekt aufrufen, erhalten. Dies ist ein ziemlich allgemeiner Fehler, den wir bei Verwendung von ActiveX nicht erhalten , irgendwelche Ideen
UPDATE:. Unser ocx ist "CX25.ocx", tlbimp.exe verwenden wir CX25Lib.dll bekommen Aximp.exe verwenden, erhalten wir AxCX25Lib.dll und CX25Lib.dll CX25Lib.dll funktioniert nicht. In beiden Fällen funktioniert AxCX25Lib.dll
Der obige Code, den ich erwähne, funktioniert. Hat jemand ein ActiveX-Steuerelement ohne ein Formular verwenden müssen? Oder hatte jemand Probleme mit dem Standard-COM-Objekt, aber bemerkte, dass ActiveX funktioniert? – jonathanpeppers
Haben Sie eine Lösung dafür gefunden? Ich würde vermuten, dass der richtige Ansatz davon abhängt, ob Sie Callbacks/Ereignisse von der Steuerung erwarten oder nicht, da es von einer Windows-Nachrichtenpumpe abhängen würde, mit ihnen umzugehen. – Tormod
Ja, der obige Code funktioniert. Wir verwenden es seit über einem Jahr ohne Probleme. Wir verwenden es auch mit mehreren COM-Bibliotheken. Wir haben es am Ende in eine Klasse eingepackt und Invoke/BeginInvoke implementiert, um mit dem Steuerelement, das benötigt wird, zu interagieren. – jonathanpeppers