Чтобы локализовать проблему (плагин отладчиком не погоняешь, да и падает 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.




 
 
