Déclaration d'API

Signaler
Messages postés
58
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
22 juillet 2010
-
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
-
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

Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
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
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
58
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
22 juillet 2010

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

ce lien donne un exemple pour cpp et je ne vois pas comment l'adapter pour vb6
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
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 #
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
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
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
58
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
22 juillet 2010

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.
Messages postés
58
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
22 juillet 2010

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.
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
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
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
si, si, il y est dejà ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
58
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
22 juillet 2010

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.
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
En meme temps, je pense pas que tu ais le choix ...
Tu dois (et tu peux) utiliser cette solution

D@runia
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
il n'y a pas qu'un moyen d'executer une fonction dont on a l'addresse ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
(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...)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
41
"


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 #
Messages postés
58
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
22 juillet 2010

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.
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
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
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
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