OVH Cloud OVH Cloud

ActiveX : comment renvoyer un tableau

6 réponses
Avatar
mosfet
Je dois faire un controle ActiveX qui doit renvoyer un tableau de 256
octets. Mon problème vient du fait que j'ai toujours developpe en C++ et que
je ne connais rien au type d'un controle activeX.
Lorsque je crée une méthode dans mon activeX, il me demande le type de
retour, je mets quoi pour un tableau 'octets ?

6 réponses

Avatar
François Picalausa
Bonjour/soir,

Essaye ceci:
Public Function Toto(Param1 As Type, Param2 As Type, ...) As Byte()
Dim MyTable(255) As Byte '(0 à 255 = 256 éléments)
MyTable(0) = 1
'...
Toto = MyTable
End Function

On pourrait aussi utiliser une fonction qui ne revoie la donnée que d'un
index:
Public Function Toto(Param1 As Type, Param2 As Type, ..., Index As Long) As
Byte
Dim MyTable(255) As Byte '(0 à 255 = 256 éléments)
MyTable(0) = 1
'...
Toto = MyTable(Index)
End Function

Autant dans l'exemple cette méthode peut sembler inutile, autant elle peut
l'être quand tu as un tableau privé d'un module (et que donc, tu ne dois pas
recalculer les éléments à chaque fois).
Il est aussi possible d'utiliser un type String qui renverra une chaine de
caractère (donc, une suite d'octets)

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"mosfet" a écrit dans le message de
news:c0qoi0$ijc$
Je dois faire un controle ActiveX qui doit renvoyer un tableau de 256
octets. Mon problème vient du fait que j'ai toujours developpe en C++
et que je ne connais rien au type d'un controle activeX.
Lorsque je crée une méthode dans mon activeX, il me demande le type de
retour, je mets quoi pour un tableau 'octets ?


Avatar
mosfet
J'oublais de préciser que je developpe mon controle activeX en Visual C++
car je dois appeler une dll assez compliquée (pleins de pointeurs de
pointeurs, ... et donc en VB c'est pas facile).
Lorsque je vais dans le ClassWizard j'ai un onglet automation dans lequel je
peux ajouter soit une méthode soit une propriété, cependant quand j'essaye
de creer une methode, les types de retour sont les uisvants:

void
short
long
float
double
CURRENCY
DATE
BSTR
OLE_DATAPATH
...
...

Je mets quoi ? Y'a pas Byte




"François Picalausa" a écrit dans le message de
news:uw79$
Bonjour/soir,

Essaye ceci:
Public Function Toto(Param1 As Type, Param2 As Type, ...) As Byte()
Dim MyTable(255) As Byte '(0 à 255 = 256 éléments)
MyTable(0) = 1
'...
Toto = MyTable
End Function

On pourrait aussi utiliser une fonction qui ne revoie la donnée que d'un
index:
Public Function Toto(Param1 As Type, Param2 As Type, ..., Index As Long)


As
Byte
Dim MyTable(255) As Byte '(0 à 255 = 256 éléments)
MyTable(0) = 1
'...
Toto = MyTable(Index)
End Function

Autant dans l'exemple cette méthode peut sembler inutile, autant elle peut
l'être quand tu as un tableau privé d'un module (et que donc, tu ne dois


pas
recalculer les éléments à chaque fois).
Il est aussi possible d'utiliser un type String qui renverra une chaine de
caractère (donc, une suite d'octets)

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"mosfet" a écrit dans le message de
news:c0qoi0$ijc$
> Je dois faire un controle ActiveX qui doit renvoyer un tableau de 256
> octets. Mon problème vient du fait que j'ai toujours developpe en C++
> et que je ne connais rien au type d'un controle activeX.
> Lorsque je crée une méthode dans mon activeX, il me demande le type de
> retour, je mets quoi pour un tableau 'octets ?




Avatar
François Picalausa
Bonjour/soir,

Pour une question sur Visual C++, peut-être demander sur le groupe
correspondant? ;-)
news://msnews.microsoft.com/microsoft.public.fr.vc

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"mosfet" a écrit dans le message de
news:c0qvro$bh1$
J'oublais de préciser que je developpe mon controle activeX en Visual
C++ car je dois appeler une dll assez compliquée


Avatar
Fabrice MALAINGRE
Bonjour "mosfet",

Pour passer des tableaux de C++ vers VB (et vice versa), il faut utiliser le
type SafeArray.

Dans l'IDL de ton composant C++ cela donne quelque chose du genre :
=> [id(1), helpstring("method TakeMyArray")] HRESULT TakeMyArray([in, out]
long * Data_Qty, [ in, out ] SAFEARRAY(long) * pData );

Quant au code C++, la création du SafeArray s'effectue via la méthode
"SafeArrayCreateVector" où tu doit désigner le type des éléments contenus
dans le tableau ("VT_I4" pour un long).

Cordialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr
Avatar
mosfet
merci bcp. Au moins j'avance un peu.
Par contre dois je utiliser le Classwirard pour ca ou ecrire directement
dans le .odl ?
Pourriez vous me décrypter cette ligne :

HRESULT TakeMyArray([in, out] long * Data_Qty, [ in, out ] SAFEARRAY(long) *
pData );

dans la ligne au dessus quelles sont les paramètres et quel est le type de
la valeur de retour ?
HRESULT est le type de retour c ca ?
Je ne suis pas habitué a ce genre de notation [in, out].
"Fabrice MALAINGRE" a écrit dans le message de
news:eLRSK$
Bonjour "mosfet",

Pour passer des tableaux de C++ vers VB (et vice versa), il faut utiliser


le
type SafeArray.

Dans l'IDL de ton composant C++ cela donne quelque chose du genre :
=> [id(1), helpstring("method TakeMyArray")] HRESULT TakeMyArray([in, out]
long * Data_Qty, [ in, out ] SAFEARRAY(long) * pData );

Quant au code C++, la création du SafeArray s'effectue via la méthode
"SafeArrayCreateVector" où tu doit désigner le type des éléments contenus
dans le tableau ("VT_I4" pour un long).

Cordialement

____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr





Avatar
Fabrice MALAINGRE
Re bonjour "mosfet",

Pourriez vous me décrypter cette ligne :
HRESULT TakeMyArray([in, out] long * Data_Qty,
[ in, out ] SAFEARRAY(long) *> pData );
dans la ligne au dessus quelles sont les paramètres
et quel est le type de la valeur de retour ?
HRESULT est le type de retour c ca ?
Je ne suis pas habitué a ce genre de notation [in, out].



Tout d'abord il s'agit effectivement de syntaxe IDL.

Les méthodes d'un objet COM doivent toujours renvoyer un HRESULT.
Celui-ci permet tout simplement de savoir si l'appel s'est bien passé.

La syntaxe [in, out] indique au compilateur IDL (MIDL.EXE) le sens de
passage des paramètres.
Information indispensable pour réaliser le Marshalling de l'interface (i.e.
passage des paramètres d'un espace d'adressage à un autre).

Enfin, le type SAFEARRAY normalise le passage de tableau en COM/DCOM.
Tu trouveras un très bon article sur le sujet (avec un exemple) dans "The
Code Project" :
http://www.codeproject.com/dll/ctovbarray_passing.asp


Cordialement
____________________________
Fabrice MALAINGRE
Architecte Logiciel - Chef de Projet
THEORIS - www.theoris.fr