Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

joindre les DLL et OCX

10 réponses
Avatar
sefiani
bonjours,
je voudrai executer mon application sur n'importe quel=20
poste sans installer l'application (Poste W95,W98,XP et=20
NT4).
j'ai mis les DLL et les OCX dans le m=EAme chemin que mon=20
application mais ca n'a pas marcher.

Merci de votre aide.

10 réponses

Avatar
As tu pensé à les enregistrer tes contrôles OCX et DLL
dans la base de registre ?

-----Message d'origine-----
bonjours,
je voudrai executer mon application sur n'importe quel
poste sans installer l'application (Poste W95,W98,XP et
NT4).
j'ai mis les DLL et les OCX dans le même chemin que mon
application mais ca n'a pas marcher.

Merci de votre aide.
.



Avatar
merci pour votre réponse.

comment je vais faire cette enregistrement a partir de VB.
lors du démarage de l'application

Merci

-----Message d'origine-----
As tu pensé à les enregistrer tes contrôles OCX et DLL
dans la base de registre ?


Avatar
Zoury
Salut! :O)

Voici un exemple commenté, il contient 2 projets
'***
' Project1
' Class1
Option Explicit

Public Nom As String
'***

Compilé le projet Project1.
le désenregistrer avant de continuer :
regsvr32 "..project1.dll" /u



'***
' Project2
' Module1
' ajouté la référence à Project1.dll
Option Explicit

' Chaque composante COM expose
' les fonctions DllRegisterServer() et
' DllUnregisterServer() on a qu'a les appelées
' pour enregistrer ou désenregistrer au besoin
'
' Si tu as plusieurs dll ou ocx a enregsitrer,
' tu peux utiliser un Alias afin de déclarer
' toute les fonctions nécessaire
'
Private Declare Function DllRegisterServer _
Lib "Project1.dll" _
() As Long

' Valeur HRESULT pour un succès
'
Private Const S_OK As Long = 0

' Constantes pour les messages systèmes
'
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200&
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000&
Private Const LANG_NEUTRAL As Long = &H0&

' Permet d'obtenir le message système au besoin
'
Private Declare Function FormatMessageA _
Lib "kernel32" _
( _
ByVal dwFlags As Long, _
ByRef lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
ByRef Arguments As Long _
) As Long

Private Sub Main()

' on enregistre la librairie
On Error Resume Next
If (DllRegisterServer = S_OK) Then
' on l'utilise!! :O)
Dim c As Project1.Class1
Set c = New Project1.Class1
c.Nom = "test"
Debug.Print c.Nom
Else
' une erreur s'est produite
If (Err.Number > 0) Then
Debug.Print Err.Description
ElseIf (Err.LastDllError > 0) Then
Debug.Print FormatMessage(Err.LastDllError)
End If
End If

End Sub

Private Function FormatMessage(ByRef lErrorNumber As Long) As String
FormatMessage = Space$(255)
Call FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, _
ByVal 0&, _
lErrorNumber, _
LANG_NEUTRAL, _
FormatMessage, _
255, _
ByVal 0&)
FormatMessage = Left$(FormatMessage, _
InStr(FormatMessage, vbNewLine) - 1)
End Function
'***

n'hésite pas si tu as des questions.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
ng
Salut,

Dans ta Sub Main (donc dans ton module de démarrage), il te suffit
d'enregistrer les composants COM utilisés ainsi :

Dim strPath as string
strPath = "c:chemin du composant.dll"

Call Shell("regsvr32 /s """ & strPath & """, vbHide)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

a
écrit :

merci pour votre réponse.

comment je vais faire cette enregistrement a partir de VB.
lors du démarage de l'application

Merci

-----Message d'origine-----
As tu pensé à les enregistrer tes contrôles OCX et DLL
dans la base de registre ?




Avatar
Zoury
Salut Nicolas! :O)

Dans ta Sub Main (donc dans ton module de démarrage), il te suffit
d'enregistrer les composants COM utilisés ainsi :
Call Shell("regsvr32 /s """ & strPath & """, vbHide)



J'ai testé cette solution (avant de penser à l'autre posté un peu plus
tôt)..

j'y voyais 2 inconvénients.

1. Le temps que l'enregistrement s'effectue peut nuire à la déclaration de
variables utilisant ces composantes si c'est variable sont instancié trop
tôt par la suite... On peut faire une boucle qui tente d'instancier les
objets jusqu'à ce que Err.Number égal 0 afin de contourner le problème, mais
je n'aime pas trop ça..

<air code>
'***
Call Shell("regavr32 ""project1.dll""")

On Error Resume Next
Do
Call Err.Clear
Dim o As Class1
Set o = New Class1
' code....
Loop While Err.Number > 0
On Error Goto 0
'***

2. Un message s'affiche *à chaque* appel de regsvr32 pour avertir que la
composante à été enregistrer avec succès. :OP

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Zoury
> 1/ Je la fais suivre d'un Sleep(200), ca résoud le problème si le plugin
doit être appelé aussitot (mais ce n'est pas forcément le cas, la classe
peut être créée longtemps après dans son appli...).



exact.

2/ Si tu regardes bien mon code tu y veras un paramètres /s qui permet de
faire cela en silence, comme spécifié dans l'aide de regsvr32 :



hmm.. j'y ai pensé mais j'ai oublié d'aller vérifier. merci pour l'info :O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
François Picalausa
Hello!

Pour information, je me suis demandé comment faire pour enregistrer les dll
sans déclarer statiquement le nom dans une api, pour avoir un code un peu
plus générique.
Voici le résultat:
'-----------------------------------------------------------
Option Explicit

Private Const INFINITE = &HFFFFFFFF '// Infinite timeout

Private Declare Function LoadLibrary _
Lib "kernel32" _
Alias "LoadLibraryA" _
( _
ByVal lpLibFileName As String _
) _
As Long
Private Declare Function FreeLibrary _
Lib "kernel32" _
( _
ByVal hLibModule As Long _
) _
As Long
Private Declare Function GetProcAddress _
Lib "kernel32" _
( _
ByVal HMODULE As Long, _
ByVal lpProcName As String _
) _
As Long

Private Declare Function CreateThread _
Lib "kernel32" _
( _
lpThreadAttributes As Any, _
ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, _
lpParameter As Any, _
ByVal dwCreationFlags As Long, _
lpThreadId As Long _
) _
As Long

Private Declare Function WaitForSingleObject _
Lib "kernel32" _
( _
ByVal hHandle As Long, _
ByVal dwMilliseconds As Long _
) _
As Long
Private Declare Function CloseHandle _
Lib "kernel32" _
( _
ByVal hObject As Long _
) _
As Long

Private Declare Function GetExitCodeThread _
Lib "kernel32" _
( _
ByVal hThread As Long, _
lpExitCode As Long _
) _
As Long

Public Function RegisterDLL(DLLPath As String) As Boolean
Dim HMODULE As Long, lpfnProcAddr As Long, hThread As Long, dwThreadId
As Long

'On charge la dll
HMODULE = LoadLibrary(DLLPath)

'Si le chargement est correct
If HMODULE Then
'On tente de retrouver l'adresse de la procédure
lpfnProcAddr = GetProcAddress(HMODULE, "DllRegisterServer")

'Si l'adresse de la procédure est valide
If lpfnProcAddr Then
'On crée un nouveau thread exécutant la procédure à partir de
son adresse
'Une autre solution serait de créer une dll de callback en c
'Cela éviterait le thread (les threads n'étant pas forcément
stables en VB)
hThread = CreateThread(ByVal 0&, 0, ByVal lpfnProcAddr, ByVal
0&, 0, dwThreadId)
'Si la création du thread a réussit
If hThread Then
'On attend la fin de son exécution
'Peut planter si le thread plante
WaitForSingleObject hThread, INFINITE

'Retrouve le code de sortie
If GetExitCodeThread(hThread, dwThreadId) Then
'Affecte une valeur de retour
RegisterDLL = (dwThreadId = 0)
End If

'Ferme le thread
CloseHandle hThread
End If
End If

'Libère la dll
FreeLibrary HMODULE
End If
End Function
'-----------------------------------------------------------

Voila voila :-)

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net
Avatar
ng
Salut,

Personnellement j'utilise souvent cette méthode pour l'enregistrement des
plugins de mon applis.

1/ Je la fais suivre d'un Sleep(200), ca résoud le problème si le plugin
doit être appelé aussitot (mais ce n'est pas forcément le cas, la classe
peut être créée longtemps après dans son appli...).

2/ Si tu regardes bien mon code tu y veras un paramètres /s qui permet de
faire cela en silence, comme spécifié dans l'aide de regsvr32 :

---------------------------
RegSvr32
---------------------------
Utilisation : regsvr32 [/u] [/s] [/n] [/i[:commande]] Nom_de_DLL
/u - Désinscrit le serveur
/s - Mode silencieux (n'affiche aucun message)
/i - Appelle DllInstall et transmet une [commande] facultative. Utilisé avec
/u, appelle dll uninstall
/n - Ne pas appeler DllRegisterServer. Utiliser cette option avec /i
---------------------------
OK
---------------------------


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Zoury a écrit :

Salut Nicolas! :O)

Dans ta Sub Main (donc dans ton module de démarrage), il te suffit
d'enregistrer les composants COM utilisés ainsi :
Call Shell("regsvr32 /s """ & strPath & """, vbHide)



J'ai testé cette solution (avant de penser à l'autre posté un peu plus
tôt)..

j'y voyais 2 inconvénients.

1. Le temps que l'enregistrement s'effectue peut nuire à la
déclaration de variables utilisant ces composantes si c'est variable
sont instancié trop tôt par la suite... On peut faire une boucle qui
tente d'instancier les objets jusqu'à ce que Err.Number égal 0 afin
de contourner le problème, mais je n'aime pas trop ça..

<air code>
'***
Call Shell("regavr32 ""project1.dll""")

On Error Resume Next
Do
Call Err.Clear
Dim o As Class1
Set o = New Class1
' code....
Loop While Err.Number > 0
On Error Goto 0
'***

2. Un message s'affiche *à chaque* appel de regsvr32 pour avertir que
la composante à été enregistrer avec succès. :OP


Avatar
ng
ReSalut,

Mais on pourrais très bien utiliser ton code aussi pour attendre, je le
reformulerai ainsi :


Call Shell("regsvr32 /s ""project1.dll""")
On Error Resume Next
Dim oTest As Object
Do
Call Err.Clear
Set oTest = CreateObject("MaDll.MaClasse")
Set oTest = Nothing
Loop While Err.Number <> 0
On Error Goto 0

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Zoury a écrit :

Salut Nicolas! :O)

Dans ta Sub Main (donc dans ton module de démarrage), il te suffit
d'enregistrer les composants COM utilisés ainsi :
Call Shell("regsvr32 /s """ & strPath & """, vbHide)



J'ai testé cette solution (avant de penser à l'autre posté un peu plus
tôt)..

j'y voyais 2 inconvénients.

1. Le temps que l'enregistrement s'effectue peut nuire à la
déclaration de variables utilisant ces composantes si c'est variable
sont instancié trop tôt par la suite... On peut faire une boucle qui
tente d'instancier les objets jusqu'à ce que Err.Number égal 0 afin
de contourner le problème, mais je n'aime pas trop ça..

<air code>
'***
Call Shell("regavr32 ""project1.dll""")

On Error Resume Next
Do
Call Err.Clear
Dim o As Class1
Set o = New Class1
' code....
Loop While Err.Number > 0
On Error Goto 0
'***

2. Un message s'affiche *à chaque* appel de regsvr32 pour avertir que
la composante à été enregistrer avec succès. :OP


Avatar
Zoury
Voilà qui est bien! mise à part l'utilisation thread.. Il me semble avoir lu
que Matthew Curland offrait dans son livre une fonction permettant d'appeler
des fonctions à partir de leur adresse, elle permettrait même de passé les
paramètres nécessaire.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

"François Picalausa" wrote in message
news:
Hello!

Pour information, je me suis demandé comment faire pour enregistrer les


dll
sans déclarer statiquement le nom dans une api, pour avoir un code un peu
plus générique.
Voici le résultat:
'-----------------------------------------------------------
Option Explicit

Private Const INFINITE = &HFFFFFFFF '// Infinite timeout

Private Declare Function LoadLibrary _
Lib "kernel32" _
Alias "LoadLibraryA" _
( _
ByVal lpLibFileName As String _
) _
As Long
Private Declare Function FreeLibrary _
Lib "kernel32" _
( _
ByVal hLibModule As Long _
) _
As Long
Private Declare Function GetProcAddress _
Lib "kernel32" _
( _
ByVal HMODULE As Long, _
ByVal lpProcName As String _
) _
As Long

Private Declare Function CreateThread _
Lib "kernel32" _
( _
lpThreadAttributes As Any, _
ByVal dwStackSize As Long, _
ByVal lpStartAddress As Long, _
lpParameter As Any, _
ByVal dwCreationFlags As Long, _
lpThreadId As Long _
) _
As Long

Private Declare Function WaitForSingleObject _
Lib "kernel32" _
( _
ByVal hHandle As Long, _
ByVal dwMilliseconds As Long _
) _
As Long
Private Declare Function CloseHandle _
Lib "kernel32" _
( _
ByVal hObject As Long _
) _
As Long

Private Declare Function GetExitCodeThread _
Lib "kernel32" _
( _
ByVal hThread As Long, _
lpExitCode As Long _
) _
As Long

Public Function RegisterDLL(DLLPath As String) As Boolean
Dim HMODULE As Long, lpfnProcAddr As Long, hThread As Long,


dwThreadId
As Long

'On charge la dll
HMODULE = LoadLibrary(DLLPath)

'Si le chargement est correct
If HMODULE Then
'On tente de retrouver l'adresse de la procédure
lpfnProcAddr = GetProcAddress(HMODULE, "DllRegisterServer")

'Si l'adresse de la procédure est valide
If lpfnProcAddr Then
'On crée un nouveau thread exécutant la procédure à partir de
son adresse
'Une autre solution serait de créer une dll de callback en c
'Cela éviterait le thread (les threads n'étant pas forcément
stables en VB)
hThread = CreateThread(ByVal 0&, 0, ByVal lpfnProcAddr, ByVal
0&, 0, dwThreadId)
'Si la création du thread a réussit
If hThread Then
'On attend la fin de son exécution
'Peut planter si le thread plante
WaitForSingleObject hThread, INFINITE

'Retrouve le code de sortie
If GetExitCodeThread(hThread, dwThreadId) Then
'Affecte une valeur de retour
RegisterDLL = (dwThreadId = 0)
End If

'Ferme le thread
CloseHandle hThread
End If
End If

'Libère la dll
FreeLibrary HMODULE
End If
End Function
'-----------------------------------------------------------

Voila voila :-)

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net