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
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|