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)