![]() |
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:
Funktioniert auch ganz gut. Wenn ich die Procedure über ein Ereignis des IndyHTTPServers aufrufe bekomme ich immer diese Fehlermeldung
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;
Code:
ich habe es schon mit
Im Projekt HomeServer.exe ist eine Exeption der Klasse EOleSysError aufgertreten. Meldung: 'CoInitialize wurde nicht aufgerufen'. Prozes....
Delphi-Quellcode:
vor dem Aufruf und bei Formcreate versucht.
OleInitialize(nil);
Wo mache ich den Fehler? Viele Grüße Sebastian |
AW: Problem mit iTunes und COM
Warum rufst du nicht mal CoInitialize() auf?
|
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. |
AW: Problem mit iTunes und COM
Trotz
Delphi-Quellcode:
und das einbinden von der Unit
CoInitialize(nil)
Delphi-Quellcode:
bekomme ich den selben fehler.
ActivX und Comobj
|
AW: Problem mit iTunes und COM
Zitat:
@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:
|
AW: Problem mit iTunes und COM
Wie kann ich herrausfinden in welchen Thread dieses Event läuft?
Delphi-Quellcode:
Oder reicht es wenn ich das
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;
Delphi-Quellcode:
am Anfang der procedure aufrufe?
CoInitialize(nil)
|
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 01:52 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-2025 by Thomas Breitkreuz