SAFEARRAY tableau de strings, DLL et VBA
Salut le forum,
Comme d'hab, je ne sais pas si mon post ci-dessous se fait au bon endroit du forum mais je tente le coup. Voici la situation :
J'ai une fonction en C (vbaRecupListe) qui doit me fournir en sortie une liste de chaînes de caractères, et je veux récupérer cette liste dans Excel via du code VBA.
Voici ma fonction C (vbaReupListe) destinée à la DLL, qui utilise un SAFEARRAY, sachant que la fonction originale 'RecupListe' appelée par 'vbaRecupListe' dans le code ci-dessous reçoit un argument de type 'char ***' à la base :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| extern "C" __declspec(dllexport) Long __stdcall vbaRecupListe(SAFEARRAY **elements_liste)
{
long ind[1];
unsigned long i;
char **tmp_elements_liste=NULL;
BSTR *chaine;
HRESULT ret;
Long retcode = RecupListe(&tmp_elements_liste);
if(tmp_elements_liste)
{
if ((ret = SafeArrayAccessData(*elements_liste, (void **) &chaine))==S_OK)
{
for (i = 0; i < (*elements_liste)->rgsabound->cElements; i++)
{
ind[0] = 1;
SafeArrayPutElement(*elements_liste, ind, tmp_elements_liste[i]);
}
SafeArrayUnaccessData(*elements_liste);
//free(tmp_elements_liste);
}
}
return retcode;
} |
Cette fonction compile bien, mais je ne sais pas si elle fait ce que je voudrais (je ne peux pas la débugger, faute de temps...), à savoir remplir ma liste avec les instructions du SafeArray.
Ensuite, en admettant que cela s'est bien passé, j'aimerais appeler la fonction depuis VBA dans Excel, et retourner les éléments de ma liste. Pour l'instant, j'ai fait ceci dans mon code VBA :
J'ai déclaré ma fonction de récup de la liste ainsi :
Public Declare Function RecupMaListe Lib "madll.dll" Alias "_RecupListe@8" (ByRef elements_liste() As String) As Long
Puis j'appelle la fonction ainsi :
dim retval as long
retval = RecupMaListe(elements_liste())
Ensuite, quand je veux afficher l'élément 0 de ma liste, j'ai un message vide dans VBA...
Questions :
1. Sachant que la fonction C originale 'RecupListe' appelée contient en argument un char ***, est-ce que l'argument 'SAFEARRAY **elements_liste' que j'ai déclaré dans 'vbaRecupListe' est OK ?
2. Est-ce que le code permettant le remplissage de mon SafeArray est OK ?
3. Est-ce que la déclaration de ma fonction en VBA avec un tableau de string est OK ? Sinon, quels arguments dois-je y passer ?
4. S'il faut effectivement déclarer un tableau de string dans la fonction VBA, dois-je initialiser le tableau avant son remplissage, et si oui comment ?
5. Comment puis-je appeler la fonction depuis VBA ? Dois-je passer en argument le premier élément de mon tableau de string, ou bien un pointeur vers le tableau (si pointeur, quel est le code ?) ?
J'ai déjà écumé toute la littérature possible sur le Web sans pouvoir me dépatouiller de ce problème, donc je pense que si vous m'envoyez un lien vers des exemples, je risque d'être déjà tombé dessus...
Alors si vous avez des suggestions concernant l'une de mes questions ci-dessus, ou des exemples de modification de ce code spécifiquement, je suis preneur et vous serez peut-être mon sauveur !
Merci d'avance pour votre aide précieuse.