Skocz do zawartości

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


olesio

Polecane posty

Witam. Nie wiedzialem czy napisać do tego działu czy do C++, ale mam nadzieję, że wiele osób czyta oba, chociaż ostatnio ruch na forum mały w tych dwóch działach. Pytałem na 4p, ale nie każdy tam czyta, więc pytam i tutaj. Prosiłem już o pomoc Tostera, ale niewiele wskóraliśmy, bo On nie czuje się w C++ expertem, a ja tymbardziej 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 (nie mogłem dodać załącznika to wrzuciłem na www) i porównał z podkatalogu XMPLAY_SDK_CPP czy pliki xmpdsp.h i xmpfunc.h są dobrze przetłumaczone na Delphi do xmpdsp.pas oraz xmpfunc.pas. Bo mam problem z taką rzeczą. W źródle C++ mamy taką funkcję exportowaną:

library xmp_mmkeys;

uses
 Windows,
 xmpdsp in 'xmpdsp.pas',
 xmpfunc in 'xmpfunc.pas';

var
 Xmpfmisc : ^XMPFUNC_MISC;

procedure DSP_About(Win : HWND); stdcall cdecl;
begin
 MessageBox(Win, 'Test of plugin...', 'olesio plugin', MB_ICONINFORMATION + MB_OK);
end;

function XMPDSP_GetInterface2(Face : DWORD; Faceproc : TInterfaceProc) : TXMPDSP; stdcall cdecl;
begin
 MessageBox(0, '111', 'aaa', MB_OK);
 xmpfmisc := @XMPFUNC_MISC(FaceProc(XMPFUNC_MISC_FACE)^);
 MessageBox(0, '222', 'aaa', MB_OK);
end;

exports
 XMPDSP_GetInterface2;

begin
end.[/cpp]>
Podejrzewam, że w Delphi w exportowanej procedurze trzeba bedzie dać:
[delphi]  Result.Flags := 0;
 Result.Name := 'Nazwa';
 Result.About := DSP_About;

>

I w Delphi zrobiłem tak:

library xmp_mmkeys;

uses
 Windows,
 xmpdsp in 'xmpdsp.pas',
 xmpfunc in 'xmpfunc.pas';

var
 Xmpfmisc : ^XMPFUNC_MISC;

procedure DSP_About(Win : HWND); stdcall cdecl;
begin
 MessageBox(Win, 'Test of plugin...', 'olesio plugin', MB_ICONINFORMATION + MB_OK);
end;

function XMPDSP_GetInterface2(Face : DWORD; Faceproc : TInterfaceProc) : TXMPDSP; stdcall cdecl;
begin
 MessageBox(0, '111', 'aaa', MB_OK);
 xmpfmisc := @XMPFUNC_MISC(FaceProc(XMPFUNC_MISC_FACE)^);
 MessageBox(0, '222', 'aaa', MB_OK);
end;

exports
 XMPDSP_GetInterface2;

begin
end.[/cpp]>
Podejrzewam, że w Delphi w exportowanej procedurze trzeba bedzie dać:
[delphi]  Result.Flags := 0;
 Result.Name := 'Nazwa';
 Result.About := DSP_About;

I tak dalej. No ale właśnie utknąłęm, bo export jest chyba ok i ta zmienna Xmpfmisc jeżeli jest ok typu to potrzeba ją jakoś zdefiniować żeby pobrała importy funkcji aby na przykład pobrać uchwyt okna XMPlaya czy jego wersje lub inne. Możecie mając UPX'a w pathu i wypakowanego XMPlaya tam gdzie napisałem używać pack_reneme_copy.bat do pakowania zmiany nazwy (bo plugin musi nazywać się xmp-XXXXXX.dll i być w katalogu XMPlaya (aby zostal przez niego wykryry). Zawsze ten bat możecie zmodyfikować. Z góry dziękuję za pomoc. Męczyłe już jedną osobę na GG, ale też nie czuła się na siłach, poprawiłem kilka błędów bo wcześniej miałem funkcje na przykłąd about jako About : ^TAbout; ale ponoć tak nie trzeba i nie powinno się robić. Dlaczego jednak plugin nie pokazuje drugiego MessageBoxa, bo jeżeli obkomentuje tę nieprawidłową linijkę to pokazuje się drugi MessageBox oczywiście ale po wejściu do opcji następuje zamknięcie XMPlaya bo brakuje dodanych kilku funkcji obslugi pluginu i jego danych. Proszę więc o wskazówki co i jak poprawić aby się wykonał plugin jak należy. I wiem, że jest forum wsparcie un4seen, ale z tego co się zorientowałem to raczej niechętni są do języka Delphi, bo ktoś prosił kiedyś o tłumaczenie SDK i nic z tego.

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Dziękuję za odpowiedź, z faceproc już sobie poradziłem i jak widać w poprawionym kodzie na: http://olesio.eu/xmp_mmkeys.zip 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.

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Ponawiam, bo poradziłem sobie. Trochę cennych porad dostałem na 4p w tym wątku: http://forum.4programmers.net/Newbie/17739...dephi_-_problem i wszystko działa. Także tutaj wklejam rozwiązanie jakby ktoś miał kiedyś podobny problem. 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;

Pozdrawiam: olesio

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...