Bonjour,

voici un cas d'appel à une DLL suite à une traduction dans C :

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';
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
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 :

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;
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)

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 !