AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ConitializeEx schlägt fehlt

Ein Thema von EWeiss · begonnen am 18. Jun 2014 · letzter Beitrag vom 19. Jun 2014
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

ConitializeEx schlägt fehlt

  Alt 18. Jun 2014, 12:42
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

Geändert von EWeiss (18. Jun 2014 um 13:40 Uhr)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#2

AW: ConitializeEx schlägt fehlt

  Alt 18. Jun 2014, 13:05
Bei mir funktioniert das einwandfrei, allerdings erfolgt der Aufruf nur innerhalb von 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:

CoInitializeEx(nil, COINIT_MULTITHREADED); //OleInitialize(nil);
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: ConitializeEx schlägt fehlt

  Alt 18. Jun 2014, 13:23
Bei mir funktioniert das einwandfrei, allerdings erfolgt der Aufruf nur innerhalb von 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:

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

Geändert von EWeiss (18. Jun 2014 um 13:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.468 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: ConitializeEx schlägt fehlt

  Alt 18. Jun 2014, 19:47
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
Thomas Mueller
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: ConitializeEx schlägt fehlt

  Alt 18. Jun 2014, 20:09
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

Geändert von EWeiss (18. Jun 2014 um 20:16 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: ConitializeEx schlägt fehlt

  Alt 19. Jun 2014, 16:16
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

Geändert von EWeiss (19. Jun 2014 um 18:27 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: ConitializeEx schlägt fehlt

  Alt 19. Jun 2014, 23:30
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.

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.

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

Geändert von EWeiss (11. Jul 2019 um 15:42 Uhr)
  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 23:33 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