0 Members and 1 Guest are viewing this topic.
ha=FindWindow(AIMP2_RemoteClass, AIMP2_RemoteClass);(FARPROC &)SwitchToThisWindow = GetProcAddress(hLib, "SwitchToThisWindow");SwitchToThisWindow(ha,true);
ShowWindow(Handle, SW_SHOWNOACTIVATE)
SetWindowLongPtr(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW | WS_EX_LAYERED);
ASavedFocus := GetFocus;...SetFocus(ASavedFocus);
IAIMPAddonHeader - этот интерфейс должен реализовывать плагин и отдавать его плееру при обращении к AIMP_QueryAddonEx
В дельфи есть такой класс TInterfacedObject, он уже имеет в себе реализацию IUnknown, поэтому Вам не нужно заморачиваться на этот счет.
Спасибо, с этим я уже разобрался (нашел архив Tests+for+Addons, не очень удобно, что файлы разбросаны по всему форуму... .
Существует какой-нибудь более быстрый способ для связи с Вами, например, Аська?
...Хотелось бы посмотреть пример минимальной реализации (можно без тел функций) плагина-аддона к SDK v2.60...
см. пост №12.
class IIAIMPAddonHeader :public IAIMPAddonHeader{ protected: int m_nRefCount; public: BOOL WINAPI GetHasSettingsDialog() { return 1; } PWCHAR WINAPI GetPluginAuthor() { ShowMessage("GetAutorFunc"); //wchar_t* return (wchar_t*)"ildarM"; } PWCHAR WINAPI GetPluginName() { ShowMessage("GetPluginName"); return (wchar_t*)"to flylink"; } void WINAPI Finalize() { int i; } void WINAPI Initialize(IAIMP2Controller *AController) { ShowMessage("InitFunc"); } void WINAPI ShowSettingsDialog(HWND AParentWindow) { int i; } STDMETHOD(QueryInterface)( REFIID refiid, void FAR* FAR* ppvObject ) { *ppvObject = ( refiid == IID_IUnknown ) ? this : NULL; if ( *ppvObject != NULL ) ( (LPUNKNOWN)*ppvObject )->AddRef(); return *ppvObject == NULL ? E_NOINTERFACE : S_OK; } STDMETHOD_(ULONG, AddRef)( void ) { return ++m_nRefCount; } STDMETHOD_(ULONG, Release)( void ) { int nRefCount = --m_nRefCount; if ( nRefCount == 0 ) delete this; return nRefCount; }};extern "C" __declspec (dllexport) BOOL __stdcall AIMP_QueryAddonEx(IAIMPAddonHeader *AHeader){ AHeader = new IIAIMPAddonHeader; return 1;}
library aimp_addon;uses AIMP_SDK;type TMainClass = class(TInterfacedObject, IAIMPAddonHeader) function GetHasSettingsDialog: LongBool; stdcall; function GetPluginAuthor: PWideChar; stdcall; function GetPluginName: PWideChar; stdcall; procedure Finalize; stdcall; procedure Initialize(AController: IAIMP2Controller); stdcall; procedure ShowSettingsDialog(AParentWindow: HWND); stdcall; end;procedure TMainClass.Initialize(AController: IAIMP2Controller);begin // Тут вы инициализируете/создаете все компоненты вашего плагина, т.е. меню // окна и т.д.end;procedure TMainClass.Finalize;begin // В этой процедуре нужно освобождать все ресурсы // созданные в Initializeend;function TMainClass.GetPluginAuthor: PWideChar;begin Result := 'Автор плагина';end;function TMainClass.GetPluginName: PWideChar;begin Result := 'Название плагина';end;function TMainClass.GetHasSettingsDialog: LongBool;begin // Если есть окно с настройками то возвращаете True // иначе False Result := False;end;procedure TMainClass.ShowSettingsDialog(AParentWindow: HWND);begin // Если имеется окно с настройками, показываем его, // иначе эта процедура игнорируетсяend;function AIMP_QueryAddonEx(out AHeader: IAIMPAddonHeader): LongBool; stdcall;begin // Тут необходимо вернуть ссылку на интерфейс, в нашем случае // это будет выглядеть так: AHeader := TMainClass.Create; Result := True;end;exports AIMP_QueryAddonEx;beginend.