Передача массива с помощью COM?

Вы можете просто включить эту схему в путь поиска.

Если вы можете использовать «оператор настройки», который запускается после того, как соединение установлено, вы можете использовать:

set search_path=wening,public;

Другой вариант - навсегда изменить пользователя на использование этого [ 112] путь поиска (независимо от того, каким образом или каким инструментом этот пользователь подключается):

alter user postgres
  set search_path = wening,public;

Не имеет отношения, но: использование суперпользователя в качестве пользователя приложения - плохая идея.

6
задан Rob 17 November 2008 в 07:39
поделиться

4 ответа

Попытайтесь передать safearray вариант COM-объекту. Что-то вроде этого для помещения Массива байтов в safearray варианте....

bool ArrayToVariant(CArray<BYTE, BYTE>& array, VARIANT& vtResult)
{
SAFEARRAY FAR*  psarray;
SAFEARRAYBOUND sabounds[1]; 

sabounds[0].lLbound=0;
sabounds[0].cElements = (ULONG)array.GetSize();

long nLbound;

psarray = SafeArrayCreate(VT_UI1, 1, sabounds);
if(psarray == NULL)
    return false;

for(nLbound = 0; nLbound < (long)sabounds[0].cElements ; nLbound++){
    if(FAILED(SafeArrayPutElement(psarray, &nLbound, &array[nLbound]))){
        SafeArrayDestroy(psarray);
        return false;
    }
}

VariantFree(vtResult);
vtResult.vt = VT_ARRAY|VT_UI1;
vtResult.parray = psarray;
return true;
}
11
ответ дан 9 December 2019 в 22:41
поделиться

Выезд с помощью safearrays. Вот некоторый пример кода:

safearray возвращается как указатель на ВАРИАНТ

[id(1), helpstring("LogCache")] HRESULT LogCache([out,retval] VARIANT* logCache);

Safearrays довольно просты в использовании. Вот некоторый пример кода, который является кэшем последних 1 000 сообщений журнала некоторого приложения:

   safearray_t<bstr_t> m_logCache;
   ...
   if (m_logCache.size() > 1000)
   {
       m_logCache.pop_back();
   }

   m_logCache.push_front(Msg.str(), 0);


    variant_t LogCache()
    {
        if (!m_logCache.is_empty())
        {
            variant_t cache(m_logCache);
            return cache;
        }
    }

Обратите внимание, что синтаксис в Вашем случае почти наверняка будет отличающимся, так как я использую библиотеку COM кометы, но идеи/понятия являются тем же.

0
ответ дан 9 December 2019 в 22:41
поделиться

SAFEARRAYs являются способом пойти, если Вы хотите соответствие Автоматизации OLE и возможно используете COM-интерфейс с других языков, таких как VB6. Но существует альтернатива в IDL, например: -

void Fx([in] long cItems, [in, size_is(cItems)] BYTE aItems[]);

Это описывает метод, где код маршалинга может вывести число байтов, которые будут переданы путем осмотра значения первого параметра.

Это прекрасно, если Ваши клиенты все записаны в C/C++, но я думаю, что интерфейс, содержащий это, не был бы совместим автоматизацией, таким образом, не применимый от VB6, и возможно стандарт marshaler не сможет сделать маршалинг, таким образом, необходимо было бы генерировать собственный DLL прокси/тупиковый от IDL. Не трудно, чтобы сделать, но немного тяжелее, чем использование SAFEARRAYs.

2
ответ дан 9 December 2019 в 22:41
поделиться

Можно использовать BSTR для передачи массива байтов.

BYTE array[buffer_size];
...
BSTR toBePassed = SysAllocStringByteLen((OLECHAR*)array,length);
YourCOMMethod(toBePassed);
SysFreeString(toBePassed);

В Вашем методе:

BYTE* pData = (BYTE*)bstrPassed;
DWORD dataLength = SysStringByteLen(bstrPassed);
-2
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: