Bonjour,
voici un cas d'appel à une DLL suite à une traduction dans C :
J'ai un soucis sur l'utilisation du DATADETECTEDPROC qui dans le langage C, n'est pas un appel en extérieur mais une fonction implémentée dans le code au dessus du create :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 uses Windows; type DATADETECTEDPROC=function(const pData:pbyte; ulSize:DWORD ; pContext:pointer):integer; stdcall; FN_CONTEXT = record ulFlags:dword; pfnDataDetected:DATADETECTEDPROC ; pContext:pointer; end; PFN_CONTEXT=^FN_CONTEXT; type PCFN_CONTEXT= ^FN_CONTEXT ; function InitCommContext(pContext:PCFN_CONTEXT ):integer;stdcall; external 'madll.dll'; function ExitCommContext():integer;stdcall; external 'madll.dll';
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
24
25
26
27
28
29
30
31
32
33
34
35 long __stdcall onDataDetected(const unsigned char *pData, unsigned long ulSize, void *pContext) { CDllIDRD_U_DemoDlg *p = (CDllIDRD_U_DemoDlg *)pContext; unsigned char *pBuffer = new unsigned char[ulSize+1]; memcpy(pBuffer, pData, ulSize); pBuffer[ulSize] = 0; CString str; p->GetDlgItemText(IDC_EDIT1, str); str += pBuffer; p->SetDlgItemText(IDC_EDIT1, str); delete [] pBuffer; return 0; } int CDllIDRD_U_DemoDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here FN_CONTEXT clsFnContext = { 1, // 0±íʾ±ê×¼×Ö·û¸ñʽ¡¢1±íʾʮÁù½øÖƸñʽ onDataDetected, this }; if(InitCommContext(&clsFnContext) != 0) { AfxMessageBox("Différent"); return -1; } AfxMessageBox("Egal"); return 0; }
Et actuellement j'ai :
Il me dit "connecté" mais quand je passe ma carte sur la machine, j'ai une erreur de violation d'accès (on dirait qu'il ne fait pas le lien avec une fonction OnDataDetected que j'ai crée)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 procedure TForm1.FormCreate(Sender: TObject); var OnDataDetected : DATADETECTEDPROC; begin New (clsFnContext); clsFnContext.ulFlags := 1; clsFnContext.pfnDataDetected := OnDataDetected; clsFnContext.pContext := self; if InitCommContext(clsFnContext) = 0 Then Memo1.Lines.Add('Connecté') else Memo1.Lines.Add('Pas Connecté'); end;
Donc j'arrive facilement à gérer les appels à l'initCommContext et à l'Exit, mais je ne sais pas comment gérer cette fonction OndataDetected sous Delphi (6), auriez vous une idée svp ?
Merci beaucoup !
Partager