<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.shoutcast.com/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.shoutcast.com/index.php?action=history&amp;feed=atom&amp;title=Media_Library_API</id>
		<title>Media Library API - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.shoutcast.com/index.php?action=history&amp;feed=atom&amp;title=Media_Library_API"/>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;action=history"/>
		<updated>2026-05-19T20:53:31Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.22.3</generator>

	<entry>
		<id>http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=61412&amp;oldid=prev</id>
		<title>Culix: Reverted edits by Iseficibuw (Talk) to last version by Culix</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=61412&amp;oldid=prev"/>
				<updated>2010-11-30T03:27:41Z</updated>
		
		<summary type="html">&lt;p&gt;Reverted edits by &lt;a href=&quot;/wiki/Special:Contributions/Iseficibuw&quot; title=&quot;Special:Contributions/Iseficibuw&quot;&gt;Iseficibuw&lt;/a&gt; (&lt;a href=&quot;/index.php?title=User_talk:Iseficibuw&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Iseficibuw (page does not exist)&quot;&gt;Talk&lt;/a&gt;) to last version by &lt;a href=&quot;/wiki/User:Culix&quot; title=&quot;User:Culix&quot;&gt;Culix&lt;/a&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;amp;diff=61412&amp;amp;oldid=61362&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Culix</name></author>	</entry>

	<entry>
		<id>http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=61362&amp;oldid=prev</id>
		<title>Iseficibuw at 05:11, 24 November 2010</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=61362&amp;oldid=prev"/>
				<updated>2010-11-24T05:11:24Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;amp;diff=61362&amp;amp;oldid=58859&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Iseficibuw</name></author>	</entry>

	<entry>
		<id>http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=58859&amp;oldid=prev</id>
		<title>Culix: +cat :Category:Articles; :Category:Articles that need work</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=58859&amp;oldid=prev"/>
				<updated>2009-06-10T14:15:57Z</updated>
		
		<summary type="html">&lt;p&gt;+cat &lt;a href=&quot;/wiki/Category:Articles&quot; title=&quot;Category:Articles&quot;&gt;Category:Articles&lt;/a&gt;; &lt;a href=&quot;/wiki/Category:Articles_that_need_work&quot; title=&quot;Category:Articles that need work&quot;&gt;Category:Articles that need work&lt;/a&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 14:15, 10 June 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 686:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 686:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;} file_set_ratingW;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;} file_set_ratingW;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Articles]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Articles that need work]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key winamp_wiki:diff:version:1.11a:oldid:921:newid:58859 --&gt;
&lt;/table&gt;</summary>
		<author><name>Culix</name></author>	</entry>

	<entry>
		<id>http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=921&amp;oldid=prev</id>
		<title>Tarik: Protected &quot;Media Library API&quot; [edit=autoconfirmed:move=autoconfirmed]</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=921&amp;oldid=prev"/>
				<updated>2008-09-25T13:05:23Z</updated>
		
		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/wiki/Media_Library_API&quot; title=&quot;Media Library API&quot;&gt;Media Library API&lt;/a&gt;&amp;quot; [edit=autoconfirmed:move=autoconfirmed]&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 13:05, 25 September 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Tarik</name></author>	</entry>

	<entry>
		<id>http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=762&amp;oldid=prev</id>
		<title>Benski at 16:06, 15 September 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/index.php?title=Media_Library_API&amp;diff=762&amp;oldid=prev"/>
				<updated>2008-09-15T16:06:57Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Messages sent to your plugin's MessageProc ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// return values from the winampUninstallPlugin(HINSTANCE hdll, HWND parent, int param)&lt;br /&gt;
// which determine if we can uninstall the plugin immediately or on winamp restart&lt;br /&gt;
//&lt;br /&gt;
// uninstall support was added from 5.0+ and uninstall now support from 5.5+&lt;br /&gt;
// it is down to you to ensure that if uninstall now is returned that it will not cause a crash&lt;br /&gt;
// (ie don't use if you've been subclassing the main window)&lt;br /&gt;
#define ML_PLUGIN_UNINSTALL_NOW    0x1&lt;br /&gt;
#define ML_PLUGIN_UNINSTALL_REBOOT 0x0&lt;br /&gt;
&lt;br /&gt;
// messages your plugin may receive on MessageProc()&lt;br /&gt;
&lt;br /&gt;
#define ML_MSG_TREE_BEGIN 0x100&lt;br /&gt;
  #define ML_MSG_TREE_ONCREATEVIEW 0x100 // param1 = param of tree item, param2 is HWND of parent. return HWND if it is us&lt;br /&gt;
&lt;br /&gt;
  #define ML_MSG_TREE_ONCLICK  0x101 // param1 = param of tree item, param2 = action type (below), param3 = HWND of main window&lt;br /&gt;
    #define ML_ACTION_RCLICK 0    // return value should be nonzero if ours&lt;br /&gt;
    #define ML_ACTION_DBLCLICK 1&lt;br /&gt;
    #define ML_ACTION_ENTER 2&lt;br /&gt;
		#define ML_ACTION_LCLICK 3&lt;br /&gt;
&lt;br /&gt;
  #define ML_MSG_TREE_ONDROPTARGET 0x102 // param1 = param of tree item, param2 = type of drop (ML_TYPE_*), param3 = pointer to data (or NULL if querying).&lt;br /&gt;
                                      // return -1 if not allowed, 1 if allowed, or 0 if not our tree item&lt;br /&gt;
&lt;br /&gt;
  #define ML_MSG_TREE_ONDRAG 0x103 // param1 = param of tree item, param2 = POINT * to the mouse position, and param3 = (int *) to the type&lt;br /&gt;
                                  // set *(int*)param3 to the ML_TYPE you want and return 1, if you support drag&amp;amp;drop, or -1 to prevent d&amp;amp;d.&lt;br /&gt;
&lt;br /&gt;
  #define ML_MSG_TREE_ONDROP 0x104 // param1 = param of tree item, param2 = POINT * to the mouse position&lt;br /&gt;
                                  // if you support dropping, send the appropriate ML_IPC_HANDLEDROP using SendMessage() and return 1, otherwise return -1.&lt;br /&gt;
&lt;br /&gt;
  #define  ML_MSG_TREE_ONKEYDOWN 0x105  // Send when key pressed &lt;br /&gt;
										// param1 = param of tree item;&lt;br /&gt;
										// param2 = pointer to NMTVKEYDOWN&lt;br /&gt;
										// param3 = tree hwnd&lt;br /&gt;
										// return 0 if it's not yours, 1 if it is&lt;br /&gt;
&lt;br /&gt;
#define ML_MSG_TREE_END 0x1FF // end of tree specific messages&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define ML_MSG_ONSENDTOBUILD 0x300 // you get sent this when the sendto menu gets built&lt;br /&gt;
// param1 = type of source, param2 param to pass as context to ML_IPC_ADDTOSENDTO&lt;br /&gt;
// be sure to return 0 to allow other plugins to add their context menus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// if your sendto item is selected, you will get this with your param3 == your user32 (preferably some&lt;br /&gt;
// unique identifier (like your plugin message proc). See ML_IPC_ADDTOSENDTO&lt;br /&gt;
#define ML_MSG_ONSENDTOSELECT 0x301&lt;br /&gt;
// param1 = type of source, param2 = data, param3 = user32&lt;br /&gt;
&lt;br /&gt;
// return TRUE and do a config dialog using param1 as a HWND parent for this one&lt;br /&gt;
#define ML_MSG_CONFIG 0x400&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Messages you can send to the Media Library HWND ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ML_TYPE_UNKNOWN			-1&lt;br /&gt;
#define ML_TYPE_ITEMRECORDLIST 0 // if this, cast obj to itemRecordList&lt;br /&gt;
#define ML_TYPE_FILENAMES 1 // double NULL terminated char * to files, URLS, or playlists&lt;br /&gt;
#define ML_TYPE_STREAMNAMES 2 // double NULL terminated char * to URLS, or playlists ( effectively the same as ML_TYPE_FILENAMES, but not for files)&lt;br /&gt;
#define ML_TYPE_CDTRACKS 3 // if this, cast obj to itemRecordList (CD tracks) -- filenames should be cda://&amp;lt;drive letter&amp;gt;,&amp;lt;track index&amp;gt;. artist/album/title might be valid (CDDB)&lt;br /&gt;
#define ML_TYPE_QUERYSTRING 4 // char * to a query string&lt;br /&gt;
#define ML_TYPE_PLAYLIST 5 // mlPlaylist *&lt;br /&gt;
#define ML_TYPE_ITEMRECORDLISTW 6 // if this, cast obj to itemRecordListW&lt;br /&gt;
// added from 5.36+&lt;br /&gt;
#define ML_TYPE_FILENAMESW 7 // double NULL terminated wchar_t * to files, URLS, or playlists&lt;br /&gt;
#define ML_TYPE_STREAMNAMESW 8 // double NULL terminated wchar_t * to URLS, or playlists ( effectively the same as ML_TYPE_FILENAMESW, but not for files)&lt;br /&gt;
#define ML_TYPE_PLAYLISTS 9 // mlPlaylist **, null terminated&lt;br /&gt;
#define ML_TYPE_TREEITEM 69 // uhh?&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	const wchar_t *filename;&lt;br /&gt;
	const wchar_t *title;&lt;br /&gt;
	// only fill in the following two if already know.  don't calculate it just for the struct. &lt;br /&gt;
	// put -1 for &amp;quot;don't know&amp;quot;&lt;br /&gt;
	int numItems; &lt;br /&gt;
	int length; // in seconds.  &lt;br /&gt;
} mlPlaylist;&lt;br /&gt;
&lt;br /&gt;
// if you wish to put your tree items under &amp;quot;devices&amp;quot;, use this constant for ML_IPC_ADDTREEITEM&lt;br /&gt;
#define ML_TREEVIEW_ID_DEVICES 10000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// children communicate back to the media library by SendMessage(plugin.hwndLibraryParent,WM_ML_IPC,param,ML_IPC_X);&lt;br /&gt;
#define WM_ML_IPC WM_USER+0x1000&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
#define ML_IPC_GETCURRENTVIEW	0x090 // Returns HWND to the currently selected view or NULL if nothing selected or error. (WA 5.22 and higher)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Old Tree Item API  (deprecated)&lt;br /&gt;
//&lt;br /&gt;
#define ML_IPC_ADDTREEITEM		0x0101 // pass mlAddTreeItemStruct as the param&lt;br /&gt;
#define ML_IPC_SETTREEITEM		0x0102 // pass mlAddTreeItemStruct with id valid&lt;br /&gt;
#define ML_IPC_DELTREEITEM		0x0103 // pass param of tree item to remove&lt;br /&gt;
#define ML_IPC_GETCURTREEITEM	0x0104 // returns current tree item param or 0 if none&lt;br /&gt;
#define ML_IPC_SETCURTREEITEM	0x0105 // selects the tree item passed, returns 1 if found, 0 if not&lt;br /&gt;
#define ML_IPC_GETTREE			0x0106 // returns a HMENU with all the tree items. the caller needs to delete the returned handle! pass mlGetTreeStruct as the param&lt;br /&gt;
&lt;br /&gt;
/* deprecated. Use MLTREEITEM instead */&lt;br /&gt;
typedef struct {&lt;br /&gt;
  INT_PTR parent_id; //0=root, or ML_TREEVIEW_ID_*&lt;br /&gt;
  char *title;&lt;br /&gt;
  int has_children;&lt;br /&gt;
  INT_PTR this_id; //filled in by the library on ML_IPC_ADDTREEITEM&lt;br /&gt;
} mlAddTreeItemStruct;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  int item_start;   // TREE_PLAYLISTS, TREE_DEVICES...&lt;br /&gt;
  int cmd_offset;   // menu command offset if you need to make a command proxy, 0 otherwise&lt;br /&gt;
  int max_numitems; // maximum number of items you wish to insert or -1 for no limit&lt;br /&gt;
} mlGetTreeStruct;&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/// For Predixis, with Love&lt;br /&gt;
/// deprecatded (never use!!!)&lt;br /&gt;
///&lt;br /&gt;
#define ML_IPC_ADDTREEITEM_EX 0x0111 // pass mlAddTreeItemStructEx as the param&lt;br /&gt;
#define ML_IPC_SETTREEITEM_EX 0x0112 // pass mlAddTreeItemStructEx with this_id valid&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  INT_PTR parent_id; //0=root, or ML_TREEVIEW_ID_*&lt;br /&gt;
  char *title;&lt;br /&gt;
  int has_children;&lt;br /&gt;
  INT_PTR this_id; //filled in by the library on ML_IPC_ADDTREEITEM&lt;br /&gt;
  int imageIndex;  // index of the image you want to be associated with your item&lt;br /&gt;
} mlAddTreeItemStructEx;&lt;br /&gt;
&lt;br /&gt;
/// deprecatded (never use!!!)&lt;br /&gt;
#define ML_IPC_ADDTREEIMAGE 0x110 // adds tree image to the ml. Use mlAddTreeImageStruct as the param.&lt;br /&gt;
/// end of predixis special&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Tree Item API  (starting from 5.3)&lt;br /&gt;
//&lt;br /&gt;
#define ML_IPC_TREEITEM_GETHANDLE	0x120 // Gives you HANDLE to the item with specified ID in the param&lt;br /&gt;
#define ML_IPC_TREEITEM_GETCHILD		0x121 // Returns HANDLE to the child item for the item HANDLE specified as a param. &lt;br /&gt;
#define ML_IPC_TREEITEM_GETNEXT		0x122 // Returns HANDLE to the next item for the item HANDLE specified as a param.&lt;br /&gt;
#define ML_IPC_TREEITEM_GETSELECTED	0x123 // Returns HANDLE to selected item.&lt;br /&gt;
#define ML_IPC_TREEITEM_GETINFO		0x124 // Pass MLTREEITEMINFO as a param. return TRUE - if ok&lt;br /&gt;
#define ML_IPC_TREEITEM_SETINFO		0x125 // Pass MLTREEITEMINFO as a param. return TRUE - if ok&lt;br /&gt;
#define ML_IPC_TREEITEM_ADD			0x126 // Adds new item using MLTREEITEM passed as a param&lt;br /&gt;
#define ML_IPC_TREEITEM_DELETE		0x127 // Deletes tree item. Pass HANDLE as a param.&lt;br /&gt;
#define ML_IPC_TREEITEM_SELECT		0x128 // Selects tree item. Pass HANDLE as a param. &lt;br /&gt;
#define ML_IPC_TREEITEM_GETROOT		0x129 // Gets first item.&lt;br /&gt;
#define ML_IPC_TREEITEM_INSERT    0x130 // like ML_IPC_TREEITEM_ADD, but id becomes an &amp;quot;insert after&amp;quot; ID&lt;br /&gt;
#define ML_IPC_TREEITEM_GETCHILD_ID		0x131 // Returns ID to the child item for the item ID specified as a param. &lt;br /&gt;
#define ML_IPC_TREEITEM_GETNEXT_ID		0x132 // Returns ID to the next item for the item ID specified as a param.&lt;br /&gt;
#define ML_IPC_TREEITEM_ADDW			0x133 // Adds new item using MLTREEITEMW passed as a param&lt;br /&gt;
#define ML_IPC_TREEITEM_INSERTW    0x134 // like ML_IPC_TREEITEM_ADDW, but id becomes an &amp;quot;insert after&amp;quot; ID&lt;br /&gt;
#define ML_IPC_TREEITEM_SETINFOW    0x135 // Pass MLTREEITEMINFOW as a param. return TRUE - if ok&lt;br /&gt;
#define ML_IPC_TREEITEM_GETINFOW		0x136 // Pass MLTREEITEMINFO as a param. return TRUE - if ok&lt;br /&gt;
#define MLTI_ROOT			(INT_PTR)TVI_ROOT // can be used in ML_IPC_TREEITEM_GETCHILD&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  size_t	size;			// size of this struct&lt;br /&gt;
  UINT_PTR	id;				// depends on contxext&lt;br /&gt;
  UINT_PTR	parentId;		// 0 = root, or ML_TREEVIEW_ID_*&lt;br /&gt;
  char		*title;			// pointer to the buffer contained item name. &lt;br /&gt;
  size_t	titleLen;		// used for GetInfo &lt;br /&gt;
  BOOL		hasChildren;	// TRUE - has children&lt;br /&gt;
  int		imageIndex;		// index of the associated image&lt;br /&gt;
} MLTREEITEM;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  MLTREEITEM	item;	// item data&lt;br /&gt;
  UINT			mask;	// one or more of MLTI_* flags&lt;br /&gt;
  UINT_PTR		handle; // Handle to the item. If handle is NULL item-&amp;gt;id will be used&lt;br /&gt;
} MLTREEITEMINFO;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  size_t	size;			// size of this struct&lt;br /&gt;
  UINT_PTR		id;				// depends on context&lt;br /&gt;
  UINT_PTR		parentId;		// 0 = root, or ML_TREEVIEW_ID_*&lt;br /&gt;
  wchar_t	*title;			// pointer to the buffer contained item name. &lt;br /&gt;
  size_t	titleLen;		// used for GetInfo &lt;br /&gt;
  BOOL		hasChildren;	// TRUE - has children&lt;br /&gt;
  int		imageIndex;		// index of the associated image&lt;br /&gt;
} MLTREEITEMW;&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  MLTREEITEMW	item;	// item data&lt;br /&gt;
  UINT			mask;	// one or more of MLTI_* flags&lt;br /&gt;
  UINT_PTR		handle; // Handle to the item. If handle is NULL item-&amp;gt;id will be used&lt;br /&gt;
} MLTREEITEMINFOW;&lt;br /&gt;
// Flags that used in the MLTREEITEMINFO struct&lt;br /&gt;
#define MLTI_CHILDREN	TVIF_CHILDREN&lt;br /&gt;
#define MLTI_IMAGE		TVIF_IMAGE&lt;br /&gt;
#define MLTI_TEXT		TVIF_TEXT&lt;br /&gt;
#define MLTI_ID			TVIF_PARAM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
// Tree image (starting from 5.3)&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_TREEIMAGE_ADD 0x140 // adds tree image to the ml. Use MLTREEIMAGE as the param.&lt;br /&gt;
&lt;br /&gt;
typedef struct _COLOR24&lt;br /&gt;
{&lt;br /&gt;
	unsigned char rgbBlue;&lt;br /&gt;
	unsigned char rgbGreen;&lt;br /&gt;
	unsigned char rgbRed;&lt;br /&gt;
}COLOR24; // color struct &lt;br /&gt;
&lt;br /&gt;
typedef void (*BMPFILTERPROC)(const COLOR24*, const COLOR24*, COLOR24*); // color filter procedure &lt;br /&gt;
// you got two colors: color1 and color2 (usualy BG and FG colors) also you as a third parameter&lt;br /&gt;
// you get a pixel color value that you need (can) modify  &lt;br /&gt;
&lt;br /&gt;
#define FILTER_NO			((BMPFILTERPROC)NULL)&lt;br /&gt;
#define FILTER_DEFAULT1		((BMPFILTERPROC)1)&lt;br /&gt;
#define FILTER_DEFAULT2		((BMPFILTERPROC)2)&lt;br /&gt;
&lt;br /&gt;
#define MLTREEIMAGE_NONE					0&lt;br /&gt;
#define MLTREEIMAGE_DEFAULT					1&lt;br /&gt;
#define MLTREEIMAGE_BRANCH					2   // calculates at the time 	&lt;br /&gt;
#define MLTREEIMAGE_BRANCH_EXPANDED			3&lt;br /&gt;
#define MLTREEIMAGE_BRANCH_COLLAPSED		4&lt;br /&gt;
#define MLTREEIMAGE_BRANCH_NOCHILD			5&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
	HINSTANCE				hinst;					// hInstance&lt;br /&gt;
	int				resourceId;				// resource id &lt;br /&gt;
	int				imageIndex;				// set image to specified index (specify -1 to get a new index back)&lt;br /&gt;
	BMPFILTERPROC	filterProc;				// pointer to the filter proc to use or one of the FILTER_*&lt;br /&gt;
	int				width;					// reserved&lt;br /&gt;
	int				height;					// reserved&lt;br /&gt;
} MLTREEIMAGE;   // basicly ml will read your reosurce when it will need to create your image&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_NEWPLAYLIST           0x107 // pass hwnd for dialog parent as param&lt;br /&gt;
#define ML_IPC_IMPORTPLAYLIST        0x108 // pass hwnd for dialog parent as param&lt;br /&gt;
#define ML_IPC_IMPORTCURRENTPLAYLIST 0x109&lt;br /&gt;
#define ML_IPC_GETPLAYLISTWND        0x10A&lt;br /&gt;
#define ML_IPC_SAVEPLAYLIST          0x10B // pass hwnd for dialog parent as param&lt;br /&gt;
#define ML_IPC_OPENPREFS             0x10C&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_PLAY_PLAYLIST 0x010D // plays the playlist pointed to by the tree item passed, returns 1 if found, 0 if not&lt;br /&gt;
#define ML_IPC_LOAD_PLAYLIST 0x010E // loads the playlist pointed to by the tree item passed into the playlist editor, returns 1 if found, 0 if not&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_REFRESH_PREFS 0x10F // this doesn't belong in here &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** ------------------ &lt;br /&gt;
 ** ml_playlists &lt;br /&gt;
 ** ------------------ */&lt;br /&gt;
&lt;br /&gt;
#define PL_FLAG_SHOW 1&lt;br /&gt;
#define PL_FLAG_SWITCH 2&lt;br /&gt;
#define PL_FLAGS_IMPORT 4 // set to have ml_playlists make a copy (only valid for mlAddPlaylist)&lt;br /&gt;
#define PL_FLAG_FILL_FILENAME 8 // only valid for mlMakePlaylist&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
  size_t size;  // size of this struct&lt;br /&gt;
	const wchar_t *playlistName; // set to NULL (or empty string) to prompt the user for a name&lt;br /&gt;
  const wchar_t *filename;&lt;br /&gt;
	int flags; // see PL_FLAG_* above&lt;br /&gt;
	// the following two items can be optionally filled in (set to -1 otherwise)&lt;br /&gt;
	// if they aren't set, the playlist file will have to be opened and parsed&lt;br /&gt;
	// so prepopulating is faster (assuming if you already know the data)&lt;br /&gt;
	int numItems; // set to -1 if you don't know. &lt;br /&gt;
	int length; // in seconds, set to -1 if you don't know&lt;br /&gt;
} mlAddPlaylist;&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_PLAYLIST_ADD 0x180 // call to add a new playlist file to the Playlists treeview.  pass an mlAddPlaylist *&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
	size_t size;  // size of this struct&lt;br /&gt;
	const wchar_t *playlistName; // set to NULL (or empty string) to prompt the user for a name&lt;br /&gt;
  int type; //ML_TYPE_ITEMRECORDLIST, etc&lt;br /&gt;
  void *data; // object to load&lt;br /&gt;
	int flags; // see PL_FLAG_* above&lt;br /&gt;
	wchar_t filename[MAX_PATH]; // this will get populated if PL_FLAG_FILL_NAME is set&lt;br /&gt;
} mlMakePlaylistV2;&lt;br /&gt;
&lt;br /&gt;
// old structure, here to make it easy to do a sizeof() check&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
	size_t size;  // size of this struct&lt;br /&gt;
	const wchar_t *playlistName; // set to NULL (or empty string) to prompt the user for a name&lt;br /&gt;
  int type; //ML_TYPE_ITEMRECORDLIST, etc&lt;br /&gt;
  void *data; // object to load&lt;br /&gt;
	int flags; // see PL_FLAG_* above&lt;br /&gt;
} mlMakePlaylist;&lt;br /&gt;
&lt;br /&gt;
/* Call to add a new playlist to the Playlists treeview.  &lt;br /&gt;
   It will be automatically created based on the data you pass&lt;br /&gt;
	 type &amp;amp; data follow the same specifications as send-to, drag-and-drop, etc.&lt;br /&gt;
*/&lt;br /&gt;
#define ML_IPC_PLAYLIST_MAKE 0x181  // call to create a new playlist in the treeview based on passed information.  pass an mlMakePlaylist *&lt;br /&gt;
#define ML_IPC_PLAYLIST_COUNT 0x182&lt;br /&gt;
#define ML_IPC_PLAYLIST_INFO 0x183 // pass in the struct below. returns &amp;quot;1&amp;quot; on success and &amp;quot;0&amp;quot; on failure&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	// you fill this in&lt;br /&gt;
	size_t size; // size of this struct&lt;br /&gt;
	size_t playlistNum; // number of the playlist you want to retrieve (0 index)&lt;br /&gt;
	// ml_playlists fills these in&lt;br /&gt;
	wchar_t playlistName[128];&lt;br /&gt;
	wchar_t filename[MAX_PATH];&lt;br /&gt;
	int numItems;&lt;br /&gt;
	int length; // in seconds&lt;br /&gt;
} mlPlaylistInfo;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/** ------------------ &lt;br /&gt;
 ** &lt;br /&gt;
 ** ------------------ */&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_GETFILEINFO 0x0200 // pass it a &amp;amp;itemRecord with a valid filename (and all other fields NULL), and it will try to fill in the rest&lt;br /&gt;
#define ML_IPC_FREEFILEINFO 0x0201 // pass it a &amp;amp;itemRecord tha twas filled by getfileinfo, it will free the strings it allocated&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_HANDLEDRAG 0x0300 // pass it a &amp;amp;mlDropItemStruct it will handle cursors etc (unless flags has the lowest bit set), and it will set result appropriately:&lt;br /&gt;
#define ML_IPC_HANDLEDROP 0x0301 // pass it a &amp;amp;mlDropItemStruct with data on drop:&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SENDTOWINAMP 0x302 // send with a mlSendToWinampStruct:&lt;br /&gt;
typedef struct {&lt;br /&gt;
  int type; //ML_TYPE_ITEMRECORDLIST, etc&lt;br /&gt;
  void *data; // object to play&lt;br /&gt;
&lt;br /&gt;
  int enqueue; // low bit set specifies enqueuing, and second bit NOT set specifies that &lt;br /&gt;
               // the media library should use its default behavior as the user configured it (if &lt;br /&gt;
               // enqueue is the default, the low bit will be flipped by the library)&lt;br /&gt;
} mlSendToWinampStruct;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  char *desc; // str&lt;br /&gt;
  intptr_t context; // context passed by ML_MSG_ONSENDTOBUILD&lt;br /&gt;
  intptr_t user32; // use some unique ptr in memory, you will get it back in ML_MSG_ONSENDTOSELECT...&lt;br /&gt;
} mlAddToSendToStruct;&lt;br /&gt;
#define ML_IPC_ADDTOSENDTO 0x0400&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  wchar_t *desc; // str&lt;br /&gt;
  intptr_t context; // context passed by ML_MSG_ONSENDTOBUILD&lt;br /&gt;
  intptr_t user32; // use some unique ptr in memory, you will get it back in ML_MSG_ONSENDTOSELECT...&lt;br /&gt;
} mlAddToSendToStructW;&lt;br /&gt;
#define ML_IPC_ADDTOSENDTOW 0x0401 // pass mlAddToSendToStructW&lt;br /&gt;
&lt;br /&gt;
// used to make a submenu in sendto&lt;br /&gt;
// pass mlAddToSendToStructW, set desc to 0 to start, set valid desc to end&lt;br /&gt;
// user32 is unused &lt;br /&gt;
#define ML_IPC_BRANCHSENDTO 0x0402 &lt;br /&gt;
&lt;br /&gt;
// follow same rules as ML_IPC_ADDTOSENDTOW, but adds to branch instead of main send-to menu&lt;br /&gt;
#define ML_IPC_ADDTOBRANCH 0x403  // pass mlAddToSendToStructW&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_HOOKTITLE 0x0440 // this is like winamp's IPC_HOOK_TITLES... :) param1 is waHookTitleStruct&lt;br /&gt;
#define ML_IPC_HOOKEXTINFO 0x441 // called on IPC_GET_EXTENDED_FILE_INFO_HOOKABLE, param1 is extendedFileInfoStruct&lt;br /&gt;
#define ML_IPC_HOOKEXTINFOW 0x442 // called on IPC_GET_EXTENDED_FILE_INFO_HOOKABLEW, param1 is extendedFileInfoStructW&lt;br /&gt;
#define ML_IPC_HOOKTITLEW 0x0443 // this is like winamp's IPC_HOOK_TITLESW... :) param1 is waHookTitleStructW&lt;br /&gt;
&lt;br /&gt;
#define ML_HANDLEDRAG_FLAG_NOCURSOR 1&lt;br /&gt;
#define ML_HANDLEDRAG_FLAG_NAME 2&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  int type; //ML_TYPE_ITEMRECORDLIST, etc&lt;br /&gt;
  void *data; // NULL if just querying&lt;br /&gt;
&lt;br /&gt;
  int result; // filled in by client: -1 if dont allow, 0 if dont know, 1 if allow.&lt;br /&gt;
&lt;br /&gt;
  POINT p; // cursor pos in screen coordinates&lt;br /&gt;
  int flags; &lt;br /&gt;
&lt;br /&gt;
  char *name; // only valid if ML_HANDLEDRAG_FLAG_NAME&lt;br /&gt;
&lt;br /&gt;
} mlDropItemStruct;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SKIN_LISTVIEW   0x0500 // pass the hwnd of your listview. returns a handle to use with ML_IPC_UNSKIN_LISTVIEW&lt;br /&gt;
#define ML_IPC_UNSKIN_LISTVIEW 0x0501 // pass the handle you got from ML_IPC_SKIN_LISTVIEW&lt;br /&gt;
#define ML_IPC_LISTVIEW_UPDATE 0x0502 // pass the handle you got from ML_IPC_SKIN_LISTVIEW&lt;br /&gt;
#define ML_IPC_LISTVIEW_DISABLEHSCROLL 0x0503 // pass the handle you got from ML_IPC_SKIN_LISTVIEW&lt;br /&gt;
#define ML_IPC_LISTVIEW_DISABLEVSCROLL 0x050A // pass the handle you got from ML_IPC_SKIN_LISTVIEW&lt;br /&gt;
#define ML_IPC_LISTVIEW_SHOWSORT		0x0504  // use LV_SKIN_SHOWSORT&lt;br /&gt;
#define ML_IPC_LISTVIEW_SORT			0x0505  // use LV_SKIN_SORT&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
	INT_PTR listView;&lt;br /&gt;
	BOOL	showSort;&lt;br /&gt;
} LV_SKIN_SHOWSORT;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	INT_PTR listView;&lt;br /&gt;
	int		columnIndex;&lt;br /&gt;
	BOOL	ascending;&lt;br /&gt;
} LV_SKIN_SORT;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SKIN_COMBOBOX   0x0508 // pass the hwnd of your combobox to skin, returns a ahndle to use with ML_IPC_UNSKIN_COMBOBOX&lt;br /&gt;
#define ML_IPC_UNSKIN_COMBOBOX 0x0509 // pass the handle from ML_IPC_SKIN_COMBOBOX&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SKIN_WADLG_GETFUNC 0x0600 &lt;br /&gt;
    // 1: return int (*WADlg_getColor)(int idx); // pass this an index, returns a RGB value (passing 0 or &amp;gt; 3 returns NULL)&lt;br /&gt;
    // 2: return int (*WADlg_handleDialogMsgs)(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); &lt;br /&gt;
    // 3: return void (*WADlg_DrawChildWindowBorders)(HWND hwndDlg, int *tab, int tabsize); // each entry in tab would be the id | DCW_*&lt;br /&gt;
    // 32: return void (*childresize_init)(HWND hwndDlg, ChildWndResizeItem *list, int num);&lt;br /&gt;
    // 33: return void (*childresize_resize)(HWND hwndDlg, ChildWndResizeItem *list, int num);&lt;br /&gt;
    // 66: return (HFONT) font to use for dialog elements, if desired (0 otherwise)&lt;br /&gt;
   &lt;br /&gt;
// itemRecord type for use with ML_TYPE_ITEMRECORDLIST, as well as many other functions&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  char *filename;&lt;br /&gt;
  char *title;&lt;br /&gt;
  char *album;&lt;br /&gt;
  char *artist;&lt;br /&gt;
  char *comment;&lt;br /&gt;
  char *genre;&lt;br /&gt;
  int year;&lt;br /&gt;
  int track;&lt;br /&gt;
  int length;&lt;br /&gt;
  char **extended_info;&lt;br /&gt;
  // currently defined extended columns (while they are stored internally as integers&lt;br /&gt;
  // they are passed using extended_info as strings):&lt;br /&gt;
  // use getRecordExtendedItem and setRecordExtendedItem to get/set.&lt;br /&gt;
  // for your own internal use, you can set other things, but the following values&lt;br /&gt;
  // are what we use at the moment. Note that setting other things will be ignored&lt;br /&gt;
  // by ML_IPC_DB*.&lt;br /&gt;
  // &lt;br /&gt;
  //&amp;quot;RATING&amp;quot; file rating. can be 1-5, or 0 or empty for undefined&lt;br /&gt;
  //&amp;quot;PLAYCOUNT&amp;quot; number of file plays.&lt;br /&gt;
  //&amp;quot;LASTPLAY&amp;quot; last time played, in standard time_t format&lt;br /&gt;
  //&amp;quot;LASTUPD&amp;quot; last time updated in library, in standard time_t format&lt;br /&gt;
  //&amp;quot;FILETIME&amp;quot; last known file time of file, in standard time_t format&lt;br /&gt;
  //&amp;quot;FILESIZE&amp;quot; last known file size, in kilobytes.&lt;br /&gt;
  //&amp;quot;BITRATE&amp;quot; file bitrate, in kbps&lt;br /&gt;
	//&amp;quot;TYPE&amp;quot; - &amp;quot;0&amp;quot; for audio, &amp;quot;1&amp;quot; for video&lt;br /&gt;
&lt;br /&gt;
} itemRecord;&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
  itemRecord *Items;&lt;br /&gt;
  int Size;&lt;br /&gt;
  int Alloc;&lt;br /&gt;
} itemRecordList;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  wchar_t *filename;&lt;br /&gt;
  wchar_t *title;&lt;br /&gt;
  wchar_t *album;&lt;br /&gt;
  wchar_t *artist;&lt;br /&gt;
  wchar_t *comment;&lt;br /&gt;
  wchar_t *genre;&lt;br /&gt;
	wchar_t *albumartist; &lt;br /&gt;
	wchar_t *replaygain_album_gain; // these are strings rather than float's to differentiate between '0 gain' and 'not defined'&lt;br /&gt;
	wchar_t *replaygain_track_gain; // these are strings rather than float's to differentiate between '0 gain' and 'not defined'&lt;br /&gt;
	wchar_t *publisher;&lt;br /&gt;
	wchar_t *composer;&lt;br /&gt;
  int year;&lt;br /&gt;
  int track;&lt;br /&gt;
	int tracks;&lt;br /&gt;
  int length;&lt;br /&gt;
	int rating; // file rating. can be 1-5, or 0 for undefined&lt;br /&gt;
	int playcount; // number of file plays.&lt;br /&gt;
	__time64_t lastplay; // last time played, in standard time_t format&lt;br /&gt;
	__time64_t lastupd; // last time updated in library, in standard time_t format&lt;br /&gt;
	__time64_t filetime; // last known file time of file, in standard time_t format&lt;br /&gt;
	int filesize; //last known file size, in kilobytes.&lt;br /&gt;
	int bitrate; // file bitrate, in kbps&lt;br /&gt;
	int type; // 0 for audio, 1 for video&lt;br /&gt;
	int disc; // disc number&lt;br /&gt;
	int discs; // number of discs&lt;br /&gt;
	int bpm;&lt;br /&gt;
  wchar_t **extended_info; &lt;br /&gt;
  // currently defined extended columns (while they are stored internally as integers&lt;br /&gt;
  // they are passed using extended_info as strings):&lt;br /&gt;
  // use getRecordExtendedItem and setRecordExtendedItem to get/set.&lt;br /&gt;
  // for your own internal use, you can set other things, but the following values&lt;br /&gt;
  // are what we use at the moment. Note that setting other things will be ignored&lt;br /&gt;
  // by ML_IPC_DB*.&lt;br /&gt;
  // &lt;br /&gt;
&lt;br /&gt;
} itemRecordW;&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
  itemRecordW *Items;&lt;br /&gt;
  int Size;&lt;br /&gt;
  int Alloc;&lt;br /&gt;
} itemRecordListW;&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// all return 1 on success, -1 on error. or 0 if not supported, maybe?&lt;br /&gt;
&lt;br /&gt;
// pass these a mlQueryStruct&lt;br /&gt;
// results should be zeroed out before running a query, but if you wish you can run multiple queries and &lt;br /&gt;
// have it concatenate the results. tho it would be more efficient to just make one query that contains both,&lt;br /&gt;
// as running multiple queries might have duplicates etc.&lt;br /&gt;
// in general, though, if you need to treat &amp;quot;results&amp;quot; as if they are native, you should use&lt;br /&gt;
// copyRecordList to save a copy, then free the results using ML_IPC_DB_FREEQUERYRESULTS.&lt;br /&gt;
// if you need to keep an exact copy that you will only read (and will not modify), then you can&lt;br /&gt;
// use the one in the mlQueryStruct.&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_DB_RUNQUERY 0x0700 &lt;br /&gt;
#define ML_IPC_DB_RUNQUERY_SEARCH 0x0701 // &amp;quot;query&amp;quot; should be interpreted as keyword search instead of query string&lt;br /&gt;
#define ML_IPC_DB_RUNQUERY_FILENAME 0x0702 // searches for one exact filename match of &amp;quot;query&amp;quot;&lt;br /&gt;
#define ML_IPC_DB_RUNQUERY_INDEX 0x703 // retrieves item #(int)query&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_DB_FREEQUERYRESULTS 0x0705 // frees memory allocated by ML_IPC_RUNQUERY (empties results)&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
  char *query;&lt;br /&gt;
  int max_results;      // can be 0 for unlimited&lt;br /&gt;
  itemRecordList results;&lt;br /&gt;
} mlQueryStruct;&lt;br /&gt;
&lt;br /&gt;
/* Unicode versions of the above */&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_DB_RUNQUERYW 0x1700&lt;br /&gt;
#define ML_IPC_DB_RUNQUERY_SEARCHW 0x1701 // &amp;quot;query&amp;quot; should be interpreted as keyword search instead of query string&lt;br /&gt;
#define ML_IPC_DB_RUNQUERY_FILENAMEW 0x1702 // searches for one exact filename match of &amp;quot;query&amp;quot;&lt;br /&gt;
#define ML_IPC_DB_RUNQUERY_INDEXW 0x1703 // retrieves item #(int)query&lt;br /&gt;
#define ML_IPC_DB_FREEQUERYRESULTSW 0x1705 // frees memory allocated by ML_IPC_RUNQUERYW (empties results)&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
  wchar_t *query;&lt;br /&gt;
  int max_results;      // can be 0 for unlimited&lt;br /&gt;
  itemRecordListW results;&lt;br /&gt;
} mlQueryStructW;&lt;br /&gt;
&lt;br /&gt;
/* ----------------------------- */&lt;br /&gt;
&lt;br /&gt;
// pass these an (itemRecord *) to add/update.&lt;br /&gt;
// note that any NULL fields in the itemRecord won't be updated, &lt;br /&gt;
// and year, track, or length of -1 prevents updating as well.&lt;br /&gt;
#define ML_IPC_DB_UPDATEITEM 0x0706    // returns -2 if item not found in db&lt;br /&gt;
#define ML_IPC_DB_ADDORUPDATEITEM 0x0707&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_DB_REMOVEITEM 0x0708 // pass a char * to the filename to remove. returns -2 if file not found in db.&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
  char*  fileName;   // file name to add&lt;br /&gt;
  int    meta_mode;  // metadata get mode (0 - don't use metadata, 1 - use metadata; -1 - read from user settings (ini file)&lt;br /&gt;
  int    gues_mode;  // metadata guessing mode (0 - smart, 1 - simple; 2 - no, -1 - read from user settings (ini file)&lt;br /&gt;
} LMDB_FILE_ADD_INFO;&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_DB_UPDATEFILE 0x0710         // Update File in the Local Media Data Base (return -2 if file record not found)&lt;br /&gt;
#define ML_IPC_DB_ADDORUPDATEFILE 0x0711      // Adds or Updates File in the Local Media Data Base.&lt;br /&gt;
&lt;br /&gt;
/* Unicode versions of the above */&lt;br /&gt;
&lt;br /&gt;
// pass these an (itemRecordW *) to add/update.&lt;br /&gt;
// note that any NULL fields in the itemRecordW won't be updated, &lt;br /&gt;
// and year, track, or length of -1 prevents updating as well.&lt;br /&gt;
#define ML_IPC_DB_UPDATEITEMW 0x1706    // returns -2 if item not found in db&lt;br /&gt;
#define ML_IPC_DB_ADDORUPDATEITEMW 0x1707&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
  wchar_t*  fileName;   // file name to add&lt;br /&gt;
  int    meta_mode;  // metadata get mode (0 - don't use metadata, 1 - use metadata; -1 - read from user settings (ini file)&lt;br /&gt;
  int    gues_mode;  // metadata guessing mode (0 - smart, 1 - simple; 2 - no, -1 - read from user settings (ini file)&lt;br /&gt;
} LMDB_FILE_ADD_INFOW;&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_DB_UPDATEFILEW 0x1710         // Update File in the Local Media Data Base (return -2 if file record not found) NOTE that this call is broken on 5.33.  Only use on 5.34+&lt;br /&gt;
#define ML_IPC_DB_ADDORUPDATEFILEW 0x1711      // Adds or Updates File in the Local Media Data Base.&lt;br /&gt;
&lt;br /&gt;
/* ----------------------------- */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_DB_SYNCDB 0x0709 // sync db if dirty flags are set. good to do after a batch of updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// these return 0 if unsupported, -1 if failed, 1 if succeeded&lt;br /&gt;
&lt;br /&gt;
// pass a winampMediaLibraryPlugin *. Will not call plugin's init() func. &lt;br /&gt;
// YOU MUST set winampMediaLibraryPlugin-&amp;gt;hDllInstance to NULL, and version to MLHDR_VER&lt;br /&gt;
// 5.25+:  You can set hDllInstance to valid value.  &lt;br /&gt;
//         This IPC will return -1 on failure, so a good check against old verions&lt;br /&gt;
//         is to try with hDllInstance set, if it returns -1, try again with hDllInstance=0&lt;br /&gt;
#define ML_IPC_ADD_PLUGIN 0x0750 &lt;br /&gt;
#define ML_IPC_REMOVE_PLUGIN 0x0751 // winampMediaLibraryPlugin * of plugin to remove. Will not call plugin's quit() func&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SEND_PLUGIN_MESSAGE 0x0752 // sends message to plugins (wParam = 0, lParam = pointer to the pluginMessage struct)&lt;br /&gt;
// pluginMessage struct&lt;br /&gt;
typedef struct {&lt;br /&gt;
  int messageType;&lt;br /&gt;
  INT_PTR param1;&lt;br /&gt;
  INT_PTR param2;&lt;br /&gt;
  INT_PTR param3;&lt;br /&gt;
} pluginMessage;&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_ENSURE_VISIBLE 0x753 // ensures that the media library is visible&lt;br /&gt;
#define ML_IPC_IS_VISIBLE 0x754 // queries the current visibility status&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_GET_PARENTAL_RATING 0x755 &lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_TOGGLE_VISIBLE 0x756&lt;br /&gt;
&lt;br /&gt;
// this gets sent to any child windows of the library windows, and then (if not&lt;br /&gt;
// handled) the library window itself&lt;br /&gt;
&lt;br /&gt;
#define WM_ML_CHILDIPC WM_APP+0x800 // avoids conflicts with any windows controls&lt;br /&gt;
#define ML_CHILDIPC_DROPITEM 0x100         // lParam = 100, wParam = &amp;amp;mlDropItemStruct&lt;br /&gt;
&lt;br /&gt;
// current item ratings&lt;br /&gt;
#define ML_IPC_SETRATING 0x0900 // lParam = 0 to 5, rates current track -- inserts it in the db if it's not in it yet &lt;br /&gt;
#define ML_IPC_GETRATING 0x0901 // return the current track's rating or 0 if not in db/no rating&lt;br /&gt;
&lt;br /&gt;
// playlist entry rating&lt;br /&gt;
typedef struct {&lt;br /&gt;
  int plentry;&lt;br /&gt;
  int rating;&lt;br /&gt;
} pl_set_rating;&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_PL_SETRATING 0x0902 // lParam = pointer to pl_set_rating struct&lt;br /&gt;
#define ML_IPC_PL_GETRATING 0x0903 // lParam = playlist entry, returns the rating or 0 if not in db/no rating&lt;br /&gt;
&lt;br /&gt;
typedef struct {&lt;br /&gt;
  HWND dialog_parent;              // Use this window as a parent for the query editor dialog&lt;br /&gt;
  const char *query;               // The query to edit, or &amp;quot;&amp;quot; / null for new query&lt;br /&gt;
} ml_editquery;                 &lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_EDITQUERY    0x904  // lParam = pointer to ml_editquery struct, returns 0 if edition was canceled and 1 on success&lt;br /&gt;
                                   // After returning, and if ok was clicked, the struct contains a pointer to the edited query. this pointer is static : &lt;br /&gt;
                                   // - do *not* free it&lt;br /&gt;
                                   // - if you need to keep it around, strdup it, as it may be changed later by other plugins calling ML_IPC_EDITQUERY.&lt;br /&gt;
&lt;br /&gt;
typedef struct {                &lt;br /&gt;
  HWND dialog_parent;              // Use this window as a parent for the view editor dialog&lt;br /&gt;
  const char *query;               // The query to edit, or &amp;quot;&amp;quot; / null for new views&lt;br /&gt;
  const char *name;                // Name of the view (ignored for new views)&lt;br /&gt;
  int mode;                        // View mode (0=simple view, 1=artist/album view, -1=hide mode radio boxes)&lt;br /&gt;
} ml_editview;                 &lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_EDITVIEW     0x905  // lParam = pointer to ml_editview struct, returns 0 if edition was canceled and 1 on success&lt;br /&gt;
                                   // After returning, and if ok was clicked, the struct contains the edited values. String pointers are static: &lt;br /&gt;
                                   // - do *not* free them &lt;br /&gt;
                                   // - if you need to keep them around, strdup them, as they may be changed later by other plugins calling ML_IPC_EDITQUERY.&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SET_FILE_RATING 0x0906 // lParam = 0 to 5, rates current track -- inserts it in the db if it's not in it yet &lt;br /&gt;
#define ML_IPC_GET_FILE_RATING 0x0907 // return the current track's rating or 0 if not in db/no rating&lt;br /&gt;
&lt;br /&gt;
// playlist entry rating&lt;br /&gt;
typedef struct {&lt;br /&gt;
  const char* fileName;&lt;br /&gt;
  int newRating;&lt;br /&gt;
} file_set_rating;&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SMARTVIEW_COUNT 0x0908	// returns the number of smartviews. no parameter required&lt;br /&gt;
#define ML_IPC_SMARTVIEW_INFO 0x0909	// pass a mlSmartViewInfo*. returns 1 on success and 0 on failure&lt;br /&gt;
#define ML_IPC_SMARTVIEW_ADD 0x0910	// pass a mlSmartViewInfo* with filled in size, name, query, mode, iconImgIndex. treeitemid gets filled in. returns 1 on success and 0 on failure&lt;br /&gt;
&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
	// you fill these in&lt;br /&gt;
	size_t size;  // set to sizeof(mlSmartViewInfo)&lt;br /&gt;
	size_t smartViewNum;&lt;br /&gt;
	// ml_local fills these in&lt;br /&gt;
	wchar_t smartViewName[128];&lt;br /&gt;
	wchar_t smartViewQuery[512];&lt;br /&gt;
	int mode;&lt;br /&gt;
	int iconImgIndex;&lt;br /&gt;
	int treeItemId;&lt;br /&gt;
} mlSmartViewInfo;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define ML_IPC_SET_FILE_RATINGW 0x0911 // lParam = 0 to 5, rates current track -- inserts it in the db if it's not in it yet &lt;br /&gt;
#define ML_IPC_GET_FILE_RATINGW 0x0912 // return the current track's rating or 0 if not in db/no rating&lt;br /&gt;
&lt;br /&gt;
// playlist entry rating&lt;br /&gt;
typedef struct {&lt;br /&gt;
  const wchar_t *fileName;&lt;br /&gt;
  int newRating;&lt;br /&gt;
} file_set_ratingW;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benski</name></author>	</entry>

	</feed>