OVH Cloud OVH Cloud

Type utilisateur et ActiveX

3 réponses
Avatar
Philippe HALET
Bonjour,

Dans ma recherche pour l'utilisation optimale de l'activeX au sein de mes
projets VB, j'ai la question suivante. Comment peut-on partager une
définition de structure entre une DLL ActiveX et un programme utilisant
cette DLL de manière dynamique (donc ici, pas de référence au projet de la
DLL ActiveX mais bien un CreateObject).

Exemple de DLL (c'est le projet MonActiveX et la classe s'appelle MaClasse):

Option Explicit

Public Type MyStruct
a As Integer
b As Integer
c As Integer
End Type

Public Function GetMyStruct() As Variant
Dim s As MyStruct

s.a = 1
s.b = 2
s.c = 3

GetMyStruct = s

End Function

...et pour l'exécutable:

Option Explicit

Private Sub Command1_Click()
Dim o As Object
Dim s As MyStruct

Set o = CreateObject("MonActiveX.MaClasse")

'MsgBox o.MyFunction

Set s = o.GetMyStruct

MsgBox "a=" & s.a & " b=" & s.b & " c=" & s.c

End Sub

D'avance merci pour vos aides précieuses,

Philippe

3 réponses

Avatar
Jacques93
Bonjour Philippe HALET,
Philippe HALET a écrit :
Bonjour,

Dans ma recherche pour l'utilisation optimale de l'activeX au sein de mes
projets VB, j'ai la question suivante. Comment peut-on partager une
définition de structure entre une DLL ActiveX et un programme utilisant
cette DLL de manière dynamique (donc ici, pas de référence au projet de la
DLL ActiveX mais bien un CreateObject).

Exemple de DLL (c'est le projet MonActiveX et la classe s'appelle MaClasse):

Option Explicit

Public Type MyStruct
a As Integer
b As Integer
c As Integer
End Type

Public Function GetMyStruct() As Variant
Dim s As MyStruct

s.a = 1
s.b = 2
s.c = 3

GetMyStruct = s

End Function

....et pour l'exécutable:

Option Explicit

Private Sub Command1_Click()
Dim o As Object
Dim s As MyStruct

Set o = CreateObject("MonActiveX.MaClasse")

'MsgBox o.MyFunction

Set s = o.GetMyStruct

MsgBox "a=" & s.a & " b=" & s.b & " c=" & s.c

End Sub




Si je comprends bien la question, tu veux éviter d'avoir à redéclarer :

Public Type MyStruct
a As Integer
b As Integer
c As Integer
End Type

dans l'executable. Si c'est bien le cas, il te faut déclarer :

s As Object

et non pas

s As MyStruct

C'est le même mécanisme qu'en VBScript, ou il n'y a pas cette notion de
références.

Une autre solution, serait d'avoir un module (.bas) commun à la dll et à
l'exe, où tu déclares tous tes types, énumérations, constantes, etc...
ce qui permet d'avoir un code plus lisible.
--
Cordialement,

Jacques.
Avatar
Philippe HALET
Jacques,

C'est bien ce que j'essaie de faire: je viens d'ailleurs de refaire mon code
suivant ton avis mais dans un cas comme dans l'autre, j'ai un horrible
message dès la compilation:

Compiler error:

Only user-defined types defined in public objects modules can be coerced to
or from a variant or passed to late-bound functions

...en anglais dans le texte!

Aurais-tu une idée de ce qui peut provoquer ce problème?

Bien à toi,

Philippe




"Jacques93" wrote in message
news:
Bonjour Philippe HALET,
Philippe HALET a écrit :
Bonjour,

Dans ma recherche pour l'utilisation optimale de l'activeX au sein de mes
projets VB, j'ai la question suivante. Comment peut-on partager une
définition de structure entre une DLL ActiveX et un programme utilisant
cette DLL de manière dynamique (donc ici, pas de référence au projet de
la DLL ActiveX mais bien un CreateObject).

Exemple de DLL (c'est le projet MonActiveX et la classe s'appelle
MaClasse):

Option Explicit

Public Type MyStruct
a As Integer
b As Integer
c As Integer
End Type

Public Function GetMyStruct() As Variant
Dim s As MyStruct

s.a = 1
s.b = 2
s.c = 3

GetMyStruct = s

End Function

....et pour l'exécutable:

Option Explicit

Private Sub Command1_Click()
Dim o As Object
Dim s As MyStruct

Set o = CreateObject("MonActiveX.MaClasse")

'MsgBox o.MyFunction

Set s = o.GetMyStruct

MsgBox "a=" & s.a & " b=" & s.b & " c=" & s.c

End Sub




Si je comprends bien la question, tu veux éviter d'avoir à redéclarer :

Public Type MyStruct
a As Integer
b As Integer
c As Integer
End Type

dans l'executable. Si c'est bien le cas, il te faut déclarer :

s As Object

et non pas

s As MyStruct

C'est le même mécanisme qu'en VBScript, ou il n'y a pas cette notion de
références.

Une autre solution, serait d'avoir un module (.bas) commun à la dll et à
l'exe, où tu déclares tous tes types, énumérations, constantes, etc... ce
qui permet d'avoir un code plus lisible.
--
Cordialement,

Jacques.


Avatar
Jacques93
Bonsoir Philippe HALET,
Philippe HALET a écrit :
Jacques,

C'est bien ce que j'essaie de faire: je viens d'ailleurs de refaire mon code
suivant ton avis mais dans un cas comme dans l'autre, j'ai un horrible
message dès la compilation:

Compiler error:

Only user-defined types defined in public objects modules can be coerced to
or from a variant or passed to late-bound functions

....en anglais dans le texte!

Aurais-tu une idée de ce qui peut provoquer ce problème?




Je crains d'avoir dit une c... dans mon message. Il n'est semble t-il
pas possible d'utiliser un .bas avec des "type" personnalisés en
conjonction avec un ActiveX. Désolé de t'avoir aiguillé sur une mauvaise
piste :-(

La nuit portant conseil, je vais me coucher. :-X

--
Cordialement,

Jacques.