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

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


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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

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

ciao...
BruNews, MVP VC++
0
cs_jeralex Messages postés 11 Date d'inscription mercredi 1 décembre 2004 Statut Membre Derniè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)
{
}

Je dois faire comme ca ??
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mars 2005 à 12:49
au plus simple, retourne direct SysAllocStringByteLen().

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jeralex Messages postés 11 Date d'inscription mercredi 1 décembre 2004 Statut Membre Derniè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 ??
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mars 2005 à 14:43
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++
0
cs_jeralex Messages postés 11 Date d'inscription mercredi 1 décembre 2004 Statut Membre Derniè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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mars 2005 à 20:40
C'est fait ici:
http://www.cppfrance.com/code.aspx?ID=30115
si prob, pose questions en comment de source.

ciao...
BruNews, MVP VC++
0
cs_jeralex Messages postés 11 Date d'inscription mercredi 1 décembre 2004 Statut Membre Derniè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);


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.
0
Rejoignez-nous