Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi COM, "Oxxx.Create", feststellen ob Programm gestartet wurde (https://www.delphipraxis.net/58883-com-oxxx-create-feststellen-ob-programm-gestartet-wurde.html)

Seras 14. Dez 2005 10:45


COM, "Oxxx.Create", feststellen ob Programm gestar
 
Hallo,

es gibt ja die Wunderbare Möglichkeit, Programme per OLE/COM fernzusteuern.
Dazu importiere ich die Typbibliothek, erstelle mein Objekt und mache da ein COxxx.Create.
Beispielsweise:
Delphi-Quellcode:
var iTunesApp: IiTunes;
{......}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  iTunesApp := COiTunesApp.Create; // Denkt euch den try..except block hier einfach.
end;
In meinem Falle also iTunes.
Jetzt gibt es aber zwei Möglichkeiten:
1. iTunes läuft bereits => Es wird einfach die "laufende Instanz" genommen.
2. iTunes läuft nicht => iTunes wird extra gestartet.

Kann ich irgendwie herausfinden ob iTunes vorher schon lief oder ob es durch "mein" .create jetzt extra gestartet wurde?
Wie gebe ich ein COM-Object danach eigentlich wieder sauber frei?

Wenn ich das hier mache:
Delphi-Quellcode:
procedure TMainForm.FormDestroy(Sender: TObject);
begin
  if iTunesApp <> nil then iTunesApp.Quit;
  iTunesApp := nil;
end;
wird iTunes beendet. Das will ich aber nicht immer. Ich will eigentlich nur mein iTunesApp sauber entfernen, also die Verbindung zu iTunes lösen ohne iTunes zu beenden.

Danke für Hinweise!

Bernhard Geyer 14. Dez 2005 10:56

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Zitat:

Zitat von Seras
Kann ich irgendwie herausfinden ob iTunes vorher schon lief oder ob es durch "mein" .create jetzt extra gestartet wurde?

"Einfach" in die ROT (Running Object Table) nachschauen

Zitat:

Zitat von Seras
Wie gebe ich ein COM-Object danach eigentlich wieder sauber frei?

Einfach Interfacezeiger auf nil setzen. Den Rest erledigt die automatische Referenzzählung von Delphi.

Zitat:

Zitat von Seras
wird iTunes beendet. Das will ich aber nicht immer. Ich will eigentlich nur mein iTunesApp sauber entfernen, also die Verbindung zu iTunes lösen ohne iTunes zu beenden.

Wenn du über die ROT gehst sollte es nicht passieren. Aber ich glaube hier liegt ein Bug in iTunes vor.

Seras 14. Dez 2005 11:15

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Danke, ich schaue mir den Link mal an.

Das mit dem beenden ist kein iTunes Bug, da ich explozit " if iTunesApp <> nil then iTunesApp.Quit; " aufrufe, iTunes aber beende.
Wenn ich "nur" iTunesApp := nil; setze wird iTunes nicht beendet, aber ich war mir nicht sicher ob das wirklich sauber ist.

Bernhard Geyer 14. Dez 2005 20:59

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Zitat:

Zitat von Seras
Das mit dem beenden ist kein iTunes Bug, da ich explozit " if iTunesApp <> nil then iTunesApp.Quit; " aufrufe, iTunes aber beende.
Wenn ich "nur" iTunesApp := nil; setze wird iTunes nicht beendet, aber ich war mir nicht sicher ob das wirklich sauber ist.

Setzen des Interface-Zeigers auf nil ist COM-Technisch immer genug. Alles andere sind "Sonderfeatures" der entsprechenden Schnittstelle.

OldGrumpy 29. Sep 2006 18:26

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Sorry wenn das Antworten auf ältere Threads nicht erwünscht ist, aber IMHO passt es ganz gut :)

Wenn ich einfach nur den Interface-Zeiger auf nil setze, dann meckert iTunes beim Beenden, dass noch ein Programm die Scripting-Schnittstelle benutze. Kann ich dagegen programmiertechnisch sauber von meiner Seite aus etwas tun? Das iTunes-Object hat ja ausser Create() keine nennenswerten Methoden...

Momentan kämpfe ich auch mit der Implementation der Events - Entweder meckert iTunes dass noch was auf der Schnittstelle hockt, oder es schmiert mit einer Access Violation (verursacht durch Null-Pointer) ab. Wie trenne ich denn meine Seite vom EventManager sauber ab?

Folgendes habe ich bis jetzt:

- Mit dem Tool von techvanguard.com einen Event-Wrapper für iTunes erzeugt. Davon ein Objekt instantiiert, mit iTunes verbunden (Connect()) und dann die entsprechenden Methoden in meinem Programm zugewiesen.

In der Methode die aufgerufen wird, wenn iTunes vom User zugeklickt wird, hab ich dann die entsprechenden Zeiger alle auf Nil gesetzt, Disconnect() aufgerufen und das hat dann beim Beenden von iTunes die oben beschriebene Access Violation zur Folge.

Ich bin mir ziemlich sicher dass ich was ganz triviales übersehe, irgendeine Idee was? :)

DaCoda 17. Okt 2006 23:32

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Hat denn jemand eventuell eine Unit für Delphi und iTunes ????
Weil atm habe ich keinen guten Plan, wie das funzt :oops: Also das mit der TLB Import schon, aber ich habe Turbo Delphi (Free)und da geht ja sowas nicht oder irre ich ?????

OldGrumpy 18. Okt 2006 09:12

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Da die TLB für iTunes eh keine visuelle Komponente anbietet, kannst Du ganz einfach die TLB-Unit in Deine Uses-Klausel aufnehmen und fertig. Du solltest Dir aber unbedingt das COM SDK bei Apple runterladen, die Beschreibung der Interfaces ist zwar etwas wirr im beiliegenden CHM-Helpfile, aber ohne die ist man bei iTunes schnell aufgeschmissen. Dann instantiierst Du ein ITunesApp-Objekt und benutzt das einfach. Wobei "einfach" relativ zu sehen ist, allein um einen Song abzuspielen sind schon ein paar kleine Klimmzuege notwendig, da iTunes grundsätzlich keine einzelnen Songs spielt sondern immer ganze Playlisten. D.h. erst eine eigene Playlist erzeugen, gewünschte Songs in die Playlist packen und dann die Playlist abspielen. :drunken:

Eins noch: Verzichte wenn es irgendwie geht, vorübergehend auf die Version 7, die hat einige massive Bugs. Bei mir bleibt das Ding z.B. mit 1 Sekunde Restlaufzeit stehen und wartet dann bis zum jüngsten Tag auf das Ende des Songs. Springt weder zum nächsten Song, noch gehts in den Stop-Modus noch signalisiert es via COM-Event dass der Song fertig ist. :wall: :wall: :wall:

Edit: Wenn das Erzeugen der TLB das Problem ist, dann könnte ich a) die entsprechende Unit anhängen (@Mods: wäre das okay?), und b) könntest Du auch auf die TLB-Unit komplett verzichten. Du brauchst nur das Tool OleView.exe (zu finden irgendwo im sich ständig ändernden Downloadbereich bei Microsoft zum Beispiel) um zu schauen, welche Interfaces welche Methoden und Properties haben. Dann definierst Du einfach Variablen vom Typ OleVariant für jedes Interface und diese Variable hat dann die gleichen Methoden und Properties wie in der Doku und in OleView zu sehen. Nachteil: Keine automatische Codevervollständigung... Wenn man nicht genau weiss wie das Property nochmal heisst was man sucht, kann das schon etwas nerven :)

DaCoda 19. Okt 2006 11:07

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Jau, das wäre nice..... Die iTunes_TLB kann ich mir leider nur nicht herstellen.... Also wenn das geht, kannst die ja mal anhängen, oder mir direkt mailen....

Dankeeee.

DaCoda 24. Okt 2006 16:40

Re: COM, "Oxxx.Create", feststellen ob Programm ge
 
Habs nun doch selber hinbekommen,

trotzdem danke :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz