Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Problem mit iTunes und COM (https://www.delphipraxis.net/160964-problem-mit-itunes-und-com.html)

sebi87 9. Jun 2011 19:18

Problem mit iTunes und COM
 
Hallo Leute,

ich versuche mein iTunes über COM zu stueren was auch mittels Buttons ganz gut funktioniert. Hier mal eine Beispielprocedure

Delphi-Quellcode:
procedure play;
var
  iTunes : OleVariant;
begin
  try
    iTunes := CreateOleObject('iTunes.Application');
    if not VarIsNull(iTunes) then begin
      iTunes.Play;
      iTunes := Unassigned;
    end;
  except
  end;
end;
Funktioniert auch ganz gut. Wenn ich die Procedure über ein Ereignis des IndyHTTPServers aufrufe bekomme ich immer diese Fehlermeldung
Code:
Im Projekt HomeServer.exe ist eine Exeption der Klasse EOleSysError aufgertreten. Meldung: 'CoInitialize wurde nicht aufgerufen'. Prozes....
ich habe es schon mit
Delphi-Quellcode:
OleInitialize(nil);
vor dem Aufruf und bei Formcreate versucht.

Wo mache ich den Fehler?

Viele Grüße
Sebastian

s.h.a.r.k 9. Jun 2011 19:45

AW: Problem mit iTunes und COM
 
Warum rufst du nicht mal CoInitialize() auf?

sx2008 10. Jun 2011 00:54

AW: Problem mit iTunes und COM
 
Man braucht eigentlich nur die Unit ActiveX oder ComObj *) mit der Uses-Klausel einbinden und der Initialization-Abschnitt sorgt dann dafür das CoInitialize() bzw. CoInitalizeEx() aufgerufen wird.
Im Finalization-Abschnitt wird das Gegenstück CoUninitialize() aufgerufen.
Diese angenehme Automatik betrifft aber nur den Hautpthread; bei eigenen Threads muss man selbst Hand anlegen.

*) kann gerade mangels einer Delphi Installation nicht genau sagen, welche Unit es genau ist.
Bitte selber nachforschen.

sebi87 10. Jun 2011 06:19

AW: Problem mit iTunes und COM
 
Trotz
Delphi-Quellcode:
CoInitialize(nil)
und das einbinden von der Unit
Delphi-Quellcode:
ActivX und Comobj
bekomme ich den selben fehler.

CCRDude 10. Jun 2011 13:59

AW: Problem mit iTunes und COM
 
Zitat:

Zitat von sx2008 (Beitrag 1105581)
Man braucht eigentlich nur die Unit ActiveX oder ComObj *) mit der Uses-Klausel einbinden und der Initialization-Abschnitt sorgt dann dafür das CoInitialize() bzw. CoInitalizeEx() aufgerufen wird.

ComObj ist's. Hilft aber hier nicht, hast Du ja schon selber erwähnt eigentlich :)

@sebi87: bist Du sicher, daß Du CoInitialize an der richtigen Stelle aufgerufen hast? Du sprichst von einem HTTP-Server; da wird jede Instanz in einem eigenen Thread laufen (sonst könnte ein Server nie mehr als einen HTTP-Client gleichzeitig bedienen), in dem Du das dann aufrufen musst, siehe auch sx2008's Nebenkommentar:
Zitat:

Zitat von sx2008 (Beitrag 1105581)
bei eigenen Threads muss man selbst Hand anlegen.


sebi87 13. Jun 2011 14:25

AW: Problem mit iTunes und COM
 
Wie kann ich herrausfinden in welchen Thread dieses Event läuft?

Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
begin
  if RequestInfo.Params.Strings[0] = 'in:request' then
  begin
    Label1.Caption := 'Eingehender Anruf von ' +  RequestInfo.Params.Strings[2] ;
    if iTunesRunning then iTunesPause ;
  end ;
  if RequestInfo.Params.Strings[0] = 'in:cancel' then
  begin
    Label1.Caption := 'Verpasster Anruf' ;
    if iTunesRunning then iTunesPlay ;
  end ;
end;
Oder reicht es wenn ich das
Delphi-Quellcode:
CoInitialize(nil)
am Anfang der procedure aufrufe?

CCRDude 14. Jun 2011 09:39

AW: Problem mit iTunes und COM
 
Du setzt einen Debugger-Breakpoint in dieser Funktion, und öffnest die Thread-Liste in der IDE (View -> Debug Windows -> Threads).

Oder Du liest Dir einfach die Indy-Sourcen dazu durch. Ich sehe gerade, daß Du im Handler VCL-Aktionen durchführst. Wenn das erlaubt ist, könnte es sein, daß das Event synchronisiert geliefert wird und Du Dich damit doch im Hauptthread befindest.

Wenn Du CoInitialize hinzufügst, vergiss das CoUnitialize nicht. Also in etwa:

Code:
if CoInitialize(nil)=S_OK then begin
   try
      // code
   finally
      CoUnitialize;
   end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 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