IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Créer un SafeArray de BSTR


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut Créer un SafeArray de BSTR
    Bonjour,

    Je cherche à créer un SafeArray de BSTR afin de renvoyer un tableau contenant des adresses IP via COM.

    Pour l'instant, je fais comme ça, mais ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    //Méthode renvoyant un tableau d'adresse IP
    STDMETHODIMP TGestionnaireCOMImpl::get_serverList(LPSAFEARRAY* list)
    {
    	LPSAFEARRAY lpsa;
    	WideString tmp;
    	BSTR addrTmp;
    	AnsiString texte;
     
    	//Ouverture du fichier .ini contenant les @IP
    	TIniFile * iniFile = new TIniFile(ChangeFileExt(Application->ExeName,".INI"));
     
    	//lecture
    	TStringList * section = new TStringList;
    	iniFile->ReadSection("serverAddress", section);
     
    	//on créé le vecteur (SafeArray)
    	lpsa = SafeArrayCreateVector(VT_BSTR, 0, section->Count);
    	if(lpsa == NULL)
    	{
    		texte = "lpsa = NULL";
    		Form3->Memo1->Lines->Add(texte); 
    	}
     
    	//on le remplit
    	long Position;
    	for(int i=0; i<section->Count; i++)
    	{
    		Position = i;
    		tmp = section->operator [](i);
    		addrTmp = tmp.c_bstr();
     
    		HRESULT reponse = SafeArrayPutElement(lpsa, &Position, &addrTmp);
    		analyseReponse(reponse, "SafeArrayPutElement");
    	}
     
    	//on copie et on detruit
    	SafeArrayCopy(lpsa, list);
     
    	SafeArrayDestroy(lpsa);
     
    	return S_OK; 
    }
    addrTemp contient bien une @IP. Mais au premier SafeArrayPutElement le programme plante.

    Je pense que le problème vient du fait que quand je créé le tableau, je lui indique que la taille des "cases" est VT_BSTR et quand je le rempli, le BSTR est plus gros que la case alloué.

    Si quelqu'un sait comment faire...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne sais pas trop ce que vaut WideString::c_bstr() question durée de vie.
    Essaie peut-être en faisant toi-même un appel à SysAllocString()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut
    J'ai mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		addrTmp = SysAllocString(L"000.000.000.000");
     
    		HRESULT reponse = SafeArrayPutElement(lpsa, &Position, &addrTmp);
    Ça ne change toujours rien. Ça plante dans le SafeArrayPutElement(). Il ne me renvoi même pas un code de réponse.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par [URL=http://msdn.microsoft.com/en-us/library/ms893437.aspx]doc de SafeArrayPutElement()[/URL]
    The variant types VT_DISPATCH, VT_UNKNOWN, and VT_BSTR are pointers, and do not require another level of indirection.
    En clair, passe ta BSTR directement au lieu de passer un pointeur vers elle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé Avatar de sylvain.cool
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 242
    Par défaut
    Mince, j'avais pas vu ça dans la doc.

    C'est bon, ça marche en mettant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		addrTmp = tmp.c_bstr();
     
    		HRESULT reponse = SafeArrayPutElement(lpsa, &Position, addrTmp);
    C'est quand même un peu bête de changer le type de paramètre suivant ce qu'on veut mettre dans le SafeArray.

    Merci Medinoc.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un bitmap à partir d'un safearray
    Par dom_perron dans le forum C++
    Réponses: 1
    Dernier message: 14/03/2007, 13h00
  2. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10
  3. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo