Créer un VARIANT contenant un tableau de long [Résolu]

jayjay9531 18 Messages postés vendredi 22 septembre 2006Date d'inscription 22 février 2008 Dernière intervention - 22 févr. 2008 à 12:01 - Dernière réponse : jayjay9531 18 Messages postés vendredi 22 septembre 2006Date d'inscription 22 février 2008 Dernière intervention
- 22 févr. 2008 à 16:25
Bonjour,

Je viens vers vous parce que je croise assez si=ouvent ces VARIANT ou _variant_t que je n'arrive pas à bien utiliser. Grâce à MSDN et au forum j'arrive à travailler avec quand il s'agit de récupérer des infos dedans, mais je dois utiliser une fonction où je dois créer ce VARIANT. Je vous donne la description :

<hr />
IAllplFileSet::Attach

Assigns a list of drawing files to a fileset.

HRESULT Attach([in] VARIANT FileNumbers)

Parameters

FileNumbers
Input parameter, a VARIANT containing an array of VT_14. Each value in the array reflects a drawing file number.

<hr />
Alors le type VT_14 il me semble que c'est "long". Mais j'arrive pas à envoyer la variable. Est ce que quelqu'un aurait une idée de comment créer un tableau de "long", lui assigner les valeurs de 200 à 240 par exemple et  le mettre dans un VARIANT ?

Je vous remercie par avance pour vos réponses.
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2008 à 15:39
3
Merci
Salut,


Ca ressemble peut être à quelque chose comme ça (Mais vérifie par rapport au code de BruNews) :
#include <windows.h>
#include <oleauto.h>

int main()
{
SAFEARRAYBOUND lpBounds[1]; // Pour demander les dimensions du tableau
SAFEARRAY* lpArray; // Récupération du tableau
int* lpData; // Données du tableau
VARIANT var; // Le variant créé
int i;

// Initialisation du variant
VariantInit(&var);

// Précision de ce que contient le variant
var.vt = VT_ARRAY | VT_I4;

// On veut 41 entiers, indicés de 0 à 40
lpBounds[0].lLbound = 0; // Borne inférieure
lpBounds[0].cElements = 41; // Nombre d'éléments

// Création du tableau
lpArray = SafeArrayCreate(VT_I4, 1, lpBounds);
if (! lpArray) return 1;

// Il faut demander pour accèder au contenu du tableau
SafeArrayAccessData(lpArray, &lpData);

// On remplit avec les entiers de 200 à 240
for (i = 0 ; i < 41 ; i++)
lpData[i] = 240 + i;

// On indique que l'on a terminé d'accèder au données
SafeArrayUnaccessData(lpArray);

// Mise en place du tableau dans le variant
var.parray = lpArray;

return 0;
}

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de cs_rt15
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 22 févr. 2008 à 13:59
0
Merci
création : SafeArrayCreate()
Commenter la réponse de cs_juju12
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2008 à 14:44
0
Merci
Full exemple ici:
http://www.vbfrance.com/code.aspx?ID=33938

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
jayjay9531 18 Messages postés vendredi 22 septembre 2006Date d'inscription 22 février 2008 Dernière intervention - 22 févr. 2008 à 15:02
0
Merci
>>BruNews : C'est du C++, alors je suis pas sûr de bien comprendre ta réponse. Mon problème c'est pour obtenir une variable de type VARIANT à passer en paramètre, parce qu'un tableau de long, cette fonction elle ne le prendra pas.

>>juju12 : J'ai vu pas mal de SafeArrayCreate(), mais je comprend pas comment obtenir ma variable VARIANT avec ça, tu pourrais m'en dire plus ?
Commenter la réponse de jayjay9531
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2008 à 15:29
0
Merci
Moi c'est que tu n'aies pas lu mon source dont je suis certain sinon tu aurais vu que tout le code créant les SafeArray est en C.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
jayjay9531 18 Messages postés vendredi 22 septembre 2006Date d'inscription 22 février 2008 Dernière intervention - 22 févr. 2008 à 15:39
0
Merci
Ah pardon BruNews, j'avais pas vu en bas le fichier "CodAsmC.txt". Je lisais le code et quand j'ai compris que c'était du VB je me suis demandé si tu avais pas posté ici la réponse d'un autre topic

Alors je vais tester ça. Je suis pas sûr de bien comprendre une chose, c'est le lien entre les SAFEARRAY et les VARIANT. Je reviens accepter la réponse si ça passe, merci et désolé d'avoir parlé trop vite...
Commenter la réponse de jayjay9531
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2008 à 15:56
0
Merci
Les variables de types VARIANT peuvent contenir n'importe quoi : un tableau, un entier, un booléen, une chaîne...

L'attribut vt permet de savoir ce qui est réellement dans le VARIANT.
Dans ton cas, il faut que tu précise que ton VARIANT est un VT_ARRAY |
VT_I4, et que te mette en place le tableau dans le bon attribut.
Commenter la réponse de cs_rt15
jayjay9531 18 Messages postés vendredi 22 septembre 2006Date d'inscription 22 février 2008 Dernière intervention - 22 févr. 2008 à 16:07
0
Merci
Ok merci beaucoup. J'ai vu ta porcédure et je suis en train de la tester. Ok pour le type VARIANT, ça devient plus clair.

Sinon pour l'instant j'ai cette erreur pour la ligne : "SafeArrayAccessData(lpArray, &lpData);"
-->"error C2664: 'SafeArrayAccessData' : impossible de convertir le paramètre 2 de 'int **' en 'void **'"

Pourtant je retrouve la même ligne dans la procédure de BruNews. Je vais regarder ça de plus près...
Commenter la réponse de jayjay9531
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 22 févr. 2008 à 16:18
0
Merci
S'il veut pas le convertir tout seul lpData de (int**) vers (void**), suffit de le forcer un peu :
SafeArrayAccessData(lpArray, (void **)&lpData);


Ce type d'erreur est assez courant tu verras. Deux cas possibles :


1 Soit on a fait une vrai erreur et on a mis par exemple un int alors que la fonction attendait un int*.

2 Soit le compilo chipote et il suffit de caster comme je l'ai fait ci-dessus.
Commenter la réponse de cs_rt15
jayjay9531 18 Messages postés vendredi 22 septembre 2006Date d'inscription 22 février 2008 Dernière intervention - 22 févr. 2008 à 16:25
0
Merci
Ok merci, j'étais en train de me documenter pour tenter un cast, je vois que c'est plus simple que ce que je croyais !! Donc en effet la il compile, et en plus c'est bon la fonction s'execute comme il le faut.

Merci énormément pour ton aide, je commençais à désespèrer avec ces VARIANT.
Commenter la réponse de jayjay9531

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.