Вы можете просто включить эту схему в путь поиска.
Если вы можете использовать «оператор настройки», который запускается после того, как соединение установлено, вы можете использовать:
set search_path=wening,public;
Другой вариант - навсегда изменить пользователя на использование этого [ 112] путь поиска (независимо от того, каким образом или каким инструментом этот пользователь подключается):
alter user postgres
set search_path = wening,public;
Не имеет отношения, но: использование суперпользователя в качестве пользователя приложения - плохая идея.
Попытайтесь передать 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;
}
Выезд с помощью 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 кометы, но идеи/понятия являются тем же.
SAFEARRAYs являются способом пойти, если Вы хотите соответствие Автоматизации OLE и возможно используете COM-интерфейс с других языков, таких как VB6. Но существует альтернатива в IDL, например: -
void Fx([in] long cItems, [in, size_is(cItems)] BYTE aItems[]);
Это описывает метод, где код маршалинга может вывести число байтов, которые будут переданы путем осмотра значения первого параметра.
Это прекрасно, если Ваши клиенты все записаны в C/C++, но я думаю, что интерфейс, содержащий это, не был бы совместим автоматизацией, таким образом, не применимый от VB6, и возможно стандарт marshaler не сможет сделать маршалинг, таким образом, необходимо было бы генерировать собственный DLL прокси/тупиковый от IDL. Не трудно, чтобы сделать, но немного тяжелее, чем использование SAFEARRAYs.
Можно использовать BSTR для передачи массива байтов.
BYTE array[buffer_size];
...
BSTR toBePassed = SysAllocStringByteLen((OLECHAR*)array,length);
YourCOMMethod(toBePassed);
SysFreeString(toBePassed);
В Вашем методе:
BYTE* pData = (BYTE*)bstrPassed;
DWORD dataLength = SysStringByteLen(bstrPassed);