Jomba
Messages postés58Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention22 juillet 2010
-
22 août 2006 à 11:46
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
23 août 2006 à 11:16
Bonjour, voilà mon problème :
Je cherche à déclarer une API d'une dll à partir d'un autre dossier que celui de l'application
Le problème est que le chemin d'accès est différent d'une machine à l'autre (il est stocké dans une variable) et qu'on ne peut pas passer une variable dans la déclaration d'une API (Private Declare Function ZLibVer Lib chemin & "zlib.dll" Alias "zlibVersion" () As Long). J'ai trouvé qu'on pouvait utiliser SetCurrentDirectory mais cette solution ne me convient pas.
Merci par avance de l'aide que vous me fournirez.
cs_darunia
Messages postés354Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention24 mars 20112 22 août 2006 à 11:54
Salut,
Ta DLL doit etre dans un dossier du PATH, sinon ton exe ne demarrera pas du tout !
Si tu installes zlib dans le dossier system32 de windows je vois pas ou est le probleme.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 22 août 2006 à 11:55
C'est sans doute pas la meilleure solution, mais à ta place je ferais un "pré-programme" (un programme d'installation en somme, ils servent notamment à ca si je ne me trompe...) qui copierait et enregistrerait ta dll dans system32 et ainsi tu aurait un chemin constant pour ton programme...
Jomba
Messages postés58Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention22 juillet 2010 22 août 2006 à 12:15
Je vous remercie mais je ne peux pas mettre la dll dans system32 et je ne peux pas faire de préprogramme (car le chemin est défini à un moment avancé de mon application).
...
progamme
...
définition du chemin.
appel du constructeur de ma classe dans laquelle les API sont déclarées.
...
... et j'aimerais déclarer ces API en utilisant le chemin mais celà me provoque une erreur car les API sont chargées au lancement de l'application
cs_darunia
Messages postés354Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention24 mars 20112 22 août 2006 à 12:22
Dans ce cas la (meme si il parait farfelu), je ne vois qu'une chose : un chargement dynamique de la librairie. Il existe peut etre un moyen de faire ça en VB6, mais tu peux toujours passer par l'API http://www.cppfrance.com/codes/CHARGEMENT-DYNAMIQUE-DLL_10539.aspx
D@runia
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 22 août 2006 à 13:02
Un exemple en VB :
' Create a new project and add this code to Form1
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Sub Form_Load()
On Error Resume Next
'KPD-Team 1999
'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net
'We're going to call an API-function, without declaring it!
Dim lb As Long, pa As Long
'map 'user32' into the address space of the calling process.
lb = LoadLibrary("user32")
'retrieve the address of 'SetWindowTextA'
pa = GetProcAddress(lb, "SetWindowTextA")
'Call the SetWindowTextA-function
CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0&
'unmap the library's address
FreeLibrary lb
End Sub
---- Sevyc64 (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
cs_darunia
Messages postés354Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention24 mars 20112 22 août 2006 à 14:06
Casy vient de te donner la réponse. Mais sache que ce n'est pas parce qu'un code est en C qu'il n'est pas possible de l'adapter en VB !
L'API peut etre utilisée par n'importe quel langage, du moment qu'il est capable de faire appel a des fonctions exportées de DLL.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 22 août 2006 à 14:09
Salut,
J'ai plus VB6 sur mon pc, mais si mes souvenirs sont bons, la validité de l'import n'est vérifiée qu'à l'appel de la fonction non ? (en tout cas je viens de vérifier avec vb2005, c bien ca)
Donc il te suffit de déclarer ta fonction dans un répertoire connu, et lorsque tu as ta dll dans ton prog, tu la copie dans ce répetoire avant de l'invoquer...
Jomba
Messages postés58Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention22 juillet 2010 22 août 2006 à 14:34
je te remercie casy,
Grâce à ton exemple, j'ai réussi à faire fonctionner un API sans paramètres.
Je n'ai plus quà trouver à quoi correspondent les paramètres de CallWindowProc et comment passer les paramêtres des API que je veux passer.
Si tu le sais, je veux bien que tu me le dise plutot que de chercher inutilement.
Jomba
Messages postés58Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention22 juillet 2010 22 août 2006 à 14:45
excuse moi darunia, je sais qu'il est possible d'adapter du c en vb mais n'ayant fais que peu de c, j'ai un peu de mal avec la synthaxe sur un exemple pareil, mais merci tout de même pour ton aide.
cs_darunia
Messages postés354Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention24 mars 20112 22 août 2006 à 14:53
Je me demande meme si Casy devrait peut etre faire une source avec son bout de code, car je ne crois pas que ce type de code soit présent sur VBFrance.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 22 août 2006 à 18:34
(Ca marche pas ce que j'avais proposé (zut j'ai envie de savoir, je vais réinstaller mon vb6 rien que pour ca :p) ? Enfin j'imagine que non mais bon... ce serait plus simple lol...)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 22 août 2006 à 18:56
"
Je me demande meme si Casy
devrait peut etre faire une source avec son bout de code, car je ne
crois pas que ce type de code soit présent sur VBFrance.
D@runia"
Je n'ai rien inventé, ce code est tout simplement l'exemple de l'api LoadLibrary fourni dans l'API Guide.
J'avoue que je ne sais pas comment ça marche, je n'ai jamais rencontré ce problème.
Toutes les dll que j'ai utilisé étaient soit des dlls système (donc dans system32) , des dlls tierces fournies par les fabricants de matériel ou autre (donc généralement dans system32 aussi), ou alors des dlls perso (dans le répertoire de l'exe, ou au moins dans un chemin fixe et connu).
Je n'ai jamais rencontré le problème de Jomba.
Jomba, au pire, si tu n'y arrive pas, tu as toujours la possibilité de surcharger les apis que tu utilise dans une dll perso.
Tu crée ta dll en C que tu place systèmatiquement avec ton exe. Ta dll a pour fonction de charger la véritable dll api, et d'en appeler les fonctions avec le code source que tu as déjà trouver et d'en retourner le résultat éventuel à ton appli.
Ca résoud pas le problème, ça ne fait que le contourner, mais si ça peut te donner une solution ...
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Jomba
Messages postés58Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention22 juillet 2010 23 août 2006 à 10:01
Je vous remercie mais mon chef m'a autorisé à passer par un répertoire fixe pour la dll. donc, je n'ai plus de problème. Mais je garde sous le coude toutes les infos que vous m'avez donné, je suis sûr que ça me sera uile un jour...
merci encore.