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
Message édité par Harkonnen le 15-05-2005 à 23:06:29
---------------
J'ai un string dans l'array (Paris Hilton)