Plugin do XMPlay (tłumaczenie SDK z C++ na Dephi) - problem.

0

Witam. Na ogół to ja chętnie pomagam w tematach z Delphi, jeżeli tylko potrafię, jednak z C++ zawsze byłem, jestem i będę totalną "nogą". Prośba do kogoś kto ma chwilę żeby pobrał z http://uk.un4seen.com/files/xmplay36.zip XMPlaya i wypakował do C:\PROGRAM FILEX\XMPLAY, a później pobrał plik z: http://olesio.eu/xmp_mmkeys.zip i sprawdził z podkatalogu XMPLAY_SDK_CPP czy pliki xmpdsp.h i xmpfunc.h są dobrze przetłumaczone na Delphi do xmpdsp.pas oraz xmpfunc.pas oraz sam dpr dllki, która musi mieć nazwę w formacie xmp-XXXXXX.dll i być w katalogu XMPlay. Do spakowania UPX, zmiany nazwy i skopiowania służy dołaczony plik pack_reneme_copy.bat. Bo nadal plugin nie działą ok, bo jak odkomentujemy SysUtils oraz Timer'a to okienko pokaże faktycznie uchwyt aplikacji (dałem w Hex, bo sprawdzam na szybko programikiem TDWinInfo, a on pokazuje uchwyty w systemie Hex). Jednak jak możesz Blind lub ktoś jeszcze pobierzcie XMPlay i przyjrzyjcie się działaniu plugina, bo XMPlay uruchamia się, ale jak wybierzemy z menu opcje i klikniemy na zakładkę Plugins na liście po lewej to program się wykrzacza. Co najgorsze przez późną porę, tak namodziłem, że dałem SysUtils do uses i PluginDef : TXMPDSP; jako zmienną lokalną i pewnie coś jeszcze zrobiłem, bo o dziwo plugin pokazal na liście nazwę "aaa", a także działąło jak trzeba About (teraz testuje je wywołując funkcje na starcie), ale jak dało się Add w opcjach by dodać plugin to XMPlay się wykrzaczal. I debil ze mnie, bo zamiast zapisać sobie kopię zapasową i kombinować dalej z wstępnie ładującym się pluginem zacząłem modzić i przestalo działać. Może ktoś z Was ma pomysł co jest nie tak względem tłumaczenia źródla z C++ na Delphi. Ja póki co idę spać, bo chyba nic nie wymyśle, a w programowaniu nie powinno być przypadków. Zły jestem na siebie, że nie zrobiłęm kopii wstepnie działającej, bo o ile pamiętam uruchomiłem drugi raz i to nie był przypadek, że zadziałąlo. I wyedytowałem ten post, bo częściowo już był postęp, ale właśnie osiągnałem go jakoś przypadkiem. Ech lama ze mnie, jak znowu dojdę z Waszą pomoca do tego jak zmusić plugin do działania to na pewno nie nadpisze źródła błędnymi zmianami w kodzie.

0

xmpdsp

  TAbout = procedure(Win : HWND); stdcall cdecl;

albo stdcall, albo cdecl. A w tym przypadku (WINAPI) to stdcall.

Name : PChar;

powinno być pansichar (bo w D2009 i nowszych to już nie to samo)

  TGetDescription = function(Inst : Pointer) : PChar; stdcall cdecl;
TGetDescription = function(Inst : Pointer) : PAnsiChar; stdcall;

xmpfunc

  QWORD = 0..High(Int64);
type QWORD = longword;
// Note all texts are UTF-8 on WinNT based systems, and ANSI on Win9x

Widzę że to olałeś. Na razie w porządku, póki nie będzie polskich liter w ścieżce.

  BOOL (WINAPI *IsPlaying)();

TIsPlaying = function : boolean; stdcall cdecl;

```delphi
TIsPlaying = function : LongBool; stdcall;

czyli w skrócie: wszędzie pansichar, stdcall, i longbool zamiast boolean.

0

Bardzo Tobie dziękuję. Zastosowałem się do Twoich porad, mimo że używam Delphi 7 to lepiej faktycznie użyć typu PAnsiChar niż PChar, bo może ktoś chcieć skompilować kod pod nowszym Delphi niż ja używam. Teraz plugin plus źródło są na: http://olesio.eu/xmp_mmkeys.zip rozwiązanie było banalne, otóż trzeba było rezultat eksportowanej funkcji rzutować na typ TXMPDSP tak jak poniżej. Najważniejsze, ze na to wpadłem i plugin działa tak jak założyłem, a nie jak jakiś multimedia control co obsługuje jeszcze inne playery, ale jest programem w trayu i do tego przywraca okno playara za każdym razem, prawdopodobnie w celu zasymulowania wciśnięcia klawisza (tak mi się zdaje).

function XMPDSP_GetInterface2(Face : DWORD; Faceproc : TInterfaceProc) : Pointer; stdcall;
begin
  with PluginDef do
  begin
    Flags := 0;
    Name := Plugin_Name;
    About := DSP_About;
    New := DSP_New;
    Free := DSP_Free;
    GetDescription := DSP_GetDescription;
    Config := DSP_Config;
    GetConfig := DSP_GetConfig;
    SetConfig := DSP_SetConfig;
    NewTrack := DSP_NewTrack;
    SetFormat := DSP_SetFormat;
    Reset := DSP_Reset;
    Process := DSP_Process;
  end;
  XmpFMisc := @XMPFUNC_MISC(FaceProc(XMPFUNC_MISC_FACE)^);
  Result := @TXMPDSP(PluginDef);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1