Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ConitializeEx schlägt fehlt (https://www.delphipraxis.net/180797-conitializeex-schlaegt-fehlt.html)

EWeiss 18. Jun 2014 12:42

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

Mikkey 18. Jun 2014 13:05

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);

EWeiss 18. Jun 2014 13:23

AW: ConitializeEx schlägt fehlt
 
Zitat:

Zitat von Mikkey (Beitrag 1262770)
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);

Danke!

Leider nicht.
Muss feststellen das es auch bei NonVcl nicht geht sobald ich auf Dialoge zugreife welche das Com Object verwenden.

gruss

dummzeuch 18. Jun 2014 19:47

AW: ConitializeEx schlägt fehlt
 
Hi,

ich habe eine Vermutung, basierend auf einem aehnlichen Problem, das ich selbst mal hatte:

http://stackoverflow.com/questions/2...r-when-started

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

EWeiss 18. Jun 2014 20:09

AW: ConitializeEx schlägt fehlt
 
Zitat:

Zitat von dummzeuch (Beitrag 1262835)
Hi,

ich habe eine Vermutung, basierend auf einem aehnlichen Problem, das ich selbst mal hatte:

http://stackoverflow.com/questions/2...r-when-started

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

Danke.

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:
var
  hr : HRESULT;

begin
  hr := CoInitializeEx(nil, COINIT_MULTITHREADED);
  if hr = S_OK then
  begin
    DLLProc := @LibraryProc;
    DLLProc(DLL_PROCESS_ATTACH);
  end;
end.
Hängt sich die Anwendung VCL auf sobald ich auf irgendeinen Button klicke.
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

EWeiss 19. Jun 2014 16:16

AW: ConitializeEx schlägt fehlt
 
Mein Problem ist das selbe wie hier!

https://groups.google.com/forum/#!to...sc/tntbzL66s68

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

EWeiss 19. Jun 2014 23:30

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:
    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;
bevor ich das Plug-In starte initialisiere ich das Com Object aus der Anwendung heraus.

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:
function TBassWMPVisAPI.WMPVIS_InitCom(coInit: Integer): HRESULT;
begin
  CoUninitialize;
  result := CoInitializeEx(nil, coInit);

end;
geht jetzt mit Nonvcl/VCL und auch mit VB6 die anderen hab ich noch nicht getestet
sollte aber auch kein Problem sein.

gruss


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