AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi COM, "Oxxx.Create", feststellen ob Programm gestartet wurde
Thema durchsuchen
Ansicht
Themen-Optionen

COM, "Oxxx.Create", feststellen ob Programm gestartet wurde

Offene Frage von "OldGrumpy"
Ein Thema von Seras · begonnen am 14. Dez 2005 · letzter Beitrag vom 24. Okt 2006
Antwort Antwort
Seras

Registriert seit: 14. Dez 2005
12 Beiträge
 
Delphi 2006 Professional
 
#1

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

  Alt 14. Dez 2005, 10:45
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!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 14. Dez 2005, 10:56
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 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 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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Seras

Registriert seit: 14. Dez 2005
12 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 14. Dez 2005, 11:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 14. Dez 2005, 20:59
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 29. Sep 2006, 18:26
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?
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 17. Okt 2006, 23:32
Hat denn jemand eventuell eine Unit für Delphi und iTunes ????
Weil atm habe ich keinen guten Plan, wie das funzt Also das mit der TLB Import schon, aber ich habe Turbo Delphi (Free)und da geht ja sowas nicht oder irre ich ?????
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#7

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

  Alt 18. Okt 2006, 09:12
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.

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.

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
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 19. Okt 2006, 11:07
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.
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
143 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 24. Okt 2006, 16:40
Habs nun doch selber hinbekommen,

trotzdem danke
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz