Pb d'utilisation d'une DLL avec VB (allocation de memoire)
cs_jeralex
Messages postés11Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention 5 juillet 2005
-
14 mars 2005 à 10:37
cs_jeralex
Messages postés11Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention 5 juillet 2005
-
17 mars 2005 à 17:44
Bonjour à tous,
Voila mon problème : je suis chargé d'ecrire une DLL en c permettant de recuperer les tag dans un fichier mp3. Quand j'appelle les fonctions dans Vb, vb plante mechant et le debug m'indique que le probleme vient de ma DLL. Voici une partie du code :
DLL :
La fonction general :
/* retourne le titre du fichier mp3 */
extern "C" char* WINAPI getTitre(char* nomfichier, int *nb)
{
char* retour;
retour =(char*)malloc(sizeof(char*));
retour = '\0';
*nb=1;
/* test de la version du tag*/
double vers = versionID3(nomfichier,0); if (vers 1.1 || vers 1) {
getTitreV1(nomfichier,retour);
}else {
retour = getTitreV2(nomfichier,nb);
}
return retour;
}
Les fonctions appelées :
/* retourne le titre du fichier mp3 pour la norme V1 */
void getTitreV1 (char* nomfichier, char* retour, int *nb)
{
lectureTag(3,30,retour,nomfichier,nb);
}
Et celle qui plante :
Cette fonction permet de positionner a la bonne place a lafin du fichier puis de lire x octets
void lectureTag (int debut, int longueur, char* retour, char* nomfichier,int *nb) {
FILE *fic;
char *tag;
fic=fopen(nomfichier,"r");
if (fic == NULL) {
exit(1);
}
int pos;
pos=128-debut;
fseek(fic,-pos,SEEK_END);
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 mars 2005 à 11:26
On ne retourne jamais un pointeur char* à VB qui ne connait pas la notion de pointeur et est incapable d'accéder à la mémoire, tu dois lui générer un BSTR.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 mars 2005 à 11:29
ah oui autre chose valable pou le C aussi, ne jamais retourner à un processus externe le résultat d'un malloc, ce pointeur n'est valable QUE dans TON processus, l'adresse mémoire est invalide dans le processus recevant, me semble tout de même une évidence.
cs_jeralex
Messages postés11Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention 5 juillet 2005 14 mars 2005 à 12:28
ok je ne savais pas cela. Je suis d'accord pour le passage d'une chaine de caractere de VB vers la dll mais pour l'inverse je dois utilisé quelle type de variable.
extern "C" BSTR WINAPI getTitre(char* nomfichier, int *nb)
{
}
cs_jeralex
Messages postés11Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention 5 juillet 2005 14 mars 2005 à 13:23
C'est possible que tu me fasse un ptt exemple où une fonction renvoie une chaine de caractere que tu alloue dynamiquement car la je suis un peu perdu. Stp ??
cs_jeralex
Messages postés11Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention 5 juillet 2005 14 mars 2005 à 14:51
Je te remercie car la je suis coincé et mes connaissances quasi inexistante dans ce domaine ainsi que dans Vb dc je comprend pas les diverses exemple que j'ai trouvé sur le net. Je pense aussi que mon probleme pourrai venir de la declaration de ma DLL.
cs_jeralex
Messages postés11Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention 5 juillet 2005 17 mars 2005 à 17:44
C'est encore moi, j'ai encore un ptt soucis avec un realloc voila mon code :
ca c'est ma fonction generale
BSTR __stdcall getTitre(BSTR *nomfichier)
{
char *valeur;
valeur=(char*)malloc(sizeof(char*)*60); // obliger de faire ca car le realloc ne marche pas
int taille;
double vers = versionID3(nomfichier,0); if (vers 1.1 || vers 1) {
taille = getTitreV1((char*)nomfichier,valeur);// fonction qui appelle la fonction contenant le realloc
}
*nb = taille;
return SysAllocStringByteLen(valeur,taille);
}
/* retourne le titre du fichier mp3 pour la norme V1 */
int getTitreV1 (char* nomfichier, char* retour) {
return lectureTag(3,30,retour,nomfichier);
}
fonction contenant le realloc :
/*Lecture d'un morceau de fichier*/
int lectureTag (int debut, int longueur, char *valeur, char* nomfichier) {
FILE *fic;
fic=fopen(nomfichier,"r");
if (fic == NULL) {
exit(1);
}
int pos;
pos=128-debut;
fseek(fic,-pos,SEEK_END);
Dc mon probléme est que si j'initialise la chaine que je renvoie à un caractere dans la fonction getTitre et que je fais ensuite un realloc sur cette chaine, coté vb ca marche plus.
Bout de code vb :
Option Explicit
Declare Function versionID3 Lib "d:\Essai.dll" (ByVal s1 As String, nb As Integer) As Double
Declare Function getTitre Lib "d:\Essai.dll" (ByVal s1 As String) As String
Declare Function getArtiste Lib "d:\Essai.dll" (ByVal s1 As String) As String
Declare Function getAlbum Lib "d:\Essai.dll" (ByVal s1 As String) As String
Declare Function getAnnee Lib "d:\Essai.dll" (ByVal s1 As String, ByRef nb As Integer) As String
Declare Function getCommentaire Lib "d:\Essai.dll" (ByVal s1 As String, ByRef nb As Integer) As String
Declare Function getGenre Lib "d:\Essai.dll" (ByVal s1 As String, ByRef nb As Integer) As String
Sub Main()
Dim s As String
Dim nb As Integer
Dim tag As Double
s1 = "c:\9.mp3"
s = getTitre(s1, nb)
tag = versionID3(s1, 0)
Debug.Print s
Debug.Print tag
End Sub
voila le resultat : ! windir=C:\WIND
Alors j'aimerai savoir pk mon realloc ne marche pas car il me semble bien l'utiliser.