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.