<?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/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ace+Frahm</id>
		<title>Winamp Developer Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.shoutcast.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ace+Frahm"/>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/wiki/Special:Contributions/Ace_Frahm"/>
		<updated>2026-05-02T09:09:51Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.22.3</generator>

	<entry>
		<id>http://wiki.shoutcast.com/wiki/User_talk:Culix</id>
		<title>User talk:Culix</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/wiki/User_talk:Culix"/>
				<updated>2009-09-20T22:46:37Z</updated>
		
		<summary type="html">&lt;p&gt;Ace Frahm: /* Request For Help */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See my comments at [[Template_talk:Deleteme]].  I don't visit this Wiki very often, so if you leave a reply on my talk page, it may be a while before I see it. &amp;amp;mdash;[[User:Hydrargyrum|Hydrargyrum]]&amp;lt;sup&amp;gt;[[User_talk:Hydrargyrum|T]] [[Special:Emailuser/Hydrargyrum|@]]&amp;lt;/sup&amp;gt; 18:43, 18 June 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Going to do some more updating ==&lt;br /&gt;
&lt;br /&gt;
Hi Culix,&lt;br /&gt;
&lt;br /&gt;
I plan to make some more changes to your basic plugins wiki page.  This is an outstanding start which I wanted to do for a while.  You have encouraged me to actually do some of this.  There is some interesting things about parts of the code that you have that I'd like to explain.&lt;br /&gt;
&lt;br /&gt;
I'd like to turn these pages into a series of tutorials on plugins.  The trick is that the gen_ plugins and ml_plugins are probably the most commonly used.  We can go back and do some of the other types at some point but they tend to be more specialized.&lt;br /&gt;
&lt;br /&gt;
I think the next step will be to expand your basic plugin to retrieve information from the Winamp core.  I'll let you know and you can look at it.  After that we'll talk about creating a dialog that can invoke methods in the plugin.&lt;br /&gt;
&lt;br /&gt;
Thanks for starting the page. --[[User:SMonty|SMonty]] 20:48, 1 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Request For Help ==&lt;br /&gt;
&lt;br /&gt;
Please take a look at this:&lt;br /&gt;
&lt;br /&gt;
http://dev.winamp.com/wiki/Talk:Beginner%27s_Basic_Plugin_Guide#Basic_gen_empty.dll_File_Crashes_WinAMP_On_Start_Of_WinAMP.&lt;/div&gt;</summary>
		<author><name>Ace Frahm</name></author>	</entry>

	<entry>
		<id>http://wiki.shoutcast.com/wiki/User_talk:SMonty</id>
		<title>User talk:SMonty</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/wiki/User_talk:SMonty"/>
				<updated>2009-09-20T22:46:12Z</updated>
		
		<summary type="html">&lt;p&gt;Ace Frahm: /* Request For Help */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Beginner's Guide==&lt;br /&gt;
Hey, thanks for your fixes on the [[Beginner's Basic Plugin Guide]]. --[[User:Culix|Culix]] 03:07, 26 June 2009 (UTC)&lt;br /&gt;
:Hey SMonty. I'm glad you like the guide :) Your updates so far are great, and yes, adding tutorials on how to create gen_ and ml_ plugins sounds excellent. Writing tutorials is what I would have planned to do next, but I don't know much about coding winamp plugins yet; so if you have material to add that's great! I'll look forward to it. --[[User:Culix|Culix]] 23:47, 1 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Tutorial ==&lt;br /&gt;
&lt;br /&gt;
Great work on the [[Basic_Plugin_Guide_-_Tutorial|Basic Plugin Tutorial]]! I'm learning useful things and it's a nice writing style :) --[[User:Culix|Culix]] 02:58, 14 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Request For Help ==&lt;br /&gt;
&lt;br /&gt;
Please take a look at this:&lt;br /&gt;
&lt;br /&gt;
http://dev.winamp.com/wiki/Talk:Beginner%27s_Basic_Plugin_Guide#Basic_gen_empty.dll_File_Crashes_WinAMP_On_Start_Of_WinAMP.&lt;/div&gt;</summary>
		<author><name>Ace Frahm</name></author>	</entry>

	<entry>
		<id>http://wiki.shoutcast.com/wiki/Talk:Beginner%27s_Basic_Plugin_Guide</id>
		<title>Talk:Beginner's Basic Plugin Guide</title>
		<link rel="alternate" type="text/html" href="http://wiki.shoutcast.com/wiki/Talk:Beginner%27s_Basic_Plugin_Guide"/>
				<updated>2009-09-20T22:44:14Z</updated>
		
		<summary type="html">&lt;p&gt;Ace Frahm: Empty Blank Generic Plugin Example Crashes WinAMP 5.56 On Launch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Is this format okay?==&lt;br /&gt;
Hey everyone, this is my first work with any Winamp plugin code and my first edits to the wiki. Sorry if anything is in the wrong format or wrong place. Please feel free to move or work on it; I'm open to suggestions on how to improve. --[[User:Culix|Culix]] 02:29, 10 June 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Questions and TODO ==&lt;br /&gt;
&lt;br /&gt;
I still have a few questions about writing plugins. These should probably be filled into the guide at some point. --[[User:Culix|Culix]] 02:34, 10 June 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
* How do the naming conventions work for plugins? It seems more complicated than simply naming your file 'gen_*' or 'ml_*'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;The answer to this is complicated, as so much with Winamp.  The prefix is actually used by Winamp.exe to find plugins and identify what type they are.  There is another way to create plugins that does not require the prefix.  This second way is called Wasabi.  Wasabi is a way to 'share' code among components of a software system (i.e., Winamp).  Wasabi dlls do not need the prefix.  We'll get to Wasabi if we keep writing these kinds of tutorials.  Is there something specific about the prefixes that leads you to believe that there is a 'real' answer?  Maybe I can investigate further.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* For the &amp;quot;cannot convert parameter from 'const char [x]' to 'LPCTSTR'&amp;quot; error, which option from the [http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/c1b08c0a-a803-41c3-ac8c-84eba3be1ddb MSDN FAQ] should we actually use? Is it better to change the project settings to use a multi-byte character set?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;I would not change the project settings and instead use the L&amp;quot;&amp;quot; or _TEXT constructs to indicate that the strings are wide strings.  Winamp programmers prefer to be even more specific and actually call the MessageBoxW() or MessageBoxA() methods to make it absolutely clear as to which function and what form the input is in (this would make the project switch meaningless).  Since Winamp is a very popular application around the world it is best to use UNICODE.&amp;lt;/p&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Having said that, Winamp is also ancient (in computer years) and so every once in a while you might run across places within Winamp that do not handle UNICODE and will require ASCII strings.  For example, notice the description field of the winampGeneralPurposePlugin structure.  It was never converted to use UNICODE since that would change the size of the structure requiring a new revision and all the attendant problems that go along with that.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Why do some people put their 'extern &amp;quot;C&amp;quot; __declspec' code in the header and others in the .cpp? Does it matter?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;The point of the extern &amp;quot;C&amp;quot; is to tell the linker not to perform C++ name mangling on the function name.  This is necessary when some other application needs to invoke the method and therefore needs to use a name that is easier to use.  Technically it doesn't matter whether you put them in a header or cpp file and it boils down to the more common reasons why you choose to put things in header files rather than including them in the cpp file.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Basic gen_empty.dll File Crashes WinAMP On Start Of WinAMP.===&lt;br /&gt;
I have turned off pre-compiled headers in VS 2008 Pro.  &lt;br /&gt;
Right Click On Solution--&amp;gt;Properties--&amp;gt;Configuration Properties--&amp;gt;Linker--&amp;gt;Additional Dependencies has been blanked.  &lt;br /&gt;
Right Click On Solution--&amp;gt;Properties--&amp;gt;Configuration Properties--&amp;gt;C/C++ --&amp;gt;Precompiled Headers--&amp;gt;Create/Use Precompiled Header = &amp;quot;Not Using Precompiled Headers&amp;quot;&lt;br /&gt;
WinXP with service pack 3.&lt;br /&gt;
WinAMP 5.56 with Pacemaker and Playlist File Remover plugins installed.  &lt;br /&gt;
WinAMP was running just fine with Pacemaker, though Playlist File Remover doesn't send files to the recycle bin like it should (It worked in prior versions of WinAMP, but not 5.56, that's why I want to write a plugin)&lt;br /&gt;
&lt;br /&gt;
I get Visual Studio to compile a gen_empty.dll, but when I copy that to the &amp;quot;C:\Program Files\Winamp\Plugins&amp;quot; folder, WinAMP will crash on launch.  It begins to create visible WinAMP application window outlines on the screen, but then it fails to complete.  The outlined windows dissapear, and WinAMP.exe process vanishes from the task manager.&lt;br /&gt;
&lt;br /&gt;
Removing the empty blank gen_empty.dll from &amp;quot;C:\Program Files\Winamp\Plugins&amp;quot; fixes the problem, WinAMP starts normally, just as it did before.&lt;br /&gt;
&lt;br /&gt;
I even commented out the MessageBox-es so the functions would do NOTHING, and tried the resulting gen_empty.dll. &lt;br /&gt;
&lt;br /&gt;
'''What is wrong with this generic, blank plugin source code that causes WinAMP 5.56 to fail?'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
#ifndef gen_empty_h&lt;br /&gt;
#define gen_empty_h&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// plugin version (don't touch this)&lt;br /&gt;
#define GPPHDR_VER 0x10&lt;br /&gt;
&lt;br /&gt;
// plugin name/title (change this to something you like)&lt;br /&gt;
#define GPPHDR_NAME &amp;quot;gen_empty v1.0 (gen_empty.dll)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// main structure with plugin information, version, name...&lt;br /&gt;
typedef struct {&lt;br /&gt;
  int version;                   // version of the plugin, defined in &amp;quot;gen_empty.h&amp;quot;&lt;br /&gt;
  char *description;             // name/title of the plugin, defined in &amp;quot;gen_empty.h&amp;quot;&lt;br /&gt;
  int (*init)();                 // function which will be executed on init event&lt;br /&gt;
  void (*config)();              // function which will be executed on config event&lt;br /&gt;
  void (*quit)();                // function which will be executed on quit event&lt;br /&gt;
  HWND hwndParent;               // (?)&lt;br /&gt;
  HINSTANCE hDllInstance;        // (?)&lt;br /&gt;
} winampGeneralPurposePlugin;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extern winampGeneralPurposePlugin *gen_plugins[256];&lt;br /&gt;
typedef winampGeneralPurposePlugin * (*winampGeneralPurposePluginGetter)();&lt;br /&gt;
#endif&lt;br /&gt;
//---------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
//-----------------------------------------------------------------&lt;br /&gt;
// This is the main DLL file.&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#include &amp;quot;gen_empty.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// these are callback functions/events which will be called by Winamp&lt;br /&gt;
int  init(void);&lt;br /&gt;
void config(void);&lt;br /&gt;
void quit(void);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// this structure contains plugin information, version, name...&lt;br /&gt;
winampGeneralPurposePlugin plugin = {&lt;br /&gt;
  GPPHDR_VER,  // version of the plugin, defined in &amp;quot;gen_empty.h&amp;quot;&lt;br /&gt;
  GPPHDR_NAME, // name/title of the plugin, defined in &amp;quot;gen_empty.h&amp;quot;&lt;br /&gt;
  init,        // function name which will be executed on init event&lt;br /&gt;
  config,      // function name which will be executed on config event&lt;br /&gt;
  quit,        // function name which will be executed on quit event&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// event functions follow&lt;br /&gt;
&lt;br /&gt;
int init() {&lt;br /&gt;
//MessageBox(plugin.hwndParent, L&amp;quot;Init event triggered for gen_empty. Plugin installed successfully!&amp;quot;, L&amp;quot;&amp;quot;, MB_OK);&lt;br /&gt;
  return 0;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void config() {&lt;br /&gt;
//  MessageBox(plugin.hwndParent, L&amp;quot;Config event triggered for gen_empty.&amp;quot;, L&amp;quot;&amp;quot;, MB_OK);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void quit() {&lt;br /&gt;
//  MessageBox(0, L&amp;quot;Quit event triggered for gen_empty.&amp;quot;, L&amp;quot;&amp;quot;, MB_OK);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// this is an export function called by winamp which returns this plugin info&lt;br /&gt;
extern &amp;quot;C&amp;quot; __declspec(dllexport) winampGeneralPurposePlugin * winampGetGeneralPurposePlugin() {&lt;br /&gt;
  return &amp;amp;plugin;&lt;br /&gt;
}&lt;br /&gt;
//-----------------------------------------------------------------&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next Steps==&lt;br /&gt;
I think a good extension of this article would be to answer the user's question of &amp;quot;Okay, now what?&amp;quot;. If we could give them hints about where to go next, possibly depending on the type of plugin they want to write, that might be useful. This may just involve fleshing out the guide articles for each type of plugin and then linking to those... unless someone can think of something better? --[[User:Culix|Culix]] 14:54, 10 June 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Ace Frahm</name></author>	</entry>

	</feed>