Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#7

AW: ConitializeEx schlägt fehlt

  Alt 20. Jun 2014, 00: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 16:42 Uhr)
  Mit Zitat antworten Zitat