AIMP Forum

AIMP for Windows => Дополнения / Addons => Разработка / Development => Topic started by: Keannad on March 31, 2009, 19:27:58

Title: AIMP2 SDK on C#
Post by: Keannad on March 31, 2009, 19:27:58
Создаю тему по просьбе товарища Azarnik.

Захотелось мне как то, написать что-нибудь для хорошей программки AIMP. Только свое, чтоб не как у всех. Но к сожалению ни Дельфи, ни Паскаль я не перевариваю и переваривать не собираюсь. Поэтому решил задуматься над тем, как бы это сделать, но на том, на чём я умею. В этой теме поделюсь своим опытом создания плагинов для AIMP на C#.
Для начала код AIMP SDK для C#:
Я разделил его на 3 части
1. Константы.
Code: [Select]
using System;
using System.Drawing;

namespace AIMP_SDK.Units
{
    public class Units
    {
        public static readonly int WM_USER = 0x0400;
        public static readonly int AIMP_PLUGIN_NAME = 1;
        public static readonly int AIMP_PLUGIN_INFO = 2;
        public static readonly int AIMP_PLUGIN_AUTHOR = 3;
        public static readonly int AIMP_PLUGIN_EXTS = 4;
        // ==============================================================================
        // R E M O T E    I N F O
        // ==============================================================================
        public static readonly string AIMP2_RemoteClass = "AIMP2_RemoteInfo";
        public static readonly int AIMP2_RemoteFileSize = 2048;
        public static readonly object WM_AIMP_COMMAND = WM_USER + 0x75;
        // WParam = One of Command, LPARAM - Parameter
        // see parameters for AIMP_Status_Get/AIMP_Status_Set
        public static readonly int WM_AIMP_STATUS_GET = 1;
        public static readonly int WM_AIMP_STATUS_SET = 2;
        // HiWord of LParam - Command, LoWord of LParam - Parameter
        public static readonly int WM_AIMP_CALLFUNC = 3;
        // LPARAM - Func ID (see below Func ID for Addons)
        public static readonly int WM_AIMP_GET_VERSION = 4;
        public static readonly int WM_AIMP_STATUS_CHANGE = 5;
        public static readonly object WM_LANG = WM_USER + 101;
        // CallBack types
        public static readonly int AIMP_STATUS_CHANGE = 1;
        public static readonly int AIMP_PLAY_FILE = 2;
        public static readonly int AIMP_INFO_UPDATE = 5;
        // Update Info for current track
        public static readonly int AIMP_PLAYER_STATE = 11;
        // Play/Pause/Stop
        public static readonly int AIMP_EFFECT_CHANGED = 12;
        // Balance, Speed, Tempo, Pitch, Flanger and etc.
        public static readonly int AIMP_EQ_CHANGED = 13;
        // Sliders changed
        public static readonly int AIMP_TRACK_POS_CHANGED = 14;
        // AIMP_Status_Set / AIMP_Status_Get
        public static readonly int AIMP_STS_VOLUME = 1;
        public static readonly int AIMP_STS_BALANCE = 2;
        public static readonly int AIMP_STS_SPEED = 3;
        public static readonly int AIMP_STS_Player = 4;
        public static readonly int AIMP_STS_MUTE = 5;
        public static readonly int AIMP_STS_REVERB = 6;
        public static readonly int AIMP_STS_ECHO = 7;
        public static readonly int AIMP_STS_CHORUS = 8;
        public static readonly int AIMP_STS_Flanger = 9;
        public static readonly int AIMP_STS_EQ_STS = 10;
        public static readonly int AIMP_STS_EQ_SLDR01 = 11;
        public static readonly int AIMP_STS_EQ_SLDR02 = 12;
        public static readonly int AIMP_STS_EQ_SLDR03 = 13;
        public static readonly int AIMP_STS_EQ_SLDR04 = 14;
        public static readonly int AIMP_STS_EQ_SLDR05 = 15;
        public static readonly int AIMP_STS_EQ_SLDR06 = 16;
        public static readonly int AIMP_STS_EQ_SLDR07 = 17;
        public static readonly int AIMP_STS_EQ_SLDR08 = 18;
        public static readonly int AIMP_STS_EQ_SLDR09 = 19;
        public static readonly int AIMP_STS_EQ_SLDR10 = 20;
        public static readonly int AIMP_STS_EQ_SLDR11 = 21;
        public static readonly int AIMP_STS_EQ_SLDR12 = 22;
        public static readonly int AIMP_STS_EQ_SLDR13 = 23;
        public static readonly int AIMP_STS_EQ_SLDR14 = 24;
        public static readonly int AIMP_STS_EQ_SLDR15 = 25;
        public static readonly int AIMP_STS_EQ_SLDR16 = 26;
        public static readonly int AIMP_STS_EQ_SLDR17 = 27;
        public static readonly int AIMP_STS_EQ_SLDR18 = 28;
        public static readonly int AIMP_STS_REPEAT = 29;
        public static readonly int AIMP_STS_ON_STOP = 30;
        public static readonly int AIMP_STS_POS = 31;
        public static readonly int AIMP_STS_LENGTH = 32;
        public static readonly int AIMP_STS_REPEATPLS = 33;
        public static readonly int AIMP_STS_REP_PLS_1 = 34;
        public static readonly int AIMP_STS_KBPS = 35;
        public static readonly int AIMP_STS_KHZ = 36;
        public static readonly int AIMP_STS_MODE = 37;
        public static readonly int AIMP_STS_RADIO = 38;
        public static readonly int AIMP_STS_STREAM_TYPE = 39;
        // Music / CDA / Radio
        public static readonly int AIMP_STS_TIMER = 40;
        // Reverse / Normal
        public static readonly int AIMP_STS_SHUFFLE = 41;
        public static readonly int AIMP_STS_MAIN_HWND = 42;
        public static readonly int AIMP_STS_TC_HWND = 43;
        public static readonly int AIMP_STS_APP_HWND = 44;
        public static readonly int AIMP_STS_PL_HWND = 45;
        public static readonly int AIMP_STS_EQ_HWND = 46;
        public static readonly int AIMP_STS_TRAY = 47;
        // Support Exts Flags
        public static readonly int AIMP_PLS_EXTS = 1;
        public static readonly int AIMP_AUDIO_EXTS = 2;
        // Menu IDs
        public static readonly int AIMP_MAIN_MENU_OPN = 0;
        public static readonly int AIMP_MAIN_MENU_UTILS = 1;
        public static readonly int AIMP_MAIN_MENU_FNC = 2;
        public static readonly int AIMP_MAIN_MENU_CFG = 3;
        public static readonly int AIMP_UTILS_MENU = 4;
        public static readonly int AIMP_PLS_MENU_ADD = 5;
        public static readonly int AIMP_PLS_MENU_JUMP = 6;
        public static readonly int AIMP_PLS_MENU_FNC = 7;
        public static readonly int AIMP_PLS_MENU_SEND = 8;
        public static readonly int AIMP_PLS_MENU_DEL = 9;
        public static readonly int AIMP_ADD_MENU = 10;
        public static readonly int AIMP_DEL_MENU = 11;
        public static readonly int AIMP_FND_MENU = 12;
        public static readonly int AIMP_SRT_MENU = 13;
        public static readonly int AIMP_MSC_MENU = 14;
        public static readonly int AIMP_PLS_MENU = 15;
        public static readonly int AIMP_TRAY_UTILS = 16;
        public static readonly int AIMP_TRAY = 17;
        public static readonly int AIMP_EQ_LIB = 18;
        // AIMP_CallFunction
        public static readonly int AIMP_OPEN_FILES = 0;
        public static readonly int AIMP_OPEN_DIR = 1;
        public static readonly int AIMP_ABOUT = 2;
        public static readonly int AIMP_SLEEP_TIMER = 3;
        public static readonly int AIMP_UTILS_AC = 4;
        public static readonly int AIMP_UTILS_SR = 5;
        public static readonly int AIMP_UTILS_TE = 6;
        public static readonly int AIMP_UTILS_CDB = 7;
        public static readonly int AIMP_OPTIONS = 8;
        public static readonly int AIMP_PLUGINS = 9;
        public static readonly int AIMP_QUIT = 10;
        public static readonly int AIMP_NEXT_VIS = 11;
        public static readonly int AIMP_PREV_VIS = 12;
        public static readonly int AIMP_EQ_ANALOG = 13;
        public static readonly int AIMP_TO_TRAY = 14;
        public static readonly int AIMP_PLAY = 15;
        public static readonly int AIMP_PAUSE = 16;
        public static readonly int AIMP_STOP = 17;
        public static readonly int AIMP_NEXT = 18;
        public static readonly int AIMP_PREV = 19;
        public static readonly int AIMP_ADD_FILES = 20;
        public static readonly int AIMP_ADD_DIR = 21;
        public static readonly int AIMP_ADD_PLS = 22;
        public static readonly int AIMP_ADD_URL = 23;
        public static readonly int AIMP_DEL_FILES = 24;
        public static readonly int AIMP_DEL_BAD = 25;
        public static readonly int AIMP_DEL_FROMHDD = 26;
        public static readonly int AIMP_DEL_OFF = 27;
        public static readonly int AIMP_DEL_OFF_HDD = 28;
        public static readonly int AIMP_RESCAN_PLS = 29;
        public static readonly int AIMP_SHOW_CURFILE = 30;
        public static readonly int AIMP_SORT_INVERT = 31;
        public static readonly int AIMP_SORT_RANDOM = 32;
        public static readonly int AIMP_SORT_TITLE = 33;
        public static readonly int AIMP_SORT_ARTIST = 34;
        public static readonly int AIMP_SORT_FOLDER = 35;
        public static readonly int AIMP_SORT_LENGTH = 36;
        public static readonly int AIMP_SORT_RATING = 37;
        public static readonly int AIMP_SEARCH = 38;
        public static readonly int AIMP_OPEN_PLS = 39;
        public static readonly int AIMP_SAVE_PLS = 40;
        public static readonly int AIMP_PLAY_LAST = 41;
        public static readonly int AIMP_OFF_SELECTED = 42;
        public static readonly int AIMP_ON_SELECTED = 43;
        public static readonly int AIMP_ADD2BOOKMARK = 44;
        public static readonly int AIMP_EDITBOOKMARK = 45;
        // For AIMP_GetPath
        public static readonly int AIMP_CFG_DATA = 0;
        public static readonly int AIMP_CFG_PLS = 1;
        public static readonly int AIMP_CFG_LNG = 2;
        public static readonly int AIMP_CFG_SKINS = 3;
        public static readonly int AIMP_CFG_PLUGINS = 4;
        public static readonly int AIMP_CFG_ICONS = 5;
        public static readonly int AIMP_CFG_ML = 6;
        // For AIMP_QueryObject
        public static readonly int IAIMP2PlayerID = 0x0001;
        public static readonly int IAIMP2PlaylistManagerID = 0x0003;
        public static readonly int IAIMP2ExtendedID = 0x0004;
        // For AIMP_ObjectClass
        public static readonly int AIMP_EXT_LC_MESSAGE = 100;
        public static readonly int AIMP_EXT_ML_MESSAGE = 101;
        // Option Frame Position Flags
        public static readonly int AIMP_FRAME_POS_PLAY = 1;
        public static readonly int AIMP_FRAME_POS_PLAYLIST = 2;
        public static readonly int AIMP_FRAME_POS_PLAYER = 3;
        public static readonly int AIMP_FRAME_POS_TEMPLATE = 4;
        public static readonly int AIMP_FRAME_POS_SYSTEM = 5;
        public static readonly int AIMP_FRAME_POS_SKINS = 6;
        public static readonly int AIMP_FRAME_POS_LANGS = 7;
        // PluginFlags
        public static readonly int VIS_RQD_DATA_WAVE = 1;
        public static readonly int VIS_RQD_DATA_SPECTRUM = 2;
        public static readonly int VIS_RQD_NOT_SUSPEND = 4;
    } // end AIMP_SDK

}
В принципе в переводе с Делфи нет ничего сложного. Static они для того, чтобы не требовалось создавать экземпляр класса Units при каждом их использовании.

2.Интерфейсы
Code: [Select]
using System;
using System.Drawing;
using AIMP_SDK.Struct;

namespace AIMP_SDK
{
    public interface IPLSStrings
    {
        bool AddFile(string FileName, TAIMP2FileInfo FileInfo);
        bool DelFile(int ID);
        string GetFileName(int ID);
        bool GetFileInfo(int ID, TAIMP2FileInfo AInfo);
        int GetFileObj(int ID);
        int GetCount();
    } // end IPLSStrings

    // User option frame
    public interface IAIMP2OptionFrame
    {
        IntPtr FrameCreate(IntPtr AParent);
        object FrameData();
        // reserved
        int FrameFlags();
        // See FramePositionFlags
        string FrameName();
        void FrameFree(IntPtr AWindow);
        void FrameLoadConfigNotify();
        void FrameSaveConfigNotify();
    } // end IAIMP2OptionFrame

    // See IAIMPPlayerID
    public interface IAIMP2Player
    {
        int Version();
        bool PlayTrack(int ID, int ATrackIndex);
        void PlayOrResume();
        void Pause();
        void Stop();
        void NextTrack();
        void PrevTrack();
    } // end IAIMP2Player

    // See IAIMP2PlaylistManagerID
    public interface IAIMP2PlaylistManager
    {
        int AIMP_PLS_CreateFromFile(string AFile, bool AActivate, bool AStartPlay);
        int AIMP_PLS_ID_ActiveGet();
        bool AIMP_PLS_ID_ActiveSet(int ID);
        int AIMP_PLS_ID_PlayingGet();
        int AIMP_PLS_ID_PlayingGetTrackIndex(int ID);
        int AIMP_PLS_NewEx(string AName, bool AActivate);
        bool AIMP_PLS_PlayFile(string AFileName, bool AFailIfNotExists);
        // Playlist Processing
        bool AIMP_PLS_DeleteByFilter(int ID, object AFilterProc, int AUserData);
        bool AIMP_PLS_SortByFilter(int ID, object AFilterProc, int AUserData);
        // Entries
        bool AIMP_PLS_Entry_Delete(int ID, int AEntryIndex);
        bool AIMP_PLS_Entry_DeleteAll(int ID);
        bool AIMP_PLS_Entry_FileNameGet(int ID, int AEntryIndex, string PBuf, int ABufLen);
        bool AIMP_PLS_Entry_FileNameSet(int ID, int AEntryIndex, string PBuf);
        int AIMP_PLS_Entry_FocusedGet(int ID);
        bool AIMP_PLS_Entry_FocusedSet(int ID, int AEntryIndex);
        bool AIMP_PLS_Entry_InfoGet(int ID, int AEntryIndex, TAIMP2FileInfo PFileInfo);
        bool AIMP_PLS_Entry_InfoSet(int ID, int AEntryIndex, TAIMP2FileInfo PFileInfo);
        bool AIMP_PLS_Entry_PlayingSwitchGet(int ID, int AEntryIndex);
        bool AIMP_PLS_Entry_PlayingSwitchSet(int ID, int AEntryIndex, bool ASwitch);
        bool AIMP_PLS_Entry_ReloadInfo(int ID, int AEntryIndex);
        // Load/Save Playlists
        bool AIMP_PM_DestroyStream(int AHandle);
        int AIMP_PM_ReadItem(int AHandle, TAIMP2FileInfo PItem);
        int AIMP_PM_ReadStream(string AFileName, ref int Count);
        int AIMP_PM_SaveStream(string AFileName);
        int AIMP_PM_WriteItem(int AHandle, TAIMP2FileInfo PItem);
        // added in 2.50 B295
        bool AIMP_PLS_ID_PlayingSetTrackIndex(int ID, int AEntryIndex);
    } // end IAIMP2PlaylistManager

    // See IAIMP2ExtendedID
    public interface IAIMP2Extended
    {
        int AIMP_GetPath(int ID, string ABuffer, int ACount);
        bool AIMP_ObjectClass(int ID, object AData, bool ARegister);
        // User Option Dialogs
        int AIMP_Options_FrameAdd(IAIMP2OptionFrame AFrame);
        int AIMP_Options_FrameRemove(IAIMP2OptionFrame AFrame);
        int AIMP_Options_ModifiedChanged(IAIMP2OptionFrame AFrame);
    } // end IAIMP2Extended

    public interface IAIMP2Controller
    {
        bool IsUnicodeVersion();                                   
        // Must be True CallBack
        bool AIMP_CallBack_Set(int dwCBType, object Proc, int User);
        bool AIMP_CallBack_Remove(int dwCBType, object Proc);
        // Status
        int AIMP_Status_Get(int StatusType);
        bool AIMP_Status_Set(int StatusType, int Value);
        // Playlist
        bool AIMP_PLS_Clear(int ID);
        bool AIMP_PLS_Delete(int ID);
        int AIMP_PLS_New(string Name);
        bool AIMP_PLS_Info(int Index, out TPLSInfo PLSInfo);
        ushort AIMP_PLS_Count();
        bool AIMP_PLS_GetFiles(int ID, out IPLSStrings Strings);
        bool AIMP_PLS_GetSelFiles(int ID, out IPLSStrings Strings);
        bool AIMP_PLS_AddFiles(int ID, IPLSStrings Strings);
        bool AIMP_PLS_SetPLS(int ID);
        // System
        bool AIMP_NewStrings(out IPLSStrings Strings);
        bool AIMP_GetCurrentTrack(TAIMP2FileInfo AInfo);
        bool AIMP_QueryInfo(string Filename, TAIMP2FileInfo AInfo);
        int AIMP_GetSystemVersion();
        bool AIMP_CallFunction(int FuncID);
        int AIMP_GetLanguage(string Str, int ACount);
        int AIMP_GetCfgPath(string Str, int ACount);
        int AIMP_GetSupportExts(int Flags, string Str, int BufSize);
        // Menu
        object AIMP_Menu_CreateEx(object Parent, TAIMPMenuInfo MenuInfo);
        object AIMP_Menu_Create(int MenuID, TAIMPMenuInfo MenuInfo);
        bool AIMP_Menu_Update(object Handle, TAIMPMenuInfo MenuInfo);
        bool AIMP_Menu_Remove(object Handle);
        // extantion
        bool AIMP_QueryObject(int ObjectID, ref object Obj);
    } // end IAIMP2Controller

    public interface IAIMP2InputStream
    {
        bool GetPositions(ref long ALength, ref long APosition);
        bool GetStreamInfo(TInputInfo AInputInfo);
        long SetPosition(long APosition);
        bool ReadData(object ABuffer, ref int ALength);
    } // end IAIMP2InputStream

    public interface IAIMP2InputPlugin
    {
        string AuthorName();
        string PluginName();
        string PluginSupportExts();
        bool GetFileInfo(string AFile, TAIMP2FileInfo ATags);
        bool IsOurFile(string AFile);
        IAIMP2InputStream StreamCreate(string AFile, TAIMP2FileInfo ATags);
        void ConfigWindow(IntPtr AParent);
        void Deinitialize();
        void Initialize(IAIMP2Controller AIMPClassic);
    } // end IAIMP2InputPlugin

    public interface IAIMP2VisualPlugin
    {
        string AuthorName();
        string PluginName();
        string PluginInfo();
        int PluginFlags();
        bool Initialize();
        void Deinitialize();
        void DisplayClick(int X, int Y);
        //void DisplayRender(HDC DC, TVisualData AData);
        //void DisplayResize(int AWidth, int AHeight);
    } // end IAIMP2VisualPlugin

}
В принципе тоже ничего сложного. Благо дело интерфейсы присутствуют в C#. В структурах HWND от дельфи заменяется на IntPtr, TBitmap на Bitmap из библиотеки System.Drawing. И ещё пришлось убрать 2 функции из структуры IAIMP2InputPlugin (void DisplayRender(HDC DC, TVisualData AData) и void DisplayResize(int AWidth, int AHeight)) потому как я не совсем понимаю какие в них передаются параметры и чем их заменить. Больше это относиться к void DisplayRender(HDC DC, TVisualData AData).
Title: Re: AIMP2 SDK on C#
Post by: Keannad on March 31, 2009, 19:42:07
3. Структуры
Code: [Select]
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace AIMP_SDK.Struct
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
    public struct TAIMP2FileInfo
    {
        public int cbSizeOf;
        //
        public bool nActive;
        public int nBitRate;
        public int nChannels;
        public int nDuration;
        public long nFileSize;
        public int nRating;
        public int nSampleRate;
        public int nTrackID;
        //
        public int nAlbumLen;
        public int nArtistLen;
        public int nDateLen;
        public int nFileNameLen;
        public int nGenreLen;
        public int nTitleLen;
        //
        public string sAlbum;
        public string sArtist;
        public string sDate;
        public string sFileName;
        public string sGenre;
        public string sTitle;
    } // end TAIMP2FileInfo

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
    public unsafe struct TPLSInfo
    {
        public string PLSName;
        public int FileCount;
        public int PLSDuration;
        public long PLSSize;
        public int PlaylistID;
    } // end TPLSInfo

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
    public unsafe struct TAIMPMenuInfo
    {
        public bool CheckBox;
        public bool RadioItem;
        public bool Checked;
        public bool Enabled;
        public object Proc;     // TAIMPMenuProc;
        public Bitmap Bitmap;   // 0 - no bmp
        public string Caption;
        public int User;
    } // end TAIMPMenuInfo

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
    public unsafe struct TAIMPAddonHeader
    {
        public byte Version;
        public int DllInstance;
        public object GetPlgName;   //Proc;
        public object GetAuthor;    //Proc;
        public object Init;         //Proc;
        public object Config;       //Proc;
        public object Free;         //Proc;
    } // end TAIMPAddonHeader

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
    public unsafe struct TInputInfo
    {
        public int SampleRate;
        public int Bits;
        public int Channels;
    } // end TInputInfo

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)]
    public unsafe struct TVisualData
    {
        public int LevelR;
        public int LevelL;
        public byte[,] Spectrum;
        public sbyte[,] WaveForm;
    } // end TVisualData

}
А вот здесь уже сложнее. Почему? Потому что C# создаёт так называемый управляемый код. Типа безопасная работа с памятью, доступ к обьектам, а вот Дельфи, как говориться, работает по старинке, напрямую.

Я сам толком не магу обьяснить как всё точно работает, ибо не специалист.

Особо проблемы возникают со структурами TAIMPMenuInfo и TAIMPAddonHeader в которых, как видно, передаются ссылки на обьекты функций. Как это сдалать в C# я пока не знаю, не пробовал. В остальном вроде всё понятно.

Code: [Select]
public object Proc;             <--
       
public object GetPlgName;  <--
public object GetAuthor;     <--
public object Init;               <--
public object Config;          <--
public object Free;             <--

Эти три блока кода компиляться как Class Library в Visual Studio. Подключаются к другому проэкту как обычный Reference, с использованием ключевого слова using AIMP_SDK (в моём случае).

Вообще, главная проблема при написании плагинов для AIMP'a как раз заключается в связывании Managed и UnManaged кода. В том смысле, что Любой обьект написаный в Visual Studio, является COM обьектом(Managed) и не экспортирует функции в понимании AIMP'a(UnManaged). По сути дела скомпиленная ДЛЛ не будет являть плагином потому как UnManaged-код не сможет вызвать Managed-код. А AIMP с COM обьектами работать не умеет.

Покопавшись немного в Гугле, я нашел решение этой проблемы, но опробовать его руки пока не дошли. Желающие могут посмотреть здесь (http://www.codeguru.com/csharp/csharp/cs_misc/dllsandexecutables/article.php/c4239) или здесь (http://netobf.com/add+dll+export+csharp). Может найду ещё что полезного.
Title: Re: AIMP2 SDK on C#
Post by: Azarnik on March 31, 2009, 21:20:05
ещё раз спасибо )
Title: Дополню немного..
Post by: mas912 on September 01, 2009, 01:38:56
1)
Quote
public class Units
public static class Units

2) Для большинства констант лучше использовать перечисления (enum):
Code: [Select]
public enum PluginInfo { Name = 1, Info, Author, Exts);И не бойтесь переименовывать константы, имхо, здесь лучше следовать стилю C# (camel case в именах типов).

3) Все структуры в SDK выравнены на границу байта
Code: [Select]
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
    public struct TAIMP2FileInfo

4)
Quote
Особо проблемы возникают со структурами TAIMPMenuInfo и TAIMPAddonHeader
Для этого есть маршаллинг.
Title: Re: AIMP2 SDK on C#
Post by: Vitaly Dyatlov on September 05, 2009, 19:54:34
Если много тех, кто хочет писать плагины на C# пишите мне в личку. Если наберется больше 3 человек, сделаю врапер для Шарпа, и появится возможность писать на своем любимом языке  ;)
Title: Re: AIMP2 SDK on C#
Post by: Keannad on September 06, 2009, 23:18:21
Я был бы не против писать плагины для AIMPa на шарпе...
Но хотелось бы поодержки таких плагинов самим AIMP'ом.. ))
Title: Re: AIMP2 SDK on C#
Post by: mas912 on September 07, 2009, 01:51:40
Keannad
Для этого автору нужно добавить поддержку COM в интерфейсы SDK (сейчас они не полноценные). В принципе, это не сложно, но нужно время и желание ;)

По поводу стороннего SDK для шарпа - это тоже решаемо, но есть два нюанса: штатными средствами не экспортируются функции из DLL и вышеупомянутые интерфейсы.
Первое можно сделать сторонними утилитами, добавляющими таблицу экспорта. Второе - написанием небольшого генератора кода, который сгенерировал бы врапперы для интерфейсов.

Наверное, можно спросить автора, Artem'a, согласится ли он исправить интерфейсы плагинов. Если да, то подождём, если нет, могу сделать враппер (или DyatlovVitaliy пусть сделает).
Title: Re: AIMP2 SDK on C#
Post by: Keannad on September 07, 2009, 22:32:01
Keannad
... Первое можно сделать сторонними утилитами, добавляющими таблицу экспорта. ...

Подскажи хоть парочку, которые автоматом делают таблицу экспорта... Самому интересно...
Title: Re: AIMP2 SDK on C#
Post by: mas912 on September 07, 2009, 23:44:42
Inquartos Obfuscator, платный, среди прочего умеет экспортировать. Иногда криво :)
Вот эта (http://www.codeproject.com/KB/dotnet/DllExport.aspx) утиль. Дубовая, но сорцы есть, можно дописать (http://www.kiloupload.com/file/6423f235cfe7ad8f294bab8b549830d3/ExportDll.zip) по нужде.
Title: Re: AIMP2 SDK on C#
Post by: Vitaly Dyatlov on September 08, 2009, 12:52:16
Для этого автору нужно добавить поддержку COM в интерфейсы SDK (сейчас они не полноценные). В принципе, это не сложно, но нужно время и желание ;)
Извините, не понимаю как поддержка COM может быть более полноценной и как это влияет на C# (ведь в любом случае загружает плагин плеер  ???).
Я был бы не против писать плагины для AIMPa на шарпе...
Но хотелось бы поодержки таких плагинов самим AIMP'ом.. ))
Для этого всего в API плеера нужно добавить промежуточный интерфейс загрузки плагинов, т.е. фактически разрешить управлять загрузкой плагинов другому плагину. Думаю в ближайшие год-два этого не будет реализовано автором. Вообще по минимуму неплохо было бы сделать возможность при запросе интерфейса плагина отдачу не самого плагина, а массива интерфейсов плагинов. Из этого уже можно было бы лепить что-то.

Вообще у меня давно витает бредовая идея написать универсальный врапер, который бы позволял писать плагины на любом языке (включая JavaScript, Python и Perl). Так что я в поиске единомышленников.

P.S.: В личку пока ни одного сообщения по поводу создания врапера не поступало.
Title: Re: AIMP2 SDK on C#
Post by: mas912 on September 08, 2009, 19:09:36
Quote
Извините, не понимаю как поддержка COM может быть более полноценной и как это влияет на C#
Попробуйте, например, описать один из интерфейсов AIMP'a и попытаться его использовать в шарпе: вы получите небольшой бабах с кодом E_NOINTERFACE ;) Это примерно как выставить ComVisible(false), если понимаете, о чём я.

Quote
разрешить управлять загрузкой плагинов другому плагину
А сейчас разве это запрещено?

Quote
идея написать универсальный врапер, который бы позволял писать плагины на любом языке (включая JavaScript, Python и Perl)
swig в помощь)
Title: Re: AIMP2 SDK on C#
Post by: Vitaly Dyatlov on September 09, 2009, 01:05:36
А сейчас разве это запрещено?

В текущей реализации одна Dll - один плагин. Я хочу: одна Dll - много плагинов.

За swig Спасибо!  ;)
Title: Re: AIMP2 SDK on C#
Post by: mas912 on September 09, 2009, 11:48:16
Ну написать свой загрузчик в виде плагина, со своей логикой загрузки и управления других плагов.
Title: Re: AIMP2 SDK on C#
Post by: foreground on December 16, 2009, 01:29:00
ComVisible(false), если понимаете, о чём я.
А сейчас разве это запрещено?
Поддержки комы нет и не будет я так подозреваю. И еще автор против .NET  :-X.

Ну написать свой загрузчик в виде плагина, со своей логикой загрузки и управления других плагов.
Вы наверно осознаёте насколько геморно будет поддерживать такой вариант?  :)
Title: Re: AIMP2 SDK on C#
Post by: mas912 on December 16, 2009, 12:58:43
Ну не знаю, было бы желание 8)

Пока оно было, я сделал генератор интерфейсов для до-диеза, а вот чтобы описать все (или сгенерировать по дельфийским объявлениям) уже нет интереса.
Title: Re: AIMP2 SDK on C#
Post by: bescheidener on December 23, 2009, 21:57:37
У меня вопрос по SDK для Builder'a. Я в этом полнейший (ну может не совсем) нуб, но хочу написать аддон и пишу. Так вот... мне надо узнать, активно ли сейчас GW. Смогу ли я? :) и как? Желателен семпл.
Title: Re: AIMP2 SDK on C#
Post by: bescheidener on December 25, 2009, 19:15:24
Проблему решил.
Title: Re: AIMP2 SDK on C#
Post by: freeman on January 03, 2010, 18:29:01
Чего-то я не понял. Сначала Keannad разместил якобы сдк для шарпа, а потом автор пишет:
Quote
Но хотелось бы поодержки таких плагинов самим AIMP'ом.. ))

А для чего тогда сдк?
Title: Re: AIMP2 SDK on C#
Post by: Keannad on January 07, 2010, 22:28:55
Можно реализовать взаимодействие других программ с АИМПом, но не возможно написать полноценный плагин с которым будет работать АИМП.
Title: Re: AIMP2 SDK on C#
Post by: freeman on January 09, 2010, 22:23:35
Взаимодействие посредством сообщений?
Все, что можно сделать с помощью этого сдк - использовать юниты для отправки сообщений?
Title: Re: AIMP2 SDK on C#
Post by: KP0H on April 19, 2011, 15:19:52
CDK под C# так и не появилось?
Title: Re: AIMP2 SDK on C#
Post by: FramePS2 on April 19, 2011, 20:18:53
CDK под C# так и не появилось?

Посмотри .NET Interop Plugin (https://www.aimp.ru/forum/index.php?topic=21774.0)