2008-10-14 9 views
1

Jusqu'à présent, j'ai compris comment passer des chaînes Unicode, bSTR, vers et à partir d'une DLL Euphoria en utilisant un Typelib. Ce que je ne peux pas comprendre, jusqu'à présent, c'est comment créer et renvoyer un tableau de BSTR.Comment créer un tableau de variantes de BSTR dans Euphoria en utilisant EuCOM?

Le code que j'ai jusqu'à présent (avec include s pour EUCOM lui-même et les parties de Win32lib):

global function REALARR() 
    sequence seq 
    atom psa 
    atom var 
    seq = { "cat","cow","wolverine" } 
    psa = create_safearray(seq, VT_BSTR) 
    make_variant(var, VT_ARRAY + VT_BSTR, psa) 
    return var 
end function 

Une partie de la typelib est:

[ 
    helpstring("get an array of strings"), 
    entry("REALARR") 
    ] 
    void __stdcall REALARR([out,retval] VARIANT* res); 

Et le code de test, en VB6 est:

... 
Dim v() as String 
V = REALARR() 
... 

Jusqu'ici tout ce que j'ai réussi à obtenir est une erreur '0' de la DLL. Des idées? N'importe qui?

Répondre

1

Vous devez utiliser la fonction create_safearray(). Il est documenté (caché?) Sous Utilitaires. En gros, mettre vos pointeurs BSTR dans une séquence et le transmettre à create_safearray():

sequence s, bstrs 
s = {"A", "B"} 
bstrs = {} 
for i = 1 to length(s) do 
    bstrs &= alloc_bstr(s[i]) 
end for 

atom array 
array = create_safearray(bstrs, VT_BSTR) 

... 

destroy_safearray(array) 
+0

Merci, Matt, je l'ai donner un aller. – bugmagnet

0

J'ai été en contact avec les gens Euphoria via leur forum, et je suis allé aussi loin. La routine échoue sur la ligne make_variant. Je ne l'ai pas compris plus loin et pas plus.

global function REALARR() 
    atom psa 
    atom var 
    atom bounds_ptr 
    atom dim 
    atom bstr 
    object void 

    dim = 1 
    bounds_ptr = allocate(8 * dim) -- now figure out which part is Extent and which is LBound 
    poke4(bounds_ptr, { 3, 0 }) -- assuming Extent and LBound in that order 

    psa = c_func(SafeArrayCreate, { VT_BSTR, 1, bounds_ptr }) 

    bstr = alloc_bstr("cat") 
    poke4(bounds_ptr, 0) 
    void = c_func(SafeArrayPutElement, {psa, bounds_ptr, bstr}) 
    free_bstr(bstr) 

    bstr = alloc_bstr("cow") 
    poke4(bounds_ptr, 1) 
    void = c_func(SafeArrayPutElement, {psa, bounds_ptr, bstr}) 
    free_bstr(bstr) 

    bstr = alloc_bstr("wolverine") 
    poke4(bounds_ptr, 2) 
    void = c_func(SafeArrayPutElement, {psa, bounds_ptr, bstr}) 
    free_bstr(bstr) 

    make_variant(var, VT_ARRAY + VT_BSTR, psa) 
    return var 
end function 
0

Ok, var n'a pas été initialisé. Pas que cela ait de l'importance car la routine se bloque toujours. Néanmoins, il faut un

var = allocate(16) 

juste avant la make_variant

Questions connexes