28marc28
Messages postés39Date d'inscriptionjeudi 10 avril 2003StatutMembreDernière intervention 4 juin 2014
-
18 juin 2011 à 19:26
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 2013
-
19 juin 2011 à 19:12
Bonsoir,
Je viens de trouver une dll avec un .h et .lib.
Sur le site du fournisseur elle est en libre.
Le problème c'est que je n'arrive pas à trouver un point d'entrée malgrès les infos qui sont dans le .h
Voici mon code:
dans le module:
Public Declare Function Version Lib "C:\temp\isam\RealIsam.dll" () As Long
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 18 juin 2011 à 23:08
Salut
D'après ce que je vois dans le fichier ".h", la fonction Version ne renvoie pas de chaine, mais un numérique, comme toute fonction de DLL que je connaisse d'ailleurs.
D'après ce fichier .h, il semble qu'il faille passer une variable "char *p", donc qqchose qui doit s'apparenter à une String.
Il faudrait savoir aussi ce que représente l'étoile.
MAIS, dans ce genre de langage plus proche de la machine que VB, on fournit en général le pointeur vers la chaine (ou tableau de bytes) et jamais-rarement une chaine elle même.
Quand il s'agit d'une chaine de longueur fixe, c'est assez facile avec VarPtr. Mais quand la chaine est de longueur libre, ça se complique puisque VarPtr donne l'adresse où se trouve la longueur de la chaine (Long VB6), suivie de la chaine elle même. Donc, il faut :
- lire le contenu du pointeur pour connaitre la longueur (4 octets)
- préparer une chaine de réception de même longueur
- recopier la chaine située 4 octets après ce pointeur et il faut jongler avec le RTLMove alias CopyMemory (API).
(3 min plus tard)
Oui, l'étoile dans Char *p précise qu'il s'agit d'un pointeur, donc d'un Long VB6.
Mais bon, même avec un Long, je n'ai pas réussi à récupérer quoi que ce soit et j'ai la même erreur de "point d'entrée" que toi.
D'après ce que je viens de lire dans les précédentes questions du forum à propos des DLL en C (que tu as surement dû lire aussi, j'espère), il vaut mieux placer ta DLL dans le répertoire adéquat : System32 ou, au pire, sur le répertoire de l'application, mais imposer un chaînage de répertoire dans la déclaration, c'est pas recommandé et cela posera forcément des problèmes le jour où tu déplaces ton projet.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 19 juin 2011 à 11:05
Je ne sais pas.
J'ai lu qu'il y avait une méthode de compilation de la DLL qui ne permettait pas d'interfacer avec VB6 - il faudrait qu'elle soit compilée en utilisant __stdcall
Essaye déjà de voir si le fichier .h donne des infos au sens ".Net" ou pas, pour déterminer si les "int" sont des integer de 2 octets (VB6) ou 4 octets (.Net)