begin process at 2010 03 22 01:17:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

lundi 14 mars 2005 à 10:37:27 | Pb d'utilisation d'une DLL avec VB (allocation de memoire)

jeralex

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.

lundi 14 mars 2005 à 11:26:24 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

BruNews

Administrateur CodeS-SourceS
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++
lundi 14 mars 2005 à 11:29:03 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

BruNews

Administrateur CodeS-SourceS
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++
lundi 14 mars 2005 à 12:28:27 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

jeralex

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 ??
lundi 14 mars 2005 à 12:49:33 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

BruNews

Administrateur CodeS-SourceS
au plus simple, retourne direct SysAllocStringByteLen().

ciao...
BruNews, MVP VC++
lundi 14 mars 2005 à 13:23:06 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

jeralex

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 ??
lundi 14 mars 2005 à 14:43:49 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

BruNews

Administrateur CodeS-SourceS
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++
lundi 14 mars 2005 à 14:51:14 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

jeralex

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.
lundi 14 mars 2005 à 20:40:55 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

BruNews

Administrateur CodeS-SourceS
C'est fait ici:
http://www.cppfrance.com/code.aspx?ID=30115
si prob, pose questions en comment de source.

ciao...
BruNews, MVP VC++
jeudi 17 mars 2005 à 17:44:16 | Re : Pb d'utilisation d'une DLL avec VB (allocation de memoire)

jeralex

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.



Cette discussion est classée dans : dll, char, nb, retour, nomfichier


Répondre à ce message

Sujets en rapport avec ce message

C++ DLL retour de paramettre [ par PRZYBYLSKI ] Bonjour,Je suis débutant en C++.J'essaye de trouver le moyen de faire une chose qui devrait être très simple.Avoir une application console qui envoi u Convertir des strings [ par UnExPeCtEdSpy ] Bonjour, Présentation du pb:Je ne suis plus trop familier du c++ mais j'ai du m'y remettre pour utiliser un bout de code en tant que DLL au service d' HELP! DEV-C++ et Dll [ par couriousous ] HEllo!Comment on crée une Dll que l'on peut inclure dans Visual Basic avec dev-c++??? au départ j'ai une fonction char * mafonction(char *) et je veux Pb de variable (enfin je croi) [ par Xilofeon ] Regardé ce code :#define PIDVALIDE "6.0.2800.1106"...<b Fatal signal: Segmentation Fault (SDL Parachute Deployed) [ par broks ] Je ne comprends vraiment pas pourkoa ca ne marche pas...C'est surement un probleme au niveau de la fonction saisi puisque je plante lorsque je dois sa lire dans la base de registre [ par BsEtZeOpLhD ] Salut.J'utilise VC++ et je suis sous Win XP.Voila, j'ai un problème pour lire une valeur de type REG_SZ dans la base de registre.J'utilise ce code :#i ReadFile ou autre (une proposition ajouté la) [ par youpiyoyo ] J'aurai besoin de récup ceci qui se trouve dans un .txtC:\Program Files\BSPlayer\bplay.exeje te met le .txt dans la piece jointesi possible le type de concaténation........... [ par moloko2000 ] Lorsque je concatène une chaine de caractère avec strcat par exemple: strcat(retour_search,temp );retour_search à la valeur suivante:???????????????? Dll et pointeur de fonction [ par dulac02 ] salut à tousJ un gros pb avec des pointeurs de fonctions :Je charge une dll et plus particulièrement une fonction runcelle-ci reçoit commme argument u passage de chaines de caractères en paramètre d'une DLL C vers VB [ par jopop ] Salut tous les coders,soyons brefs, soyons concis.ma fonction :extern "C" void __stdcallMakeLineEx(const char* folder,char* file,char* sout); - folder


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales