Pb d'utilisation d'une DLL avec VB (allocation de memoire)

Signaler
Messages postés
11
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
5 juillet 2005
-
Messages postés
11
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
5 juillet 2005
-
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);


retour=(char *)realloc(retour,longueur*sizeof(char*));
fread(retour,sizeof(char),longueur,fic);

fclose(fic);

}

Le bout de code VB de test :

Public Declare Function getTitre Lib "idtagMP3.dll" (ByVal fich As String, ByRef nb As Long) As String

Public Sub main()

Dim fichier As String
fichier = "c:\9.mp3"
Dim res As String
Dim nb As Long

res = getTitre(fichier, nb)

Debug.Print res
Debug.Print nb

End Sub

Voila si quelqu'un pourrait m'aider a me dire pourquoi vb plante ca serait tres bien.

9 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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.

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
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.

ciao...
BruNews, MVP VC++
Messages postés
11
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
5 juillet 2005

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)
{
}

Je dois faire comme ca ??
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
au plus simple, retourne direct SysAllocStringByteLen().

ciao...
BruNews, MVP VC++
Messages postés
11
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
5 juillet 2005

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 ??
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Pas illico je pars chez un client mais comme la question revient souvent j'en ferai ce soir une source détaillée avec les diverses possibilités.

ciao...
BruNews, MVP VC++
Messages postés
11
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
5 juillet 2005

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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
C'est fait ici:
http://www.cppfrance.com/code.aspx?ID=30115
si prob, pose questions en comment de source.

ciao...
BruNews, MVP VC++
Messages postés
11
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
5 juillet 2005

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);


valeur=(char*)realloc(valeur,sizeof(char)*longueur);


fread(valeur,sizeof(char),longueur,fic);


fclose(fic);


return longueur;
}

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.

Merci de me repondre.