Accueil > Forum > > > > Utiliser les fonctions d'une DLL chargée dynamiquement
Utiliser les fonctions d'une DLL chargée dynamiquement
samedi 8 janvier 2005 à 21:00:07 |
Utiliser les fonctions d'une DLL chargée dynamiquement

Drakkhen
|
Si on se sert d'une DLL en la chargeant dynamiquement, donc sans utiliser "Declare Function"... On utilise donc "LoadLibrary" et "GetProcAddress" pour récupérer l'adresse de la fonction dont on a besoin.
Question : comment utiliser la fonction après avoir récupéré son point d'entrée ?
Au cas-où, pour mon cas, j'écris les fonctions dont j'ai besoin ainsi que les types utilisés :
Type RARHeaderData ArcName As String * 260 FileName As String * 260 Flags As Long PackSize As Long UnpSize As Long HostOS As Long FileCRC As Long FILETIME As Long UnpVer As Long Method As Long FileAttr As Long CmtBuf As String CmtBufSize As Long CmtSize As Long CmtState As Long End Type
Type RAROpenArchiveData ArcName As String OpenMode As Long OpenResult As Long CmtBuf As String CmtBufSize As Long CmtSize As Long CmtState As Long End Type
Declare Function RAROpenArchive Lib "unrar.dll" (ByRef ArchiveData As RAROpenArchiveData) As Long
Declare Function RARCloseArchive Lib "unrar.dll" (ByVal hArcData As Long) As Long
Declare Function RARReadHeader Lib "unrar.dll" (ByVal hArcData As Long, ByRef HeaderData As RARHeaderData) As Long
Declare Function RARProcessFile Lib "unrar.dll" (ByVal hArcData As Long, ByVal Operation As Long, ByVal DestPath As String, ByVal DestName As String) As Long
|
|
dimanche 9 janvier 2005 à 21:31:16 |
Re : Utiliser les fonctions d'une DLL chargée dynamiquement

ShareVB
|
salut, les declare, c'est déjà du chargement dynamique...en outre, en vb, pas de pointeurs de fonctions donc pas de GetProcAddress...si tu regardes avec Depends.exe, tu ne trouveras pas les fonctions que tu as déclarées. (Si tu veux avoir la liste des declares d'un exe : http://www.vbfrance.com/code.aspx?id=28572) ShareVB
|
|
lundi 10 janvier 2005 à 00:08:12 |
Re : Utiliser les fonctions d'une DLL chargée dynamiquement

Drakkhen
|
Hmm, il y a 2-3 sources sur le sujet. Le but c'est de trouver le Handle de la dll, de la fonction et d'utiliser les API de Windows pour pouvoir s'en servir. Mais les sources postées sont uniquement basées sur l'API CallWindowProc... Y'a certes pas de pointeur en VB, mais le but est justement de contourner le problème en se servant des API de Windows. A croire que pour y arriver, il y a de sacrées magouilles à faire. Bref, je vais essayer de chercher un peu, en espérant que qqun s'est déjà amusé sur le sujet.
En tout cas, je te remercie de m'avoir répondu. :-)
|
|
lundi 10 janvier 2005 à 00:11:44 |
Re : Utiliser les fonctions d'une DLL chargée dynamiquement

Drakkhen
|
Euh, je voulais dire de charger la dll, pas trouver le handle.
|
|
jeudi 13 janvier 2005 à 21:40:36 |
Re : Utiliser les fonctions d'une DLL chargée dynamiquement

ShareVB
|
Réponse acceptée !
salut,
déjà le handle d'une dll (HMODULE) c'est l'adresse de base dela dll en mémoire (l'adresse à laquelle elle est chargée)...
Ensuite CallWindowProc est le seul moyen facile d'utiliser un point d'entrée (pointeur de fonction). Cela limite les fonctions appelées par le nombre de paramètre de la fonction aux 4 paramètres des procédures de fenêtre...
Sinon, pour faire plus compliqué, tu prends IDL (et MIDL.exe ou mktyplib.exe) pour faire une bibliothèque de type avec une interface comprennant le prototype des fonctions que tu veux utiliser avec pour premier paramètre un par valeur de l'adresse de la fonction.
Ensuite, il faut que tu importes cette typelib dans VB, tu declares une variable de type Long pVTable:
Dans un tableau fctptr, tu dois mettre - un pointeur vers une fonction QueryInterface perso (This As FunctionDelegator, riid As Long, pvObject As Long) As Long, elle renvoie 0 (et met Varptr(This) dans pvObject) au premier appel et E_NOINTERFACE (et met 0 dans pvObject) ensuite. - un pointeur vers une fonction AddRef perso (ByVal This As Long) As Long qui ne fait rien (mettre un ' dans le corps pour éviter la suppression - un pointeur vers une fonction Release perso (ByVal This As Long) As Long qui ne fait rien (mettre un ' dans le corps pour éviter la suppression - autant de pointeur vers une variable contenant le code asm (en binaire) que de fonctions API dans l'interface : pop ecx ; l'adresse de retour pop eax ; le pointeur this (pas besoin pour les appels d'apis) pop eax ; le pointeur de fonction (premier paramètre (par valeur)) jmp eax ; saut au début de l'api
Ensuite, tu dois mettre l'adresse du tableau de pointeurs de fonctions dans ta var : pVTable = vartr(fctptr(0))
Ensuite, tu copies pVTable dans ta_var du type de ton interface : CopyMemory ta_var,Byval VarPtr(pVTable),4&
c'est quand même assez compliqué, pour moi, je trouve ca utile si tu ne peutx pas faire avec declare (pointeurs de fonction non exportés, cdecl, ...) si ca t'intéresse vraiment je te conseille "Advanced Visual Basic 6" de M. Curland... cet technique fait partie du livre...
ShareVB
|
|
vendredi 14 janvier 2005 à 11:17:48 |
Re : Utiliser les fonctions d'une DLL chargée dynamiquement

Drakkhen
|
Hello,
Ne t'inquiète pas, je sais ce qu'est un handle, on va dire que j'ai passé le stade de débutant... :oP Merci de ta réponse, je vois que j'ai affaire à un maître. J'avais pas vu que c'était ce cher ShareVB dont tout le monde parle (fais gaffe, je vais bientôt te demander de l'argent...).
Concernant CallWindowProc, comme tu dis c'est limité. De plus, l'API ne "s'adresse" qu'aux fenêtres si je me trompe pas.
Bref, concernant la deuxième méthode, je comprends plus ou moins le fonctionnement, Mais quand tu me parles d'IDL, je suis largué... J'ai un peu cherché, mais quitte à trier des centaines de pages, je préfère te demander si tu ne connais pas un site qui explique un peu ça stp. Ensuite tu dis : "- autant de pointeur vers une variable contenant le code asm (en binaire) que de fonctions API dans l'interface" Donc en fin de compte, j'ai peut-être rien capté... Tu récupère quoi exactement, le code asm ? Là oui, je suis un débutant fini, désolé.
|
|
dimanche 16 janvier 2005 à 22:55:09 |
Re : Utiliser les fonctions d'une DLL chargée dynamiquement

ShareVB
|
salut, Je crois CallWindowProc peut être détourner de son utilisation première pour appeler des fonctions qui ne sont pas forcément de fenêtre. Ensuite, IDL est le langage de définition d'interface abondement utlisé pour créer les fichiers tlb (ce que l'on voit dans l'explorateur d'objet, c'est le contenu des tlbs de VB). Cela sert à définir toutes les interfaces COM genre IMachinTruc (par ex IPictureDisp)... Il existe deux outils pour créer des tlb à partie de fichiers IDL ou ODL (plus ancien) : mktyplib.exe (très facile d'utilisation : utilise ODL...ce qui est très adapté à VB : tlb simple) et MIDL.exe (très complexe et pas facile à compilé un IDL avec...) un IDL, c'est du genre : [ uuid(2F6CA420-C641-101A-B826-00DD01103DE1), // à générer avec GUIDGEN.EXE helpstring("Ta tlb1.0"), version(1.0) ] library TaTLB { #ifdef WIN32 importlib("stdole32.tlb"); #else importlib("stdole.tlb"); #endif typedef tagRAROpenArchiveData { long ArcName; long OpenMode; long OpenResult; long CmtBuf; long CmtBufSize; long CmtSize; long CmtState; } RAROpenArchiveData;
[ uuid(2F6CA422-C641-101A-B826-00DD01103DE1), // pareil helpstring("Ton Interface") ] interface IRar : IUnknown { long RAROpenArchive(long lpFctPtr, RAROpenArchiveData* lpArchiveData); //ainsi de suite } } bon, j'ai pas testé... masi ca devrait être à peut près ca...sinon, il y a la doc de MIDL : [ Lien ]enfin, tu met dans une variable (ou un tableau) le code binaire exécutable correspondant aux instructions ASM que je t'ai donné (par POP ECX = 59h, POP EAX = 58h)...je crois que ca doit tenir dans un double ou currency XXXXXXXXXX585859h et si tu as trop de XX tu met 90h = NOP (no operating code) (on sait jamais)... ShareVB
|
|
lundi 17 janvier 2005 à 07:51:47 |
Re : Utiliser les fonctions d'une DLL chargée dynamiquement

ShareVB
|
salut,
oupss, j'ai oublié une instruction ASM :
pop ecx ; l'adresse de retour pop eax ; le pointeur this (pas besoin pour les appels d'apis) pop eax ; le pointeur de fonction (premier paramètre (par valeur)) push ecx ;ne pas oublier de remettre l'adresse de retour jmp eax ; saut au début de l'api
ShareVB
|
|
Cette discussion est classée dans : long, function, string, dll, utiliser
Répondre à ce message
Sujets en rapport avec ce message
Appel DLL dans un module ne marche pas [ par andrebernard ]
Bonjour à tousVoila, suite a plusieurs POSTS dans ce Forum, j'ai essayé de faire appel a ma DLL non-activeX qui a été crée par un autre language que V
Dll avec le meme nom de function interne [ par andrebernard ]
Bonjour à tousVoila, j'utilise des DLL standard non-ActiveX créée avec un autre laguage.J'arrive bien a les faire marcher mais le probleme c'est qu'a
Mémoire ne peut pas etre READ (A l'aide !!) [ par andrebernard ]
Bonjour à tousJ'ai déja créé un POST sur ce forum, j'ai eu quelques gentilles aides, mais personne n'a été en mesure de trouver la solution à mon prob
NtOpenKey [ par draluorg ]
Salut a tous, Je ne parviens pas a utiliser l'api NtOpenKey, j'ai essaye dans tous les sens et rien :( J'ai soit l'erreur Memoire Insufisante soit
[vb2005] Utilisation Api !! [ par lex1111 ]
Bonjour, j'essaye d'utiliser les api suivantes dans mon prog en VB2005 pour recuperer le code source html d'une page web : Private Declare Functio
Problème de code retour avec Wininet [ par angelot ]
Bonjour,J'utilise Wininet pour effectuer des commandes FTP. Tout se passe bien jusqu'à la commande FTP FtpCreateDirectory qui me renvoie le code répon
Utiliser une dll C sous VB6 (pb de conversion de type) [ par sophie75 ]
Bonjour, Je souhaite utiliser une dll qui a été écrite en C, dans un programme VB. Grâce à la fonction Lib, j'arrive à appeler certaines méthodes de c
Passer de VB à VBScript [ par flyingfish ]
Bonjour,J'ai le code ci-dessous qui fonctionne très bien avec VB (fonction sans interface, pour la lancer sur un serveur), mais je n'arrive pas à exéc
Passage d'un tableau de string d'une DLL standard à VB [ par andrebernard ]
Bonjour a tous Je cherche à recuperer un tableau de string créé dans une DLL standard dans VB J'ai essayé avec ce code, que j'utilise habituelleme
Selection d'un repertoir [ par calitoli ]
Bonjour à tous,J'ai utilisé le code ci-dessous pour selectionner un repertoir. Et comme erreur obtenu lorsque je lance mon application: "Can't find pr
Livres en rapport
|
Derniers Blogs
[TECHDAYS 2010] #04 - WORKSHOP : UPGRADE DE MOSS 2007 VERS SHAREPOINT 2010[TECHDAYS 2010] #04 - WORKSHOP : UPGRADE DE MOSS 2007 VERS SHAREPOINT 2010 par pierre
Alain Bastardie (Consultant SQLi) présente le workshop d'upgrade de MOSS 2007 vers SharePoint 2010. Philisophie de la migration Faire un état des lieux avant de démarrer Utiliser des outils sur MOSS 2007 Résoudre les problèmes potent...
Cliquez pour lire la suite de l'article par pierre TECHDAYS PARIS 2010 : LA GOUVERNANCE DANS SHAREPOINT ONLINETECHDAYS PARIS 2010 : LA GOUVERNANCE DANS SHAREPOINT ONLINE par ROMELARD Fabrice
Animé par: Emmanuel Bergerat et Damien Caro La session a démarré par un premier retour sur la situation de la la solution BPOS (Business Productivity OnLine Suite) et les possibilités commerciales associées ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : ADMINISTRATION SHAREPOINT 2010TECHDAYS PARIS 2010 : ADMINISTRATION SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Patrick Guimonet et Benoit Hamet Cette session traitera des différents points exigés durant les taches d'administration : Planification (architecture, hébergement, authentification, .) Opération e...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [TECHDAYS 2010] #03 - WEB CONTENT MANAGEMENT SOUS SHAREPOINT 2010[TECHDAYS 2010] #03 - WEB CONTENT MANAGEMENT SOUS SHAREPOINT 2010 par pierre
Stephane Cordonnier de MCNext nous présente les fonctionnalités Web Content Management (WCM) sous SharePoint 2010. Qu'est-ce que le WCM ECM, GED, RM, WCM c'est quoi Plateforme SharePoint Versions SharePoint 2010 SharePoint Fondation...
Cliquez pour lire la suite de l'article par pierre [DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE[DESIGN PATTERNS] PARTIE 2: DIP: DEPENDENCY INVERSION PRINCIPLE par tja
C'est le dernier principe des principes du Design Orienté Objet (The Principles of Object Oriented Design) fondés par Robert C. Martin plus connu sous le pseudonyme d'Uncle Bob.
l'image empruntée de LosTechies.
Je ne traite pas les principes dans...
Cliquez pour lire la suite de l'article par tja
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|