Чтобы локализовать проблему (плагин отладчиком не погоняешь, да и падает TC), до предела упростил код (пока даже логику работы плагина поломал). В результате плагин стал загружаться и корректно вызывать проигрыватель. Но есть одно "но" - пока работает проигрыватель, окно TC "висит". После закрытия проигрывателя управление корректно возвращается TC.
Кто-нибудь писал wlx-плагин на Lazarus (именно под TC, а не DC)?
Вот нынешний код:
- Код: Выделить всё
library AmpView;
{$MODE Delphi}
uses
Windows, wlxplugin,
SysUtils;
const
PARSE_FUNCTION = 'MULTIMEDIA | EXT="MP3" | EXT="WAV" | EXT="WMA" |'+
'EXT="OGG" | EXT="CDA" | EXT="MO3" | EXT="IT" |'+
'EXT="XM" | EXT="S3M" | EXT="MOD" | EXT="M3U" |'+
'EXT="PLS" | EXT="MID"| EXT="MIDI" | EXT="KAR"';
var
wc: TWndClass;
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var
LW: HWND;
begin
LW:=GetParent(wnd);
PostMessage(LW, $0100, 27, 0);
Result := DefWindowProc(wnd,msg,wparam,lparam);
end;
function CallKiller(aListerWindow:HWND):HWND;
begin
result:=CreateWindowEx(WS_EX_CONTROLPARENT,'AMPVIEW_PLAYER','AMPVIEW_PLAYER',WS_CHILD or WS_VISIBLE or WS_CLIPSIBLINGS,0,0,10,10,aListerWindow,0,Hinstance,nil);
end;
function ListLoad(ParentWin: HWND; FileToLoad: pchar; ShowFlags: integer): HWND; stdcall;
var
PlayerExe: string;
begin
PlayerExe:='c:\Program Files\Total Commander 7.56\Plugins\wlx\AmpView\AmpView.exe';
Result := CallKiller(ParentWin);
if Result = 0 then Exit;
SetWindowPos(ParentWin, 0, -100, -100, 0, 0, SWP_HIDEWINDOW);
SysUtils.ExecuteProcess(PlayerExe, ['\n', FileToLoad]);
end;
procedure ListGetDetectString(DetectString: pchar; maxlen: integer); stdcall;
begin
StrLCopy(DetectString, PChar(PARSE_FUNCTION), MaxLen);
end;
exports
ListLoad,
ListGetDetectString;
begin
WC.lpfnWndProc := @WindowProc;
WC.style := CS_VREDRAW or CS_HREDRAW;
WC.hInstance := hInstance;
WC.hIcon := 0;
WC.hCursor := LoadCursor(0,IDC_ARROW);
WC.hbrBackground := CreateSolidBrush( COLOR_BTNFACE+1 );
WC.lpszMenuName := nil;
WC.cbClsExtra := 0;
WC.cbWndExtra := 0;
wc.lpszClassName := 'AMPVIEW_PLAYER';
Windows.RegisterClass(wc);
end.