Déclaration d'API

Jomba Messages postés 58 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 22 juillet 2010 - 22 août 2006 à 11:46
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 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.

20 réponses

cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
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.

D@runia
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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...

Julien.
0
Jomba Messages postés 58 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 22 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
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
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
0

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

Posez votre question
Jomba Messages postés 58 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 22 juillet 2010
22 août 2006 à 12:46
ce lien donne un exemple pour cpp et je ne vois pas comment l'adapter pour vb6
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
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.

D@runia
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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...

Julien.
0
Jomba Messages postés 58 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 22 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.
0
Jomba Messages postés 58 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 22 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.
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
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.

D@runia
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 août 2006 à 15:05
si, si, il y est dejà ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Jomba Messages postés 58 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 22 juillet 2010
22 août 2006 à 16:47
avec cette solution, j'arrive à executer un API sans paramètre mais pas avec. Donc on va s'y prendre autrement. Merci à tous pour votre aide.
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
22 août 2006 à 18:28
En meme temps, je pense pas que tu ais le choix ...
Tu dois (et tu peux) utiliser cette solution

D@runia
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 août 2006 à 18:31
il n'y a pas qu'un moyen d'executer une fonction dont on a l'addresse ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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...)
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
Jomba Messages postés 58 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 22 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.
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
23 août 2006 à 10:49
il n'y a pas qu'un moyen d'executer une fonction dont on a l'addresse ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic

Dans ce cas, merci de nous les communiquer !

D@runia
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 août 2006 à 11:16
plusieurs facon d'aborder la chose...

- placer ce qu'il faut sur la pile...
- substituer deux fonctions en patchant le code en mémoire...

un bouquin qui pourrait te plaire :
http://www.awprofessional.com/bookstore/product.asp?isbn=0201707128&rl=1

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous