Laden...

Process ID von externer Office Anwendung ermitteln

Erstellt von ntc05 vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.135 Views
N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren
Process ID von externer Office Anwendung ermitteln

Hallo Zusammen,

leider komme ich bei einem Problem nicht weiter...

Konnte im Internet nichts brauchbares finden...

oApp = Activator.CreateInstance(objClassType);

Wie kann ich die ProcessID ermitteln?

Wäre toll, wenn mir hierbei jemand helfen könnte.

Vielen Dank für Eure Hilfe

4.938 Beiträge seit 2008
vor 7 Jahren

Mittels Activator.CreateInstance wird nur zur Laufzeit ein neues Objekt erzeugt, d.h. es ist die selbe Process-Id wie das aufrufende Programm.

Aufgrund 'oApp' deutet der Code jedoch darauf hin, daß du "Office Automation" benutzt, oder?
Und du möchtest dann die Process-Id der externen Office-Anwendung haben?

Du könntest per P/Invoke über GetWindowThreadProcessId die Process-Id auslesen.
Als Parameter dann oApp.Hwnd übergeben, s.a. Getting excel application process id.

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren

Hallo Th69,

vielen Dank für Deine Antwort.

Leider bekomme ich es einfach nicht hin...
Könntest Du mir bitte nochmals weiterhelfen?

Wie Du schon erkannt hast 😃 möchte ich die Process-ID
der externen Office-Anwendung (late binding) haben.

Bekomme es aber anhand des Beispieles aus deinem Link
nicht hin. (GetWindowTreadProcessID)

Folgenden Fehler erhalte ich ... stehe irgendwie auf dem schlauch...

IntPtr pID = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);

Fehlermeldung:
Fehler: Der Name "GetForegroundWindow" ist im aktuellen Kontext nicht vorhanden

Wäre toll, wenn Du mir hierbei noch mal helfen könntest oder mir evtl.
zeigst, wie es richtig geht....

Vielen Dank..

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren

Hallo Th69,

habe das Problem mit GetForegroundWindow gelöst....

Jedoch gibt er mit nicht die Process ID von der externen Office
Anwendung sondern die des Visual Studios an...

Bitte könntest du mir hierbei helfen...

Krieg es einfach nicht hin.

Vielen Dank....

2.207 Beiträge seit 2011
vor 7 Jahren

Hallo ntc05,

Getting excel application process id nützt dir nix?

Gruss

Coffeebean

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren


>
nützt dir nix?

Hallo Coffeebean,

Wenn mich nicht alles täuscht verwendet man dies für eine early Binding . Ich nutze eine Late Binding.
Deshalb hilft es mir nicht?!

Vielen Dank für deine Hilfe.

Viele Grüße

4.938 Beiträge seit 2008
vor 7 Jahren

Was soll denn "early"- bzw. "late binding" damit zu tun haben?
Hast du denn jetzt


oApp.Hwnd

als Parameter angegeben? Wie bist du denn auf "GetForegroundWindow()" gekommen?

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren

Hallo Th69,

vielen Dank für Deine Antwort.

Nein der Parameter .Hwnd konnte nicht hinzugefügt werden, da er nicht existiert.

Ok, sorry, wusste nicht das es nichts mit early oder late binding zu tun hat.

Würde mich sehr über weitere Hilfestellung freuen.

Viele Grüße

W
196 Beiträge seit 2008
vor 7 Jahren

Zeig doch mal etwas mehr von Deinem Code und beschreibe vor allem genauer, was Du erreichen möchtest. Mir scheint als gäbe es da ein grundlegenderes Verständnisproblem...

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren

Zeig doch mal etwas mehr von Deinem Code und beschreibe vor allem genauer, was Du erreichen möchtest. Mir scheint als gäbe es da ein grundlegenderes Verständnisproblem...

Vielen Dank für Deine Antwort wcseller,

hier ist der Code den ich benutze:

            Type objClassType;
            objClassType = Type.GetTypeFromProgID("Excel.Application");
            oApp = Activator.CreateInstance(objClassType);

Nach dem Ausführen der letzten Codezeile erscheint im Taskmanager
ein Prozess mit dem Namen: "excel".
Für diesen Prozess benötige ich Prozess ID (PID) ... und dies bekomme ich
einfach nicht hin.

Die Möglichkeit den Prozess mit dem Namen "excel" zu suchen und zu finden,
bringt mir leider nichts, da es sein kann das mehrere Prozesse mit dem
Namen "excel" laufen könnten.
Deshalb benötige ich die Prozess ID.

Ich hoffe es kann mir hierbei jemand helfen.

Vielen Dank.

Viele Grüße

771 Beiträge seit 2009
vor 7 Jahren

Hi,

welchen Datentyp hat denn oApp?

A
764 Beiträge seit 2007
vor 7 Jahren

Die Möglichkeit den Prozess mit dem Namen "excel" zu suchen und zu finden,
bringt mir leider nichts, da es sein kann das mehrere Prozesse mit dem
Namen "excel" laufen könnten.
Deshalb benötige ich die Prozess ID.

Hallo ntc05,

Ich erinnere mich ganz dunkel daran, dass ich es nicht geschafft habe direkt über Office-Automation die Process-ID zu ermitteln.
Das Thema Office-Automation selbst ist eine recht komplexe Angelegenheit, bei der man über einige Seltsamkeiten stolpern kann. Das nur als Warnung.

Als work around könntest du zuerst alle PIDs der Excel-Instanzen ermitteln und dann deine neue Instanz erstellen und deren PID ermitteln, in dem du die anderen Excel-PIDs ausschließt..

Gruß, Alf

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren

Als work around könntest du zuerst alle PIDs der Excel-Instanzen ermitteln und dann deine neue Instanz erstellen und deren PID ermitteln, in dem du die anderen Excel-PIDs ausschließt..

Gruß, Alf

Hallo Alf Ator,

vielen Dank für Deine Antwort.

Ich habe Deinen Vorschlag umgesetzt und es funktioniert.
Was ich jedoch nicht abfangen kann ist, wenn es zwei neue
"excel" Prozesse geben sollte. Dann würde ich evtl. den
falschen Prozess ermitteln.

Nur komisch finde ich es das man den Prozess nicht
exakt ermitteln kann?!

Ein Projekt das ich in VB.Net geschrieben habe, findet
eindeutig den Prozess. Komisch das es da solche unter-
schiede zwischen C# und VB.Net gibt.

Nochmals vielen Dank für Deine Hilfe.

Viele Grüße

4.938 Beiträge seit 2008
vor 7 Jahren

Hallo,

"oApp.Hwnd" hat der Compiler nicht gefunden, weil du wahrscheinlich oApp nicht richtig deklariert hast:


Excel.Application oApp = Activator.CreateInstance(objClassType) as Excel.Application;

Und nun kannst du auch auf "oApp.Hwnd" zugreifen.

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren

Hallo Th69,

vielen Dank für Deine Antwort:

Wie bereits von mir angemerkt, benötige ich keine early binding von Excel.
Excel.Application zeigt klar auf, dass es sich hierbei um eine early binding handelt.

siehe folgenden Link: Microsoft

Die Deklaration ist somit auf late binding abgestimmt und richtig.

Trotzdem nochmals vielen Dank für Deine Hilfe.

Viele Grüße

4.938 Beiträge seit 2008
vor 7 Jahren

Damit wollte ich dir nur aufzeigen, warum der Compiler eine Fehlermeldung bei dir ausgegeben hat.

Für "late binding" kannst du in C# das Schlüsselwort "dynamic" benutzen: Word Automation using Late binding - Usage of dynamic Keyword - und dann müßte auch "oApp.Hwnd" funktionieren.

N
ntc05 Themenstarter:in
12 Beiträge seit 2015
vor 7 Jahren

Hallo Th69,

vielen Dank für Deine Antwort und Deinen Tipp.

Ich werde das mal versuchen.

Viele Grüße