Bonjour à tous,
J'ai un problème dans l'utilisation d'une classe contenu dans une DLL C dans un problème C#. J'ai donc essayé de définir des fonctions mais j'ai les mêmes problèmes
Pour information je peux modifier la DLL C et bien évidemment le programme C#.
Voici la partie déclarative en C :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 extern "C" __declspec(dllexport) CglassDetection* CglassDetection_New(wchar_t* _imageName); extern "C" __declspec(dllexport) wchar_t* CglassDetection_GetForme(CglassDetection* cp); extern "C" __declspec(dllexport) void CglassDetection_Delete(CglassDetection* cp);
Partie classe en C :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part wchar_t* TraiterImage();
Voici la partie déclarative en C# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_New", CharSet = CharSet.Unicode)] public static extern IntPtr NewCglassDetection(String imageName); [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_Delete", CharSet = CharSet.Unicode)] public static extern void DeleteCglassDetection(IntPtr cp); [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_GetForme", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] [return: MarshalAs(UnmanagedType.LPStr)] public static extern string GetForme(IntPtr thisptr); [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "?TraiterImage@CglassDetection@@QAEPA_WXZ", CharSet = CharSet.Auto, CallingConvention = CallingConvention.ThisCall)] //[return: MarshalAs(UnmanagedType.LPStr)] public static extern IntPtr TraiterImage(IntPtr thisptr);
Voilà le main en C# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 IntPtr cg = NewCglassDetection("S:\\Exemples\\Formes\\Shape_7.jpg"); //string myForme = TraiterImage(cg); string myForme = GetForme(cg); DeleteCglassDetection(cg);
Mon problème :
Si ma fontion GetForme créé un fichier contenant la string cela fonctionne par contre dès que je veux que ma fonction renvoi la string (Wchar_t en C) alors là j'ai l'erreur suivante :
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
Je ne comprend vraiment pas dès que ma fonction retourne une valeur alors ça plante.
Je dois manquer quelquechose, en cherchant j'ai vu qu'il fallait ajouter :
[return: MarshalAs(UnmanagedType.LPStr)]
à ma définition mais cela ne fonctionne pas non plus.
Si quelqu'un à l'expérience pour m'aider merci d'avance car là je commence à devenir fou ...
CobNemos
Partager