Fragensteller
COM-Exception

Allgemeine Diskussion
-
Hallo NG,
ich teste eine Demo-Applikation eines Drittanbieters um einen Client via Active-X Technologie einzubinden.
Das entsprechende OCX ist definitiv erfolgreich registriert, die OCX-ClientLib ist als Reference im Demo-Projekt und es läßt sich einwandfrei überetzen.
Nach dem Start des Demo-Projekts und dem Aufruf der ClientLib-Methode "Initialize" erscheint jedoch jedesmal folgende COM Exception:
"Ausnahmefehler aufgetreten. (Ausnahme von HRESULT: 0x80020009 (DISP_E_EXCEPTION))".
Ich habe schon viel gegoogelt, jedoch nichts passendes gefunden.
Was läuft hier schief?
Vielen Dank im Voraus für Tipps und Hinweise.
- Typ geändert Robert BreitenhoferModerator Donnerstag, 19. Juli 2012 09:50 Keine Rückmeldung des Fragenstellender
Alle Antworten
-
Hallo myamaedus,
Handelt es sich um ein ActiveX-Control? Hat die Drittherstellerkomponente eine Benutzeroberfläche? - Wenn ja, dann reicht das Referenzieren nicht. Man muss das Control via Toolbox hinzufügen.
Gewusst wie: Hinzufügen von ActiveX-Steuerelementen zu Windows Forms
Using ActiveX Controls with Windows Forms in Visual Studio .NET
Gruß
Marcel
-
Hallo Marcel,
danke für die Antwort.
>Handelt es sich um ein ActiveX-Control?
Nein, sieht nicht danach aus. Es läßt sich der toolbox nicht hinzufügen, da es unter den "COM Components" gar nicht auftaucht.
Wenn ich es über "Browse" versuche, kommt die Fehlermeldung
"Self-registering for ......ocx" failed"
Ist wohl kein ActiveX-Control sondern nur eine ActiveX-Componente.
Gruß, myamadeus.
-
Hi,
1. Hast Du versucht, die (vermutlich native) Komponente über regsvr32 selber zu registrieren.
2. Gibt es ein Handbuch zur Komponente? Vielleicht verwendest Du die Komponente nicht wie angedacht, z.B. fehlende Lizenz-Datei, -Key usw.
3. Wird beim Hinzufügen der Referenz überhaupt eine .NET Wrapper-Assembly generiert?
4. Hast Du in der Ereignisanzeige eine detaillierte Fehlermeldung stehen?
5. Führst Du die Host-Anwendung als Administrator aus?
6. Hast Du den Hersteller schon kontaktiert?Jonas Blunck hat ein Tool geschrieben, das mir oft in solchen Situationen geholfen hat: COMTrace. Kannst Du mal deine Anwendung unter COMTrace ausführen und sehen, ob Du im Ausführungsprotokoll irgendwelche hilfreichen Hinweise findest?
Gruß
Marcel -
Hallo Marcel,
Du hängst Dich ganz schön ins Zeug :-), danke dafür!
Ok:
>1. Hast Du versucht, die (vermutlich native) Komponente über regsvr32 selber zu registrieren.
Ja, schon mehrfach über den "regsvr32" als auch übers Kontextmenü des OCX. Wird immer erfolgreich registriert.
>2. Gibt es ein Handbuch zur Komponente? Vielleicht verwendest Du die Komponente nicht wie angedacht, z.B. fehlende Lizenz-Datei, -Key usw.
Leider nein, nur ein Readme. Steht nur drin daß man das Teil registrieren und referenzieren soll. Der Hersteller hat mir selbst die Demo geschickt. Diese wird definitiv ohne Lizenz verwendet.
>3. Wird beim Hinzufügen der Referenz überhaupt eine .NET Wrapper-Assembly generiert?
Ja, es wird die sog. PCSClientlib generiert. Die hab ich auch schon mit dem Reflektor gebraust, sieht alles recht gut aus.
>4. Hast Du in der Ereignisanzeige eine detaillierte Fehlermeldung stehen?
Nein, keine einzige, weder unter Anwendung noch unter System.
>5. Führst Du die Host-Anwendung als Administrator aus?
Ja, bin lokaler Admin.
>6. Hast Du den Hersteller schon kontaktiert?
Ja, die reagieren sehr langsam. Ich werde voraussichtlich erst morgen Hilfe bekommen.
Deswegen wollte ich schon mal selbst danach schauen, vor allem weil ich mit COM schon einiges gemacht hab.
Ich habe die ActiveX-Komponente mal in den ActiveX-Testcontainer gepackt woraufhin dieser gleich mal abgestürzt ist... (sehr dubios).
>Jonas Blunck hat ein Tool geschrieben, das mir oft in solchen Situationen geholfen hat: COMTrace...
Danke sehr nett von Dir. Ich werde testen, sobald ich was weiß melde ich mich wieder!
Gruß, myamadeus.
-
Hallo myamadeus,
Dann warten wir mal ab, wie der Hersteller den Absturz im Testcontainer erklärt.
Noch einen kleiner Hinweis: Wenn Du COMTrace verwendest, dann bitte nur unter Windows XP (am besten über "Add Process to COMTrace..."). Und so sieht dann die Ablaufverfolgung aus:Viel Erfolg!
Gruß
Marcel -
Hallo NG,
so unten ist der COM-Trace.
Komisch ist die Ausgabe "Der Threadmodus kann nicht nach dem Einstellen geändert werden."
Ich selbst rufe ja nur eine Initialize-Methode des OCX auf. Innerhalb des OCX scheint dann aber einmal mit COINIT_MULTITHREADED und dann wieder mit
COINIT_APARTMENTTHREADED initialisiert zu werden, was natürlich Schmarrn ist. Das werde ich dem Hersteller reporten.
Das Tool ist jedenfalls gut, danke für den Tipp!
Gruß, myamadeus.
ComTrace log version 1.0
CoInitializeEx DotNet.vshost.exe (8408) 9184 0 CoInitializeEx(0x0, COINIT_MULTITHREADED) SUCCEEDED 0
CoInitializeEx DotNet.vshost.exe (8408) 5748 0 CoInitializeEx(0x0, COINIT_MULTITHREADED) SUCCEEDED 0
CoCreateInstance DotNet.vshost.exe (8408) 5748 0 CoCreateInstance({00000339-0000-0000-C000-000000000046}, 0x0, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, IID_IMarshal, 0x43cee14) SUCCEEDED 0
CoInitializeEx DotNet.vshost.exe (8408) 8624 0 CoInitializeEx(0x0, COINIT_MULTITHREADED) SUCCEEDED 0
CoInitializeEx DotNet.vshost.exe (8408) 9184 0 CoInitializeEx(0x0, COINIT_APARTMENTTHREADED) FAILED: Der Threadmodus kann nicht nach dem Einstellen geändert werden. (0x80010106) -2147417850
CoInitializeEx DotNet.vshost.exe (8408) 10036 0 CoInitializeEx(0x0, COINIT_APARTMENTTHREADED) SUCCEEDED 0
CoInitializeEx DotNet.vshost.exe (8408) 10036 0 CoInitializeEx(0x0, COINIT_APARTMENTTHREADED) SUCCEEDED 1
CoCreateInstance DotNet.vshost.exe (8408) 10036 0 CoCreateInstance(PCSCLIENT.PCSObjectFrameCtrl.1, 0x0, CLSCTX_INPROC_SERVER, IID_IUnknown, 0x47ce3ac) SUCCEEDED 0
IUnknown::QueryInterface DotNet.vshost.exe (8408) 10036 0 IID_IClassFactory->QueryInterface(IID_IClassFactory2) FAILED: Schnittstelle nicht unterstützt (0x80004002) -2147467262
Delegator DotNet.vshost.exe (8408) 10036 0 IClassFactory->CreateInstance(0x0, IID_IUnknown, 0x47ce0cc) SUCCEEDED 0
Delegator DotNet.vshost.exe (8408) 10036 0 IPCSClient->IsInitialized(0x47ce3b8) SUCCEEDED 0
Delegator DotNet.vshost.exe (8408) 10036 0 IPCSClient->Initialize("D:\acp-IT\InFrame Synapse PCS\ApplicationSuite.i...") FAILED: Ausnahmefehler aufgetreten. (0x80020009) -2147352567
IUnknown::QueryInterface DotNet.vshost.exe (8408) 10036 0 IPCSClient->QueryInterface(ISupportErrorInfo) FAILED: Schnittstelle nicht unterstützt (0x80004002) -2147467262
Delegator DotNet.vshost.exe (8408) 10036 0 IPCSClient->Login("admin", "admin") FAILED: Ausnahmefehler aufgetreten. (0x80020009) -2147352567 -
Hallo myamadeus,
Na das sieht ja prima aus...! Ähem. Ich würde dich bitten, das Resultat deiner Nachforschungen ggf. hier (anonymisiert) zu posten, wenn's soweit ist. Vielleicht hilft es ja später einmal auch anderen Entwicklern, die sich mit ähnlichen Problemen herumschlagen müssen. Zunächst sieht es mir aber eher nach einem Herstellerproblem aus (man kann aber nie wissen ;-).
Gut möglich auch, dass die Drittherstellerbibliothek eine neuere Version des COM-Objekts referenziert, die auf dem Testrechner eben nur in einer älteren Version zur Verfügung steht (und ergo bestimmte Interfaces gar nicht implementiert). Das kommt vor allem dann vor, wenn unter Visual Studio 2010 die Referenz mit der Option Interop-Typen einbetten (Standard: true) kompiliert wurde, auf dem Zielsystem aber nur eine ältere Version zu finden ist, die die Schnittstelle nicht kennt.
Gruß
Marcel
- Bearbeitet Marcel RomaModerator Montag, 18. Juni 2012 18:14 Nachtrag
-
Hallo,
schau erst einmal ob Dein Test mit ApartmentThreaded erfolgt, denn Active-X/OCXe setzt das voraus, wären .NET Threads im Standard MultiThreaded initialisiert, siehe z. B.: .NET Thread Apartment and COM Interop
Bei einer Windows Forms Anwendung wäre das durch STAThreadAttribute beim Einsprungpunkt (main) sichergestellt, siehe Gewusst wie: Festlegen den COM-Apartment Type in verwalteten Threads
Gruß Elmar
- Bearbeitet Robert BreitenhoferModerator Donnerstag, 19. Juli 2012 09:49 Formatierung
-
****************************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
****************************************************************************************************************Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.