Как создать вариант массива BSTR в Euphoria с помощью EuCOM?
Вопрос
До сих пор я выяснил, как передавать строки Unicode, bSTR, в и из библиотеки Euphoria с помощью Typelib. Пока что я не могу понять, как создать и передать обратно массив BSTR.
Код, который у меня есть (вместе с include
для самого EuCOM и частей 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
Часть библиотеки типов:
[
helpstring("get an array of strings"),
entry("REALARR")
]
void __stdcall REALARR( [out,retval] VARIANT* res );
И тестовый код в VB6:
...
Dim v() as String
V = REALARR()
...
Пока что мне удалось получить только ошибку '0' из библиотеки DLL. Есть идеи? Кто-нибудь?
Решение
Вы должны использовать функцию create_safearray ()
. Это задокументировано (спрятано?) Под утилитами. По сути, поместите ваши указатели BSTR в последовательность и передайте их 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 )
Другие советы
Я общался с людьми из Euphoria через их Форум , и зашли так далеко. Процедура не выполняется в строке make_variant. Я не понял этого дальше, и они тоже.
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
Хорошо, var
не был инициализирован. Не то, чтобы это имело значение, поскольку рутина все еще терпит крах. Тем не менее, нужно
var = allocate( 16 )
как раз перед make_variant