P/Invoke sur fonction native C
Bonjour à tous,
J'ai un problème qui traine depuis plusieurs jours et c'est pas faute d'avoir essayer tout et n'importe quoi pour remédier à cela mais toujours rien.
Je m'explique j'ai besoin de faire appel à une fonction C d'un programme extérieur au mien (C#).
Je me suis donc dis qu'il fallait que je fasse une dll ou j'exporte ma fonction C de telle sorte qu'elle puisse être utilisable sur mon code C# (si il y a un autre moyen je veux bien le connaitre :)).
Le problème c'est que ma fonction C utilise des char * en entrée et sortie.
Voici comment j'ai exporté ma fonction C :
Code:
1 2
|
extern "C" __declspec(dllexport) char * func(char *pwd) |
Et voici comment j'utilise tout ca en C#
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
[DllImport("func.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr func(StringBuilder pwd);
...
StringBuilder pass = new StringBuilder(sclient.pass);
IntPtr lpStrRet = Marshal.AllocHGlobal(256);
lpStrRet = func(pass);
if (lpStrRet.ToInt32() == 0) throw new Exception("lpStrRet NULL");
string hashedpwd = Marshal.PtrToStringAuto(lpStrRet);
Marshal.FreeHGlobal(lpStrRet);
Console.WriteLine("ret func C : " + hashedpwd); |
J'ai eu le droit à une erreur m'indiquant que il ne trouvait pas le point d'entrée, j'ai donc lancé un dumpbin dans une fenetre prompt visual pour vérifier que j'exporte bien ma fonction voici ce que j'ai eu :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
File Type: DLL
Section contains the following exports for func.dll
..
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00011113 func = @ILT+270(_func) |
j'ai donc rajouté un paramètre EntryPoint=func dans le dllimport
et j'ai changé ma fonction C# en _func et la du coup j'ai un message d'erreur qui me dit "L'accès à cet emplacement de la mémoire n'est pas valide. (Exception de HRESULT)".
Je n'ai donc plus vraiment d'idées sur quoi faire pour remédier à cela si quelqu'un en a une vraiment je suis preneur!
Merci à tous et bonne journée