Avoir le code suivant en C++ :
- nConId est l'identifiant de la connexion
- pParName le nom du paramètre
- pSubName le nom du sous-Paramètre (le cas échéant)
- pValue_out un pointeur vers un tableau de caractères de longueur FCL_PAR_VALUE_LENGH
- nValueSize la taille réelle du vecteur pValue_out (au moins FCL_PAR_VALUE_LENGH)
extern "C" MY_API int ReadParameter(const ConnectionId_T nConId, const char* pParName,
const char *pSubName, char *pValue_out, const int nValueSize );
Mon essai est :
[DllImport("mydll.dll", CharSet = CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)]
public static extern int ReadParameter(ConnectionId_T pConId, IntPtr pParName,
ref IntPtr pSubName, ref IntPtr[] pValue_out, int nValueSize);
J'utilise le code suivant pour appeler cette fonction :
# nConId is returned from another function and the his value is 0
public const int FCL_PAR_VALUE_LENGH = 128;
string param_string = "AUXF";
IntPtr pParName = (IntPtr)Marshal.StringToHGlobalAnsi(param_string);
string subparam_string = "T";
IntPtr pSubName = (IntPtr)Marshal.StringToHGlobalAnsi(subparam_string);
IntPtr[] aParValue = new IntPtr[FCL_PAR_VALUE_LENGH];
int returnedValue = ReadParameter(nConId, pParName, ref pSubName,
ref aParValue, FCL_PAR_VALUE_LENGH);
Lorsque j'exécute le code, j'obtiens un AccessViolationException donc je suppose qu'il y a quelque chose qui cloche dans mon appel.
Je me suis trompé de marshall ? Que dois-je changer dans le code pour obtenir une bonne réponse ?
PS : Je sais aussi que l'appel renvoie aussi quelque chose à aParValue
.