Intégration d'une API dans un programme C#
Je cherche à intégrer une dll dans un programme écrit en c#. J'essaie de convertir un programme en C déjà existant et qui fonctionne en du c#. Plusieurs fonctions de l'API fonctionnent mais la fonction ScanAndRecognize() ne fonctionne pas. Cette fonction est appelée mais je ne récupère pas les données.
programme en C (qui fonctionne)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| //////// In a File.h:
MOCRAPI_USAGE bool ScanAndRecognize(char *cData, int nDataSz);
//////// In a File .c:
char cMrzData[1000];
memset(cMrzData, NULL, sizeof(cMrzData));
if (ScanAndRecognize(cMrzData, sizeof(cMrzData) - 1) == false)
PrintError();
else
{
// Print the result
cout << "Received recognition output:" << endl << endl;
for (int i = 0 ; cMrzData != 0 ; i++)
if (cMrzData != '\r')
cout << cMrzData;
else
cout << endl;
} |
Programme que j'essaie de faire en c#:
1) J'ai essayé avec un pointeur:
Code:
1 2 3
| [DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)]
public unsafe static extern bool ScanAndRecognize(char *cData, int nDataSz); |
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| unsafe
{
char[] mrz_data = new char[100];
fixed (char* mrz = mrz_data)
bool1 = ScanAndRecognize(mrz, 99);
} |
2) J'ai essayé avec un type IntPtr:
Code:
1 2 3 4 5 6 7 8
| public IntPtr cData;
[DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)]
public unsafe static extern bool ScanAndRecognize(ref IntPtr cData, int nDataSz);
// Call:
bool1 = ScanAndRecognize(ref cData, 1000);
textBox1.Text = Marshal.PtrToStringAnsi(cData); |
Dans les 2 cas, j'ai un message d'erreur lorsque la dll me retourne les données. Je pense que le problème vient du type (pointeur) que je n'interprète pas comme il faut. Message d'erreur :
Citation:
An unhandled exception of type 'System.AccessViolationException' occurred in Essai_api_desko.exe. Additional information: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.