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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 [DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)] public unsafe static extern bool ScanAndRecognize(char *cData, int nDataSz);
2) J'ai essayé avec un type IntPtr:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
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.
Partager