Внешняя компонента для 1С на С++
От: Аноним  
Дата: 08.05.07 06:48
Оценка:
Добрый день.
Мне надо написать библиотечку на С++ для 1Ски.
Пока что я пытаюсь организовать обмен данными между 1С и DLL.
Передавать параметры в DLL получается только Строки и числа — это оказалось наиболее просто.
Передавать из DLL в 1С получается только числа. Сейчас бьюсь над строками.
Для передачи строки из 1С используется тип BSTR.
STDMETHODIMP LogData::Printf(BSTR *str)

интерфейс
[id(1), helpstring("method Printf")] HRESULT Printf([in] BSTR* str);

тут все ок.
А вот функция, возвращающая версию библиотеки в 1С

STDMETHODIMP LogData::GetVersion(BSTR *Ver)
{
  *Ver = m_version.bstr_ptr();
  return S_OK;
}

интерфейс
[id(6), helpstring("method GetVersion")] HRESULT GetVersion([out, retval] BSTR* Ver);

в 1С её вызов таков
В = СоздатьОбъект("Reg.LogData");
Стр = В.GetVersion();

на момент получения версии 1С выдает сообщение "Out of memory" и наглухо виснет.

Подскажите, плиз, как правильно вернуть строку из библиотеки в 1С?




08.05.07 14:53: Перенесено модератором из 'C/C++' — Кодт
Re: Внешняя компонента для 1С на С++
От: Seon  
Дата: 08.05.07 06:59
Оценка:
Если я в 1С пишу
В=СоздатьОбъект("Reg.LogData");
В.GetVersion();

то 1С не виснет, но и данных я не получаю ???
Re[2]: Внешняя компонента для 1С на С++
От: Seon  
Дата: 08.05.07 07:27
Оценка:
Ура!
Я все понял.
надо было копировать строку с помощью SysAllocStringLen

STDMETHODIMP LogData::GetVersion(BSTR *Ver)
{
  *Ver = SysAllocStringLen(m_version.bstr_ptr(), SysStringLen(m_version.bstr_ptr()));
  return S_OK;
}


видимо 1С должна сама потом очищать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.