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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
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,
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.
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.
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" <jacques@Nospam> wrote in message
news:eVoHLwRHGHA.1124@TK2MSFTNGP10.phx.gbl...
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,
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.
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.
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 :-(
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 :-(