0 Members and 1 Guest are viewing this topic.
#include "apiPlugin.h"#include "apiCore.h"class MySuperPlugin: public IAIMPPlugin{ ULONG refCount;public: MySuperPlugin() : refCount(0) {} HRESULT WINAPI QueryInterface(REFIID riid, void** ppv) { if (!ppv) return E_POINTER; if (riid == IID_IUnknown) { *ppv = this; AddRef(); return S_OK; } return E_NOINTERFACE; } ULONG WINAPI AddRef() { return InterlockedIncrement(&refCount); } ULONG WINAPI Release() { ULONG count = InterlockedDecrement(&refCount); if (count == 0) { delete this; } return count; } TChar* WINAPI InfoGet(int index) { return const_cast<TChar*>(L"MySuperPlugin"); } HRESULT WINAPI Initialize(IAIMPCore *core) { return S_OK; } HRESULT WINAPI Finalize() { return S_OK; } LongWord WINAPI InfoGetCategories() { return AIMP_PLUGIN_CATEGORY_ADDONS; }; void WINAPI SystemNotification(int notifyID, IUnknown *Data) {}};HRESULT __declspec(dllexport) WINAPI AIMPPluginGetHeader(void **plugin) { *plugin = new MySuperPlugin(); return S_OK;}
cmake_minimum_required(VERSION 4.0.0)project(MySuperPlugin)set(CMAKE_CXX_STANDARD 23)set(CMAKE_CXX_STANDARD_REQUIRED)include_directories("lib/aimp_sdk/include")add_library(${PROJECT_NAME} SHARED "src/MySuperPlugin.cpp")if(CMAKE_SIZEOF_VOID_P EQUAL 8) message(STATUS "Configuring for 64-bit")else() message(STATUS "Configuring for 32-bit")endif()set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
HRESULT __declspec(dllexport) WINAPI AIMPPluginGetHeader(void **plugin) { *plugin = new MySuperPlugin(); return S_OK;}
плагин, который ничего не делает. Ни документации, ни хендбука для C++ на просторах интернета нет
в студии нужно указать список функций для экспорта через def
LIBRARY "MySuperPlugin"EXPORTS AIMPPluginGetHeader
add_library(${PROJECT_NAME} SHARED "src/MySuperPlugin.cpp" "src/MySuperPlugin.def")set_source_files_properties("src/MySuperPlugin.def" EXPORT_PROPERTIES)
но добавил его в неиспользуемые
Туда плагины попадают, если Initialize вернул не 0
HRESULT WINAPI Initialize(IAIMPCore *core) { IAIMPString** testString = nullptr; if (SUCCEEDED(core->CreateObject(IID_IAIMPString, (void**)testString))) { TChar helloWorldText[] = L"Hello world!"; (*testString)->SetData(helloWorldText, wcslen(helloWorldText)); IAIMPServiceMessageDispatcher **messageService = nullptr; if (SUCCEEDED(core->QueryInterface(IID_IAIMPServiceMessageDispatcher, (void**)messageService))) { HWND aimpHwnd = NULL; (*messageService)->Send(AIMP_MSG_PROPERTY_HWND, AIMP_MSG_PROPVALUE_GET, &aimpHwnd); MessageBoxW( aimpHwnd, (*testString)->GetData(), L"AIMP", MB_OK ); (*testString)->Release(); return S_OK; } } return E_ABORT;}
Да, я просто забыл что переписывал метод Initialize, видимо он возвращает E_ABORT из-за того что что-то идёт не такCode: [Select]HRESULT WINAPI Initialize(IAIMPCore *core) { IAIMPString** testString = nullptr; if (SUCCEEDED(core->CreateObject(IID_IAIMPString, (void**)testString))) { TChar helloWorldText[] = L"Hello world!"; (*testString)->SetData(helloWorldText, wcslen(helloWorldText)); IAIMPServiceMessageDispatcher **messageService = nullptr; if (SUCCEEDED(core->QueryInterface(IID_IAIMPServiceMessageDispatcher, (void**)messageService))) { HWND aimpHwnd = NULL; (*messageService)->Send(AIMP_MSG_PROPERTY_HWND, AIMP_MSG_PROPVALUE_GET, &aimpHwnd); MessageBoxW( aimpHwnd, (*testString)->GetData(), L"AIMP", MB_OK ); (*testString)->Release(); return S_OK; } } return E_ABORT;}
для построения UI старайтесь использовать возможности apiGUI заместо стандартных виндовых
{ IAIMPUIAuthDialog }
Когда я написал "hello world" через apiGUI, заметил что в sdk 540 в ahiGUI.h в 1166 строке стоит
проверил, в актуальном SDK все корректно.