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.
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.
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;