IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

NVCfrm

Tableau de "pointeur"

Noter ce billet
par , 16/11/2016 à 00h09 (776 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

Envoyer le billet « Tableau de "pointeur" » dans le blog Viadeo Envoyer le billet « Tableau de "pointeur" » dans le blog Twitter Envoyer le billet « Tableau de "pointeur" » dans le blog Google Envoyer le billet « Tableau de "pointeur" » dans le blog Facebook Envoyer le billet « Tableau de "pointeur" » dans le blog Digg Envoyer le billet « Tableau de "pointeur" » dans le blog Delicious Envoyer le billet « Tableau de "pointeur" » dans le blog MySpace Envoyer le billet « Tableau de "pointeur" » dans le blog Yahoo

Mis à jour 16/08/2017 à 20h20 par Malick

Catégories
Sans catégorie

Commentaires