Utilisation de DLL

cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007 - 21 août 2006 à 17:35
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007 - 22 août 2006 à 11:43
Bonjour,

J'utilise une DLL dans un programme en VB6. Celle ci se situe sous la racine de ce programme. Ce programme fonctionne bien. Nota: si je déplace la dll dans system32, il ne fonctionne plus.
Lorsque je copie le code, dans un autre programme et que je déplace la DLL, le programme ne trouve pas cette DLL.
Question: Cette DLL n'est pas enregistrée avec regedit  (pas possible: message d'erreur indiquant que le fichier n'est pas un script de registre)
Elle n'est pas non plus référencé dans les 2 programmes avec Projet\Reférence.
Elle est où l'astuce ?

Merci d'avance.

12 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 août 2006 à 17:45
L'instruction Declare de tes fonctions peut-être ?

Si tu ne spécifie pas de chemin pour le nom de la dll, la recherche s'effectue dans un ordre bien particulier. Dès qu'un fichier portant le nom de la dll est trouvé, la recherche s'arrete et ce fichier est utilisé (bon ou pas).

L'ordre de recherche est le suivant :
<ol><li>Dossier contenant le fichier.exe

</li><li>Dossier courant

</li><li>Dossier système de Windows (souvent mais pas nécessairement
\Windows\System)

</li><li>Dossier de Windows (pas nécessairement \Windows)

</li><li>Variable d'environnement Path </li></ol>Donc si ta dll est trouvé au point 1 ou 2, celle dans system32 n'est pas utilisée.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
21 août 2006 à 18:53
Merci pour les infos, mais cela n'a pas l'air aussi simple. Le programme copié se trouve sur disque dur externe.

Sur un PC je copie la DLL dans system32 ou  dans le même répertoire que l'exe il ne trouve pas la DLL.

Ce même disque dur externe sur un autre PC, la DLL est dans system32 il
fonctionne. Je déplace cette DLL dans le même répertoire que l'exe il
ne fonctionne plus :(

Je ne comprends plus, il y a des données qui sont sauvegardés ...?


Dans le code de déclaration comment fait on pour forcé un chemin relatif par exemple.

j'ai ce code là actuellement:

Public Declare Sub MediaInfo_Close Lib "MediaInfo.dll" (ByVal Handle As Long)
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 août 2006 à 19:07
Avec ce code là, ta dll va etre cherchée selon l'ordre que j'ai donné tout à l'heure. Attention à bien supprimer la DLL sous le répertoire de l'exe lorsque tu la met dans system32, sinon c'est toujours celle de l'exe qu'ilm va cherché.

pour lui indiqué un chemin absolu il faut mettre ... Lib "X:\chemin\souschemin\...\MediaInfo.dll"

Pour le répertoire système c'est normalement (ça dépend des systèmes) "C:\windows\system32\MediaInfo.dll"

Je sais pas si la variable d'environement marche avec Declare, si oui ça donnerais "%SYSTEM%\MediaInfo.dll"

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
21 août 2006 à 19:26
Désolé,

Public Declare Sub MediaInfo_Close Lib "I:\MediaInfo.dll" (ByVal Handle
As Long) :Erreur 48,  Fichier introuvable alors quelle se trouve
là.  J'ai fait particulièrement attention au Majuscule comme il
est préconisé dans le fichier d'aide.


Commet ce fait-il qu'avec le même code:

Public Declare Sub MediaInfo_Close Lib "MediaInfo.dll" (ByVal Handle As Long).

Les 2 programmes qui se trouvent sur le même disque dur externe, et
donc tourne sur le même PC qui n'a pas cette DLL ailleur. Le premier
marche si la DLL est sur le répertoire du programme VB et l'autre non??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 août 2006 à 19:35
Essaye (mais ca m'étonnerai que ca marche !!!) un RegSvr de ta dll sur le poste où ca ne marche pas :
Dans la commande éxécuter de windows :
RegSvr32 lechemindetadll
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
21 août 2006 à 19:39
J'avais oublier de préciser aussi.
Il m'est arrivé que VB merdouille avec les chemins des DLL en mode déboguage.
Alors que les dlls étaient au bon endroit, au bout d'un certain temps il ne les trouvaient plus.
Alors que l'executable, lui fonctionnait sans problème.
Je n'ai jamais compris ce qui s'était passé.
Je pense qu'une merdouille s'était passée, et que le fichier projet s'était corrompu. Je n'ai pas eu le temps de chercher plus car j'ai livré l'appli très rapidement.

Si c'est ça ton problème, je n'ai pas la solution.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 août 2006 à 21:12
Mettre DLL dans dossier de exe.
Mettre un appel SetCurrentDirectory() sur App.Path en toute 1ere instruction dans main().
Devrait aller.

ciao...
BruNews, MVP VC++
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 août 2006 à 21:13
En effet, en mode debug, de temps en temps vb a un peu de mal avec les répertoires, c'est vrai !
0
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
21 août 2006 à 22:25
Je suis désolé d'être un boulet, peux tu préciser un peu plus la
syntaxe de: "Mettre un appel SetCurrentDirectory() sur App.Path en
toute 1ere instruction dans main()."


Dans le form_load()

je mets un code ??
0
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
22 août 2006 à 09:34
J'ai écrit ça:
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" ( ByVal lpPathName As String) As Long

Public Sub Form_Load()
Dim Retour As Long
    Retour = SetCurrentDirectory(App.Path)
End Sub

Mon problème est tjs là
0
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
22 août 2006 à 10:29
Je viens de trouver par hazard mon problème.
J'avais 2 DLL différentes entre les 2 programmes. Le même nom mais celle qui ne fonctionnait pas avait 16Ko de plus. Alors que je l'avais simplement copié... Sans doute un fichier vérollé.
Argh j'ai quand même passé 4H sur ce Put.. de truc.

Merci encore pour votre écoute et votre aide.
0
cs_M51 Messages postés 63 Date d'inscription dimanche 20 novembre 2005 Statut Membre Dernière intervention 10 août 2007
22 août 2006 à 11:43
Euh, finalement je suis intéressé par le code pour initialiser le répertoire courant, car maintenant le mode debug de temps en temps ne trouve plus la DLL, et du coup je suis obligé de fermer le programme pour le réouvrir et là tout marche.

Merci d'avance.
0
Rejoignez-nous