![]() |
ConitializeEx schlägt fehlt
In meiner NonVcl Anwendung rufe ich in WinMain einmalig direkt nachdem das Handle des Hauptfensters erstellt wurde
ConinitializeEx(Nil, COINIT_MULTITHREADED) auf. Anschließendes Weiterarbeiten mit der Anwendung stellt kein Problem dar und funktioniert auch alles. Die Initialisierung ist 0 also S_OK. Das gleiche Spielchen mit einer VCL Anwendung jedoch sobald ich auf irgendeinen Button klicke hängt die Anwendung und kann nur über den Taskmanager beendet werden. (ohne Rückfrage) Bei COINIT_APARTMENTTHREADED bekomme ich ein S_FALSE Bei COINIT_MULTITHREADED RPC_E_CHANGED_MODE Jetzt verwende ich in der GUI (VCL) TOpenDialog .. verwendet com? und kann da nichts ändern bezüglich CoInitialize. Was muss ich tun damit eine Initialisierung nicht fehl schlägt? gruss |
AW: ConitializeEx schlägt fehlt
Bei mir funktioniert das einwandfrei, allerdings erfolgt der Aufruf nur innerhalb von
Delphi-Quellcode:
.
TThreadAbleitung.Execute
Möglicherweise kommst Du mit "OleInitialize" besser klar, ich meine, beim Aufruf aus dem Hauptthread hätte ich auch verschiedene Probleme gehabt Die Aufrufe (im separaten Thread) sehen bei mir so aus:
Delphi-Quellcode:
CoInitializeEx(nil, COINIT_MULTITHREADED); //OleInitialize(nil);
|
AW: ConitializeEx schlägt fehlt
Zitat:
Leider nicht. Muss feststellen das es auch bei NonVcl nicht geht sobald ich auf Dialoge zugreife welche das Com Object verwenden. gruss |
AW: ConitializeEx schlägt fehlt
Hi,
ich habe eine Vermutung, basierend auf einem aehnlichen Problem, das ich selbst mal hatte: ![]() Kann es sein, dass Du in der IDE zusaetzliche Environment-Variablen definiert hast? Ich habe zwar bis heute nicht herausgefunden, weshalb das ein Problem war, aber nachdem ich die Variablen geloescht hatte, funktionierte wieder alles. twm |
AW: ConitializeEx schlägt fehlt
Zitat:
Nein verwende keine. Hab schon so vieles versucht aber kein Erfolg bisher. Ich verwende CoCreateInstance in meiner DLL Verwende ich ConitializeEx bevor die DLL initialisiert wird also so..
Delphi-Quellcode:
Hängt sich die Anwendung VCL auf sobald ich auf irgendeinen Button klicke.
var
hr : HRESULT; begin hr := CoInitializeEx(nil, COINIT_MULTITHREADED); if hr = S_OK then begin DLLProc := @LibraryProc; DLLProc(DLL_PROCESS_ATTACH); end; end. Höchstwahrscheinlich weil die Komponente TOpenDialog sich auf der Form befindet. Bei der Nonvcl nur dann wenn ich den Dialog anspreche. Wenn ich CoInitializeEx weg lasse funktioniert alles bis auf das Plugin Morphyre (um das es eigentlich geht). Hier kracht es dann.. bei RenderWindowed.
Delphi-Quellcode:
function TWMPHelper.RenderWindowed(var pData: TimedLevel;
fRequiredRender: Bool): Bool; begin result := false; if Assigned(_IWmpEffects2) then try if _IWmpEffects2.RenderWindowed(pData, fRequiredRender) = S_OK then result := true; except result := false; end; end; irgendwas ist das faul.. finde es nicht. gruss |
AW: ConitializeEx schlägt fehlt
Mein Problem ist das selbe wie hier!
![]() So wie ich das sehe muss ich dann die Com Objekte innerhalb der Anwendung selbst erstellen aber das ist was ich eigentlich nicht wollte :? Die Anwendung soll eigentlich nichts von den Interfaces IWMPEffect und IWMPEffect2 wissen. Das ist ja der sinn der DLL. Nun ja muss mal sehn :) Dafür.. CoMarshalInterThreadInterfaceInStream kann ich nichts vernünftiges finden. Ich kann zwar das Interface in den Stream packen nur wie arbeitet man dann weiter im verlauf mit dem Stream? Denn die Rückgabe von IStream(myInterfacePointer) ist ja nur ein Pointer. gruss |
AW: ConitializeEx schlägt fehlt
Nach vielen hin und her habe ich dann schlussendlich doch noch die Lösung gefunden.
Falls es jemand interessiert hier die Lösung.
Delphi-Quellcode:
bevor ich das Plug-In starte initialisiere ich das Com Object aus der Anwendung heraus.
BASSVISKIND_WMP:
begin if BASSVIS_InitCom(mVisParam.Kind, 0{COINIT_MULTITHREADED}) = 0 then begin mExec.WMP_PluginIndex := PlgSelectedIndex-1; mExec.WMP_PresetIndex := PlgSelectedPreset; mExec.WMP_SrcVisHandle := PlgWinhandle; mExec.Left := 0; mExec.top := 0; mExec.Width := rw.Right-rw.Left; mExec.Height := rw.Bottom - rw.Top; BASSVIS_ExecutePlugin(@mExec, mVisParam); if BASSVIS_InitCom(mVisParam.Kind, 2{COINIT_APARTMENTTHREADED}) = 0 then begin if mVisParam.Vishandle <> 0 then begin if ckRenderDevice.GetCheckButtonStatus(ckRenderDevice.Handle) = TRUE then begin BASS_RecordInit(0); BASSVIS_StartRecord(@mVisParam); end else begin if gnAudioChannel <> 0 then begin BASSVIS_RenderChannel(@mVisParam, gnAudioChannel, false); // Playstatus zum Plugin senden BASSVIS_SetPlayState(@mVisParam, psPlay); end; end; // FFT Value FFTValue := trbSpectrum.GetTrackValue(trbSpectrum.Handle); BASSVIS_SetOption(@mVisParam, BASS_VIS_CONFIG_FFTAMP, FFTValue); BASSVIS_SetModulePreset(@mVisParam, PlgSelectedPreset); end; end; end; end;
Delphi-Quellcode:
if BASSVIS_InitCom(mVisParam.Kind, 0{COINIT_MULTITHREADED}) = 0 then
nach dem ausführen direkt wieder zurück damit es keine Probleme mit den ComDialogen gibt diese vertragen nun mal kein MULTITHREADED.. deshalb hängt es dann wenn man Dateien addieren will.
Delphi-Quellcode:
if BASSVIS_InitCom(mVisParam.Kind, 2{COINIT_APARTMENTTHREADED}) = 0 then
Für den ganze Kram hab ich einfach ne neue Funktion angelegt.
Delphi-Quellcode:
function BASSVIS_InitCom(Kind: TBASSVIS_KIND_T; coInit: Integer): HRESULT; stdcall;
begin Result := S_FALSE; if (Kind <> BASSVISKIND_WMP) then Exit; Result := BASSWMPVisAPI.WMPVIS_InitCom(coInit); end;
Delphi-Quellcode:
geht jetzt mit Nonvcl/VCL und auch mit VB6 die anderen hab ich noch nicht getestet
function TBassWMPVisAPI.WMPVIS_InitCom(coInit: Integer): HRESULT;
begin CoUninitialize; result := CoInitializeEx(nil, coInit); end; sollte aber auch kein Problem sein. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 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