Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Futur Membre du Club
    Inscrit en
    août 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 74
    Points : 15
    Points
    15

    Par défaut Problème de (delete) pointeur

    Bonjour,

    La fonction suivante me pose problème.
    Comme vous pouvez le voir, j'ai plusieurs pointeur (wchar_t* et new wchar_t), mais, je n'arrive pas à les détruire.... le delete ne va pas.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    	private: System::Void bt_sbHelloParam_Click(System::Object^  sender, System::EventArgs^  e) {
     
    				typedef  wchar_t* (__stdcall *fct_sbHelloParam)(wchar_t* Input, wchar_t* Output);
    				fct_sbHelloParam fsbHelloParam;
     
    				fsbHelloParam = (fct_sbHelloParam)GetProcAddress(hInstLibrary, "_sbHelloParam");
    				if (fsbHelloParam){
    					IntPtr p =  System::Runtime::InteropServices::Marshal::StringToHGlobalUni(tbParam->Text->ToString());
    					wchar_t* Input = static_cast<wchar_t*>(static_cast<void *>(p));
    					wchar_t* Output = new wchar_t;
    					fsbHelloParam(Input, Output);		
    					this->tbLog->Text += "res="+gcnew String(Output)+ "\r\n";
    					delete Output;
    				}else{
    					this->tbLog->Text += "GetProcAddress for _sbHelloParam failed !" + "\r\n";
    				}
     
    		 }
    pouvez-vous m'aider ?

  2. #2
    Expert Confirmé
    Avatar de TheGzD
    Homme Profil pro Geoffrey Garcia
    Ingénieur R&D / Doctorant
    Inscrit en
    avril 2007
    Messages
    1 321
    Détails du profil
    Informations personnelles :
    Nom : Homme Geoffrey Garcia
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur R&D / Doctorant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 1 321
    Points : 2 517
    Points
    2 517

    Par défaut

    Quelle erreur rencontres-tu ? A quel endroit du code ? ...

    D'autre part j'ai quelques remarques :
    - Input : tu n'as pas le droit d'appeler son destructeur ! Tu devrais passer par celui de p.
    - Output : tu n'as instancié qu'un seul caractère ... est-ce normal ?
    Vous postez du code ? Merci d'utiliser les balises [CODE] ... [/CODE]
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Doctorant à l'EDSPI de Clermont-Ferrand, depuis 2011.

  3. #3
    Expert Confirmé

    Homme Profil pro david
    Responsable développement
    Inscrit en
    décembre 2003
    Messages
    1 652
    Détails du profil
    Informations personnelles :
    Nom : Homme david
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 652
    Points : 2 849
    Points
    2 849

    Par défaut

    Bonjour.

    Comme le dis TheGzD, tu n'instancies qu'un seul charactère pour Output. A mon avis tu dois fournir un buffer suffisamment grand car "_sbHelloParam" doit écrire plusieurs charactères. Si c'est le cas, comme il écrit sur les octets directement après l'octet alloué, alors delete ne peut plus fonctionner.

    Code :
    1
    2
    3
    4
     
    wchar_t* Output = new wchar_t[XXX];
    ...
    delete[] Output;
    Il faut voir la documentation de "_sbHelloParam", pour connaître la valeur XXX.

    Il faut aussi libérer p avec :
    Code :
    1
    2
     
    System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
    Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
    http://sourceforge.net/projects/mfnode/

    http://jeux.developpez.com/faq/directx/?page=dshow

  4. #4
    Futur Membre du Club
    Inscrit en
    août 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 74
    Points : 15
    Points
    15

    Par défaut

    Citation Envoyé par moldavi Voir le message
    Bonjour.

    ... Si c'est le cas, comme il écrit sur les octets directement après l'octet alloué, alors delete ne peut plus fonctionner. ...

    ... Il faut voir la documentation de "_sbHelloParam", pour connaître la valeur XXX.
    C'est le cas.
    Je ne connais pas la valeur de XXX.
    Dans le cas du _sbHelloParam, il je pourrais éventuellement connaître cette valeur puisqu'il s'agit d'un paramètre écrit dans un textbox.

    Mais, j'ai une autre fonction similaire, pour laquelle la valeur retournée peut être différente en fonction du paramètre passé.

    PS: ces fonctions sont dans une DLL Delphi, .... il faudrait quoi d'après toi ? que je connaisse la taille max que peut retourner la DLL Delphi ?



    Citation Envoyé par moldavi Voir le message
    Il faut aussi libérer p avec :
    Code :
    1
    2
     
    System::Runtime::InteropServices::Marshal::FreeHGlobal(p);
    Ok, Merci.

  5. #5
    Expert Confirmé

    Homme Profil pro david
    Responsable développement
    Inscrit en
    décembre 2003
    Messages
    1 652
    Détails du profil
    Informations personnelles :
    Nom : Homme david
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 652
    Points : 2 849
    Points
    2 849

    Par défaut

    Bonjour.

    Oui il faut connaître la taille minimum du buffer à fournir à la dll pour éviter un crash. J'imagine aussi qu'il faut initialiser le buffer avec des zéros, ça évitera peut-être des problèmes...

    En attendant tu peux toujours essayer des valeurs comme 256/512. Mais c'est risqué, enfin disons que cela dépend de ce que retourne cette dll.
    Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
    http://sourceforge.net/projects/mfnode/

    http://jeux.developpez.com/faq/directx/?page=dshow

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •