Tableau de "pointeur"
par
, 16/11/2016 à 00h09 (569 Affichages)
Transmettre un UDT (User Define Type) à une fonction C via VBA
La source de la discussion est ici : http://www.developpez.net/forums/d13...leau-pointeur/
J'ai deux exemple simple adaptés d'un exemple du site msdn (je n'ai plus les liens) qui pourraient t'aider à traiter ton problème.
Le premier exemple illustre l'utilisation de type défini, le deuxième l'utilisation de tableaux.
code compilé Sous Visual c++
Code C : 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
36
37
38 #include <windows.h> #include <ole2.h> #pragma pack(1) #define DLL_EXPORT __declspec(dllexport) #define STDCALL __stdcall typedef struct { short f1; short filler_1; long f2; BYTE f3; WCHAR f4; BYTE filler_2; float f5; } MyStruct; DLL_EXPORT void STDCALL FillUDTVariable(MyStruct * ms) { ms->f1 = 2001; ms->f2 = 20012001; ms->f3 = 255; ms->f4 = L'A'; ms->f5 = 200.1f; } DLL_EXPORT void STDCALL FillUDTSafeArray(LPSAFEARRAY FAR * ppsa) { MyStruct * pdata; unsigned int i; pdata = (MyStruct*)((*ppsa)->pvData); for (i = 0; i < ((*ppsa)->rgsabound->cElements); i++,pdata++) FillUDTVariable(pdata); }
La partie sous vb
Code VB.NET : 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
36
37
38
39 Type My_ArrayUDT F1 As Integer F2 As Long F3 As Byte F4 As String * 1 F5 As Single End Type Private Declare Sub FillUDTVariable Lib "Modulo.DLL" _ Alias "_FillUDTVariable@4" (A As My_VarUDT) Private Declare Sub FillUDTSafeArray Lib "Modulo.DLL" _ Alias "_FillUDTSafeArray@4" (A() As My_ArrayUDT) Sub Test() Dim A As Long, B As My_VarUDT, C As String, D(3) As My_ArrayUDT Debug.Print "---Variable of My_VarUDT-------" FillUDTVariable B With B C = .F4 Debug.Print .F1, .F2, .F3, C; "("; .F4(0); .F4(1); ")", .F5 End With Debug.Print "---Safe array of My_ArrayUDT-------" FillUDTSafeArray D() For A = 0 To 3 With D(A) Debug.Print .F1, .F2, .F3, .F4; "("; AscB(MidB(.F4, 1, 1)); Debug.Print AscB(MidB(.F4, 2, 1)); ")", .F5 End With Next A End Sub
*******************************************
Cet autre exemple
le code compilé sous visual c++:
Code C : 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 #include <oleauto.h> #define EXPORT __declspec (dllexport) #define STDCALL __stdcall #define T_COUNT(t) (sizeof(t) / sizeof(t[0])) /********************************************************** SommeTableau - une fonction d'addition en pointeur (long *) classique du c long *plAjout, pointeur du tableau long lDims nb éléments du tableau returns lSum: la somme des elements ***********************************************************/ EXPORT long STDCALL SommeTableau( long *plAjout, // pointeur du tableau long lDims) { long lSum = 0; long i = 0; lSum = 0; if(lDims > 0) { for (; i < lDims; i++) lSum = lSum + plAjout[i]; } // returning return(lSum); } /************************************************************************************* Fonction: Somme_SafeArray 'Addition tableau de type long' ***Paramètres:*** SAFEARRAY **pTbl: tableau long *lpSomme: renvoi la somme des éléments du tableau Varaiables utilisées: long lDims: nombre d'éléments du tableau long countId: compteur dans la boucle HRESULT lOleResult: pour les codes retour de functions OLE long *pTblElems: pointeur d'elements du SafeArray Code Renvoyé: 0 Réussite <>0 Echec **************************************************************************************/ EXPORT long STDCALL Somme_SafeArray(SAFEARRAY **pTbl, long *lpSomme) { long lDims; long countId; HRESULT lpOleResult; long *pTblElems; *lpSomme = 0; if ( (*pTbl)->cDims != 1 ) return(1); // test dimensions if ( (*pTbl)->cbElements != 4 ) return(2); // test taille octect lDims=(*pTbl)->rgsabound[0].cElements; // Nombre d'éléments lpOleResult = SafeArrayLock(*pTbl); //verouillage du tableau if(lpOleResult)return(3); pTblElems=(long*) (*pTbl)->pvData; // casting pour utiliser le tableau for (countId=0; countId < lDims; countId++) *lpSomme = *lpSomme + pTblElems[countId]; //addition des valeurs d'éléments du tableau dans lpSum lpOleResult=SafeArrayUnlock(*pTbl); // dévérouillage du tableau if (lpOleResult) return(4); return(0); }
Tester sous vb ainsi après les déclarations d'Api
Code VB.NET : 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 Private Sub SumArrayTest() Dim tblSomme(2) As Long Dim lSum As Long Dim k As Long tblSomme(0) = 1 tblSomme(1) = 2 tblSomme(2) = 3 lSum = SommeTableau(tblSomme(0), UBound(tblSomme) + 1) Debug.Print "Somme avec pointeur tableau c classique:"; lSum lSum = 0 k = Somme_SafeArray(tblSomme(), lSum) Debug.Print "Somme avec pointeur Safearray:"; lSum End Sub