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

VBA Chemin d'une DLL installée par un logiciel

14 réponses
Avatar
Eric S
Bonjour,

Je suis en train de développer un logiciel qui, en plus du programme
lui-même, fournit une DLL et une feuille de calcul Excel utilisant la
DLL. L'ensemble est installé sur l'ordinateur de l'utilisateur dans le
dossier par défaut pour les programmes. C'est là que commencent les
problèmes. Ce dossier est variable, typiquement:
sous Win32 : c:\Program Files
sous Winx64: c:\Program Files (x86)
ou tout autre si les paramètres de windows ont été changés.

Comment faire pour appeler ma DLL en tenant compte de cet aspect variable?

Jusqu'à présent, j'avais codé ça en statique dans l'entête de la macro:

Declare Function LitFichier Lib "c:\Program Files\MonLogiciel\MaLib.dll"
(ByVal Nom_Fichier As String, SizeNom As Long) As Long

Des pistes?

Éric

10 réponses

1 2
Avatar
isabelle
bonjour Éric,

peut tu tester cette macro avec Winx64 ?

Sub CheminRepertoiresSpeciaux()
'Testé sur WinXp
Const Cible = &H26
Dim objShell As Object
Dim objFolder As Object, objFolderItem As Object
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(Cible)
Set objFolderItem = objFolder.Self
MsgBox objFolderItem.Path
End Sub

isabelle

Le 2010-02-21 10:21, Eric S a écrit :
Bonjour,

Je suis en train de développer un logiciel qui, en plus du programme
lui-même, fournit une DLL et une feuille de calcul Excel utilisant la
DLL. L'ensemble est installé sur l'ordinateur de l'utilisateur dans le
dossier par défaut pour les programmes. C'est là que commencent les
problèmes. Ce dossier est variable, typiquement:
sous Win32 : c:Program Files
sous Winx64: c:Program Files (x86)
ou tout autre si les paramètres de windows ont été changés.

Comment faire pour appeler ma DLL en tenant compte de cet aspect
variable?

Jusqu'à présent, j'avais codé ça en statique dans l'entête de la macro:

Declare Function LitFichier Lib "c:Program
FilesMonLogicielMaLib.dll" (ByVal Nom_Fichier As String, SizeNom As
Long) As Long

Des pistes?

Éric


Avatar
Hervé
Bonjour,

Et en interrogeant le chemin de ton programme tu doit pouvoir récupérer le
chemin de ta DLL si elle est installée dans le même dossier non ?
en VB6 :
DossierDLL=App.Path & ""
En VB.Net :
DossierDLL=My.Application.Info.DirectoryPath & ""

Hervé.


"Eric S" a écrit dans le message de
news:4b814f6e$0$12192$
Bonjour,

Je suis en train de développer un logiciel qui, en plus du programme
lui-même, fournit une DLL et une feuille de calcul Excel utilisant la DLL.
L'ensemble est installé sur l'ordinateur de l'utilisateur dans le dossier
par défaut pour les programmes. C'est là que commencent les problèmes. Ce
dossier est variable, typiquement:
sous Win32 : c:Program Files
sous Winx64: c:Program Files (x86)
ou tout autre si les paramètres de windows ont été changés.

Comment faire pour appeler ma DLL en tenant compte de cet aspect variable?

Jusqu'à présent, j'avais codé ça en statique dans l'entête de la macro:

Declare Function LitFichier Lib "c:Program FilesMonLogicielMaLib.dll"
(ByVal Nom_Fichier As String, SizeNom As Long) As Long

Des pistes?

Éric


Avatar
Eric S
Le 21/02/2010 17:30, isabelle a écrit :
bonjour Éric,

peut tu tester cette macro avec Winx64 ?



Windows 7, x64 :

Résultat: C:Program Files (x86)


Eric
Avatar
Eric S
Je parle d'appeler la DLL depuis une macro excel, pas depuis mon
programme. Et si par défaut, la feuille excel se trouve dans le même
dossier que la DLL, ensuite l'utilisateur peut faire des copies de la
feuille excel dans d'autres dossiers mais il faut quand même retrouver
la DLL qui elle ne bouge pas.

Eric
Avatar
michdenis
Bonjour,

Habituellement, les fichiers "DLL" se retrouvent dans un de
ces répertoires selon le système d'exploitation utilisé

C:WindowsSystem32
Sous des versions de Windows plus anciennes :
c:WindowsSystem

Pour retrouver ta Dll, tu peux utiliser ceci si tu as placé ta DLL
dans le bon répertoire :

'Haut module standard : Déclaration de l'API
Private Declare Function GetSystemDirectory& Lib "kernel32" Alias _
"GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long)

'-------------------------------
Sub Test()
Dim MaDll As String
Trouver_Dll "MonFichier.Dll"
End Sub
'-------------------------------
Sub Trouver_Dll(MaDll As String)
Dim sPath As String, tPath As String
tPath = Space(255)
tPath = Left(tPath, GetSystemDirectory(tPath, 255)) & "" & MaDll
MsgBox tPath
End Sub
'-------------------------------


Pour ce qui suit, suppose que tu veuilles installer une Dll sur un
nouvel ordinateur. En supposant qu'elle est dans le même
répertoire que le fichier qui exécute cette macro, voici une façon
de copier cette Dll dans le bon répertoire et de l'initialiser dans
la base de registre de Windows

'Déclaration de l'Api dans le haut du module
Private Declare Function GetSystemDirectory& Lib "kernel32" Alias _
"GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long)
'----------------------------------------------
Sub OcxReg(OcxName As String)
Dim sPath As String, tPath As String
sPath = ThisWorkbook.Path & "" & OcxName
If Dir(sPath) = "" Then
MsgBox "File " & sPath & " no found !", 48
Exit Sub
End If
tPath = Space(255)
tPath = Left(tPath, GetSystemDirectory(tPath, 255)) & ""
If Dir(tPath & OcxName) = "" Then
FileCopy sPath, tPath & OcxName
Shell tPath & "regsvr32.exe " & OcxName & " /s"
End If
End Sub
'----------------------------------------------

ET pour l'appel de la procédure précédente :
'------------------------------------------------
Sub Test()
OcxReg "NomDeMaDll.Dll"
End Sub
'------------------------------------------------






"Eric S" a écrit dans le message de groupe de discussion :
4b814f6e$0$12192$
Bonjour,

Je suis en train de développer un logiciel qui, en plus du programme
lui-même, fournit une DLL et une feuille de calcul Excel utilisant la
DLL. L'ensemble est installé sur l'ordinateur de l'utilisateur dans le
dossier par défaut pour les programmes. C'est là que commencent les
problèmes. Ce dossier est variable, typiquement:
sous Win32 : c:Program Files
sous Winx64: c:Program Files (x86)
ou tout autre si les paramètres de windows ont été changés.

Comment faire pour appeler ma DLL en tenant compte de cet aspect variable?

Jusqu'à présent, j'avais codé ça en statique dans l'entête de la macro:

Declare Function LitFichier Lib "c:Program FilesMonLogicielMaLib.dll"
(ByVal Nom_Fichier As String, SizeNom As Long) As Long

Des pistes?

Éric
Avatar
Eric S
C'est possible d'enregistrer une simple DLL qui n'est pas un ocx, un
activeX ou un objet COM+++?

Eric
Avatar
isabelle
Le 2010-02-21 12:37, Eric S a écrit :

Résultat: C:Program Files (x86)



c'est bon,
pour winxp
Résultat: C:Program Files
isabelle
Avatar
Eric S
En fait la question que m'inspire ton message est:
- si le programme d'installation enregistre la DLL, est-ce que Excel/VBA
est capable de la retrouver tout seul?


Le 21/02/2010 19:48, Eric S a écrit :
C'est possible d'enregistrer une simple DLL qui n'est pas un ocx, un
activeX ou un objet COM+++?

Eric


Avatar
Eric S
Certes, mais comment je fais pour intégrer sans l'appel aux fonctions de
la DLL, sachant que la déclaration se fait avant le début du code
exécutable?

J'imagine qu'il y a une méthode pour charger dynamiquement la DLL alors
qu'actuellement, je suis plutôt en statique:

Declare Function LitFichier Lib "c:Program FilesMonLogicielMaLib.dll"
(ByVal Nom_Fichier As String, SizeNom As Long) As Long

Sub Ouvrir()

Dim Resultat As String

Resultat = "donnees.txt"
If LitFichier(Resultat, Len(Resultat)) <> 0 Then
MsgBox "Impossible de charger le fichier donnees.txt"


Eric

Le 21/02/2010 19:49, isabelle a écrit :


Le 2010-02-21 12:37, Eric S a écrit :

Résultat: C:Program Files (x86)



c'est bon,
pour winxp
Résultat: C:Program Files
isabelle


Avatar
michdenis
"Excel 2003 VBA Programmer's Reference"
Paul Kimmel, Stephen Bullen
John Green, Rob Bovey, Robert Rosenberg

Dans leur bouquin, les auteurs réservent un chapitre
complet (chapitre 13) sur le sujet. Je ne vais pas t'en
faire un résumé. Il y a plus d'une façon de faire dont
celle-ci :
à partir de la fenêtre de l'éditeur de code, barre des menus /
référence / tu utilises le bouton parcourir et dans l'arborescence
des fichiers de l'explorateur Windows, tu retrouves la location
de ton fichier Dll et tu l'ajoutes comme référence. Dans l'explorateur
d'objets (F2), tu devrais retrouver toutes les fonctions (sub) définies
dans ta Dll. Tu peux appeler ces fonctions directement dans ton code.

Par automation, ça pourrait donner ceci :
MyAddin : Nom de la DLL
Simple : Nom de la classe
'------------------------------
Sub InstallAutomationAddin()
AddIns.Add Filename:="MyAddin.Simple"
AddIns("MyAddin.Simple").Installed = True
End Sub
'------------------------------
C'est comme si tu ajoutais un fichier de macro complémentaire !
Ce qui précède te permet d'appeler tes fonctions directement
dans la feuille de calcul.

L'idéal serait que tu puisses accéder au bouquin et lire toutes les
explications sur le sujet. Perso. J'ai déjà tenté le coup pour le
plaisir, mais je n'ai pas beaucoup d'expérience à ce niveau.






"Eric S" a écrit dans le message de groupe de discussion :
4b8185aa$0$15434$
En fait la question que m'inspire ton message est:
- si le programme d'installation enregistre la DLL, est-ce que Excel/VBA
est capable de la retrouver tout seul?


Le 21/02/2010 19:48, Eric S a écrit :
C'est possible d'enregistrer une simple DLL qui n'est pas un ocx, un
activeX ou un objet COM+++?

Eric


1 2