yep 
 
dans un élan de masochisme, j'ai décidé d'occuper mon dimanche en recodant mon merveilleux plugin de ma signature en C#
 
l'API de Winamp étant tellement bien foutue, les plugins communiquent avec Winamp par le biais de SendMessage(), vive le progrès 
 
je dois donc jouer avec le P/Invoke et le Marshalling pour convertir tout ce bordel dans les types qui vont bien, du pur bonheur 
 
voici donc la signature Win32 de SendMessage()
Code :
 - LRESULT SendMessage(     
 -     HWND hWnd,
 -     UINT Msg,
 -     WPARAM wParam,
 -     LPARAM lParam
 - );
 
  | 
et voici ma version pour C# :
Code :
 - [DllImport("user32.dll",CharSet = CharSet.Auto)]
 - static extern int SendMessage(
 -    IntPtr hWnd,
 -    [MarshalAs(UnmanagedType.U4)] int Msg,
 -    IntPtr wParam,
 -    IntPtr lParam);
 
  | 
 
sans oublier une jolie structure du SDK de Winamp, 100% moderne 
Code :
 - typedef struct {
 -   char *filename;
 -   char *metadata;
 -   char *ret;
 -   int retlen;
 - } extendedFileInfoStruct;
 
  | 
et ma version managée
Code :
 - [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)]
 - public struct extendedFileInfoStruct
 - {
 -    public string filename;
 -    public string metadata;
 -    public StringBuilder ret;
 -    uint retlen;
 - }
 
  | 
ou est le problème ? très simple ! 
après avoir rempli cette magnifique structure, je dois passer un pointeur vers cette structure à SendMessage() en wParam, et c'est là que je bloque !
 
si je fais ça (efi est une instance de la structure) :
Code :
 - SendMessage(pluginWindow, WM_WA_IPC, ref efi, (IntPtr)IPC_GET_EXTENDED_FILE_INFO);
 
  | 
j'ai ce joli message :
Citation :
 
 
 Argument '3' : impossible de convertir de 'ref Plugin.mainApp.extendedFileInfoStruct' en 'System.IntPtr'
 
   | 
 
par contre, si je change le type du paramètre 3 de ma fonction SendMessage() managée comme ceci :
Code :
 - static extern int SendMessage(
 -    IntPtr hWnd,
 -    [MarshalAs(UnmanagedType.U4)] int Msg,
 -    ref extendedFileInfoStruct wParam,
 -    IntPtr lParam);
 
  | 
ça marche nickel 
 
mais bon, c'est une solution à la con, car si je devais utiliser SendMessage plusieurs fois dans mon programme, je l'aurais dans l'os !
 
l'idéal serait de passer en mode unsafe, et de lui passer l'adresse de la structure, mais j'aimerais savoir si y'a pas un moyen plus propre et moins bourrin
 
vala ![[:god] [:god]](https://forum-images.hardware.fr/images/perso/god.gif)
 
Message édité par Harkonnen le 15-05-2005 à 23:06:29
 ---------------
			
J'ai un string dans l'array (Paris Hilton)