2012-04-11 5 views
3

Alle:GetActiveObject() vs. GetObject() - MK_E_UNAVAILABLE Fehler

ich einige Probleme habe einige VBA-Code in C# zu übersetzen.

Wir haben eine Drittanbieter-App, die als lokaler COM-Server fungiert.

Im VBA-Code verwenden wir GetObject() einen Verweis auf das bestehende Objekt zu erhalten

z.B.

Set appHandle = GetObject("", ProgId) 

das funktioniert gut.

Ich habe einen Verweis auf die 3rd Party App in unserem C# -Code hinzugefügt und Marshal.GetActiveObject() verwendet, um zu versuchen, einen Verweis auf eine laufende Instanz zu erhalten.

z.B.

var appModel = (IAppCoModel)Marshal.GetActiveObject(ProgId); 

aber ich halte einen MK_E_UNAVAILABLE Fehler.

ein neues Objekt anlegen funktioniert gut in der C# -Code

z.B.

var appModel = new AppCoModel() 

dies startet den 3rd-Party-App und ermöglicht es mir, mit ihm zu kommunizieren. Es ist nur ein Verweis auf eine laufende Instanz, die fehlschlägt.

Was ich

Verschiedene Sicherheitskontexte
VS läuft im Admin-Modus versucht haben, ist die 3rd-Party-App nicht. Ich habe versucht, unsere C# -App über die Befehlszeile (nicht-Admin) auszuführen. Immer noch versagt.

Überprüfen Sie die Inhalte ROT
(vorgeschlagen von Marshal.GetActiveObject() throws MK_E_UNAVAILABLE exception in C#)
Die 3rd-Party-App erscheint nicht drin. Ich weiß nicht genug COM, um sicher zu sein, dass es nötig ist.

Überprüft alle Registry-Einträge
Gut aussehen (soweit ich sehen kann) und sie sind gut genug, um zu erstellen und Instanz der 3rd-Party-App und für die VBA es zu finden. Alles was ich hier überprüfen sollte?

Alle Vorschläge, die Menschen machen können, würden geschätzt werden.

+1

http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/ccccc9bd-f21a-4f74-a3f0-64a594fa1b16 –

Antwort

6

Alle:

Nicht zu sicher, was die Etikette für die eigene Frage zu schließen, aber da ich die Antwort gefunden würde ich auf irgendeine Weise Marke mag es als ‚keine Antwort benötigen.‘

Der Grund, dass GetActiveObject() MK_E_UNAVAILABLE zurückgibt, ist, dass die 3rd Party App nicht als ein Automatisierungsserver registriert ist. Es ist nicht möglich, eine Referenz auf die laufende Instanz zu erhalten.

Dies zeigte sich nicht in der VBA-Code, weil:

  1. GetObject("",ProgID) jedes Mal eine neue Instanz erstellt (http://msdn.microsoft.com/en-us/library/gg251785.aspx)

  2. Die COM-Funktionalität in der 3rd-Party-App ausgesetzt startet die App, wenn Es läuft nicht. In der VBA erstellen wir also mehrere Objekte, die alle auf die gleiche laufende App zeigen, anstatt sie an die laufende App anzuhängen.

+0

Es ist vollkommen in Ordnung, Ihre eigene Frage zu beantworten, und markieren als Antwort und wird ermutigt. –

Verwandte Themen