Как создать вариант массива BSTR в Euphoria с помощью EuCOM?

StackOverflow https://stackoverflow.com/questions/199612

  •  11-07-2019
  •  | 
  •  

Вопрос

До сих пор я выяснил, как передавать строки 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top