Возврат строк в VCL + ATL
От: Алексей К  
Дата: 23.05.03 01:41
Оценка:
Простая функция возвращает строку. Как правильнее (лучше) и в каких случаях???
STDMETHODIMP TMedDeviceImpl::GetDeviceID(BSTR* ID)
{
  try
  {
      // так ?
      *ID = WideString(L"Unknown Device").Copy();

      // или так ?
      *ID = WideString(L"Unknown Device").Detach();
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IMedDevice);
  }
  return S_OK;
};
Re: Возврат строк в VCL + ATL
От: Аноним  
Дата: 23.05.03 05:54
Оценка:
Здравствуйте, Алексей К, Вы писали:

По идее не так и не так , а :


SysReAllocString(ID, "Unknown Device");
Re[2]: Возврат строк в VCL + ATL
От: Алексей К  
Дата: 23.05.03 06:26
Оценка:
Спасибо
Re: Возврат строк в VCL + ATL
От: Vi2 Удмуртия http://www.adem.ru
Дата: 23.05.03 06:43
Оценка:
Здравствуйте, Алексей К, Вы писали:

Не слушай Анонимов — они ответственности не несут!
Потому как использование [out] параметров в целях [in] может караться СОМом существеннее, чем насмешкой в форуме.

АК> // так ?
АК> *ID = WideString(L"Unknown Device").Copy();
АК> // или так ?
АК> *ID = WideString(L"Unknown Device").Detach();

Различие этих двух способов — в дополнительных издержках при Copy на выделение памяти, которых можно (и нужно бы) избежать. Если используется временная переменная (как в твоем случае), то лучше использовать Detach. Если же переменная глобальная, то, разумеется, Detach не подходит и остается лишь Copy.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Возврат строк в VCL + ATL
От: Аноним  
Дата: 23.05.03 07:17
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Алексей К, Вы писали:


Vi2>Не слушай Анонимов — они ответственности не несут!

Vi2>Потому как использование [out] параметров в целях [in] может караться СОМом существеннее, чем насмешкой в форуме.

Vi2>

АК>> // так ?
АК>> *ID = WideString(L"Unknown Device").Copy();
АК>> // или так ?
АК>> *ID = WideString(L"Unknown Device").Detach();

Vi2>Различие этих двух способов — в дополнительных издержках при Copy на выделение памяти, которых можно (и нужно бы) избежать. Если используется временная переменная (как в твоем случае), то лучше использовать Detach. Если же переменная глобальная, то, разумеется, Detach не подходит и остается лишь Copy.


А если подумать ?.

STDMETHODIMP TMedDeviceImpl::GetDeviceID(BSTR* ID) //здесь это метод автоматизации, т.е. 'BSTR* ID' может содержать все что угодно.

надо обязательно освободить занимаемую память перед распределением новой.
дальше : возможно методы WideString .Copy() и .Detach() делают что либо похожее —
но
SysReAllocString(ID, "Unknown Device");


точно верно , к бабке не ходи.

(лучше вообще не советовать , чем путать , б...)
Re[3]: Возврат строк в VCL + ATL
От: Vi2 Удмуртия http://www.adem.ru
Дата: 23.05.03 08:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А если подумать ?.

А>STDMETHODIMP TMedDeviceImpl::GetDeviceID(BSTR* ID)
А>     //здесь это метод автоматизации, т.е. 'BSTR* ID' может содержать все что угодно.

Итак, этому варианту в С соответствует ДВА варианта в IDL — GetDeviceID([in,out]BSTR* ID) и GetDeviceID([out]BSTR* ID) с возможным retval-ом. Схемы работы сервера в этих случаях разный.

А>надо обязательно освободить занимаемую память перед распределением новой.

В первом варианте нужно освобождать, а во втором — нет. И клиентский код для второго случая без маршаллинга
BSTR devID; GetDeviceID(&devID);

вынесет клиента, хотя он, клиент, делает все правильно. Потому как devID не проинициализирован и не должен быть проинициализирован.

А>(лучше вообще не советовать , чем путать , б...)

Если есть какие-то нюансы работы с параметрами в системе классов T**** и WideString, то, наверное, лучше уточнить эти нюансы.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Возврат строк в VCL + ATL
От: Аноним  
Дата: 23.05.03 08:20
Оценка:
Здравствуйте, Vi2, Вы писали:

при всем уважении меня ты только запутал.

Vi2>Если есть какие-то нюансы работы с параметрами в системе классов T**** и WideString, то, наверное, лучше уточнить эти нюансы.


кстати ,а уточни : что лучше использовать в Builder'e, в COM'ах для передачи параметров ADO: TVariant , CComVariant либо что-то еще.
Re[5]: Возврат строк в VCL + ATL
От: Vi2 Удмуртия http://www.adem.ru
Дата: 23.05.03 14:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>при всем уважении меня ты только запутал.
А>кстати ,а уточни : что лучше использовать в Builder'e, в COM'ах для передачи параметров ADO: TVariant , CComVariant либо что-то еще.

Я не знаю насчет Builder'а — не работал с ним.

Я писал просто о том, что главное — это IDL описание интерфейса. Это контракт между сервером и клиентом. Если параметр имеет [in] составляющую, то клиент обязан инициализировать параметр. Если параметр имеет [out] составляющую, то сервер обязан вернуть правильный параметр. Если параметр имеет и [in], и [out] составляющую, то клиент обязан установить, а сервер обязан вернуть правильные значения, возможно, изменив переданное значение.

Все остальные манипуляции считаются запрещенными. Это изменение параметров [in] или чтение параметров [out].

PS
Это все, конечно, не касается самых первых указателей. Т.е. [out]long* p или [out]BSTR* p, p как указатель на нечто может быть считан. Однако значение. на которое он ссылается, является объектом в вопросе. Т.е. *p не может быть использовано для чтения.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.