Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#1

Vom Record gehen teile verloren

  Alt 14. Jul 2021, 13:27
Ich habe nen Record und schicke diesen zu einer 32Bit EXE.
Verändere dabei aber nur bestimmte bereiche.
Nicht lachen.. aber wenn ein Eintrag überschritten wird nimmt die Exe einfach nichts mehr an.

Warum?

Beispiel:
Der record in beiden Exe gleich 64 und 32Bit
Delphi-Quellcode:
  PSOP64 = ^TSOP64;
  TSOP64 = record
    PluginFile: array[0..MAX_PATH - 1] of AnsiChar;
    ConfigFile: array[0..MAX_PATH - 1] of AnsiChar;
    UseSlowFade: BOOL;
    ViewportWidth: Integer;
    ViewportHeight: Integer;
    SlowFadeVal: Integer;
    ParentHandle: HWND;
    FFTAmpVal: Integer; // Dieser Eintrag funktioniert einfach nicht
    FFT: array [0 .. 511] of single;
    Wave: array [0 .. 1023] of smallint;
    Position: DWORD;
  end;
Wird so abgeschickt.

Delphi-Quellcode:
procedure SOP_FFTAmpVal;
begin
  if (gp.hSOPlugin <> 0) then
  begin
    gSOP.FFTAmpVal := gBin.FFTAmpVal;
    gCDS.dwData := dwData_FFTAmpVal;
    gCDS.cbData := SizeOf(gSOP);
    gCDS.lpData := @gSOP;
    SendMessage(gp.hSOPlugin, WM_COPYDATA, WPARAM(gP.MainHandle), LPARAM(@gCDS));
  end;
end;
gBin.FFTAmpVal; (gBin ist ein record mit diversen globalen variablen)
Wenn ich nun meinen Slider bewege wird die Value geändert und an SOP_FFTAmpVal übergeben.

In der 32Bit Exe wird sie so angenommen.
Delphi-Quellcode:
    WM_COPYDATA:
      begin
        pCDS := Pointer(lP);
        case pCDS.dwData of
          5:
            begin
              pSOP := Pointer(pCDS.lpData);
              FFTSAmplification := (11 - Max(1, Min(4, pSOP.FFTAmpVal))) / 10;
            end;
        end;
      end;
pSOP.FFTAmpVal bleibt immer 0.
Verschiebe ich den Eintrag aber an einer höheren Stelle innerhalb des Record (TSOP64) dann funktioniert es.
Was für seltsame Dinge gehen da wieder vor sich.

Die Übergabe der Arrays für die Visualisierung haben kein Problem daher verstehe ich das nicht
obwohl diese unter dem Eintrag vom FFTAmpVal stehen.

Übergeben!
Delphi-Quellcode:
      if (gP.hSOPlugin <> 0) then
      begin
        if (IsMenuChecked(IDC_PLUGIN, hCtrl)) then
        begin
          FFFTdata := GetFFTData;
          CopyMemory(@gSOP.FFT[0], @FFFTdata, 512);
          gSOP.Position := StreamPos;

          FWaveData32 := GetWaveData;
          CopyMemory(@gSOP.Wave[0], @FWaveData32, 1024);
          gCDS.dwData := dwData_OpenGL;
          gCDS.cbData := SizeOf(gSOP);
          gCDS.lpData := @gSOP;
          SendMessage(gP.hSOPlugin, WM_COPYDATA, WPARAM(gP.MainHandle), LPARAM(@gCDS));
        end;
      end;
Und Angenommen\Ausgewertet innerhalb der 32Bit Exe
Delphi-Quellcode:
    WM_COPYDATA:
      begin
        pCDS := Pointer(lP);
        case pCDS.dwData of
          0:
            begin
              pSOP := Pointer(pCDS.lpData);
              Position := pSOP.Position;
              RenderOpenGL(VisHandle, @pSOP.Wave, @pSOP.FFT, Position);
            end;
        end;
      end;
Mir fällt nichts mehr ein was das auslösen könnte.

64Bit Anwendung (verwendet die Bass.dll 64Bit) zur 32Bit Anwendung die dann 32Bit.dll's Sonique Plugins visualisiert.
Ich habe immer davon geredet das man 32Bit Dll's sehr wohl mit einer 64Bit Anwendung verwenden kann.
Wollte das mal hier Demonstrieren es scheint aber doch kleine Problem zu geben.

Vielleicht den 64Bit Record auf 32Bit trimmen?
Wenn dann nur wie?

PS:
Ich bekomme es auch nicht gebacken das ich beide Exe Dateien miteinander in der IDE Debuggen kann.

Geändert von venice2 (19. Jul 2021 um 22:33 Uhr)
  Mit Zitat antworten Zitat