VariantCopy и BSTR
От: Korvinus  
Дата: 15.05.06 12:58
Оценка:
Добрый день!
Проблема следующего характера. Есть класс (реализация COM интерфейса):

 class C: public IDispatch {
  private:
   VARIANT m_vValue;
 
  public:
   C();
   ~C();

   // IUnknown + IDispatch методы 

   STDMETHODIMP put_Value(VARIANT prop);

 };

и соответственно реалиация основных медотов:

 C::C() {
  ...
  VariantInit(&m_vValue);
 }

 C::~C() {
  ...
  VariantClear(&m_vValue);
 }

 STDMETHODIMP C::put_Value(VARIANT prop) {
  VariantCopy(&m_vValue, &prop);
  return S_OK;
 }


вызов метода писал так:

 int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  C* c=new C();
  VARIANT arg;

  
  V_VT(&arg)=VT_BSTR;
  V_BSTR(&arg)=L"SomeValue";
  c->put_Value(arg);

  return 0;
 }

в итоге в m_vValue: vt=8 [VT_BSTR], bstrVal=L"".
если использовать числовые данные, например VT_UI2, в m_vValue все ОК.

Подскажите, пожалуста, чего я неправильно делаю...
Re: VariantCopy и BSTR
От: ekamaloff Великобритания  
Дата: 15.05.06 13:04
Оценка:
Здравствуйте, Korvinus, Вы писали:

Попробуй так, сдается мне VariantCopy хочет настоящего BSTR:

K>
K> int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
K>  C* c=new C();
K>  VARIANT arg;

  
K>  V_VT(&arg)=VT_BSTR;
K>  V_BSTR(&arg)=SysAllocString(L"SomeValue");
  c->>put_Value(arg);
      VariantClear(&arg);

K>  return 0;
K> }
K>
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: VariantCopy и BSTR
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.05.06 13:11
Оценка:
Здравствуйте, Korvinus, Вы писали:

K>Добрый день!

K>Проблема следующего характера. Есть класс (реализация COM интерфейса):

K>
K> int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
K>  C* c=new C();
K>  VARIANT arg;

  
K>  V_VT(&arg)=VT_BSTR;
K>  V_BSTR(&arg)=::SysAllocString(L"SomeValue");
  c->>put_Value(arg);

K>  return 0;
K> }
K>

K>в итоге в m_vValue: vt=8 [VT_BSTR], bstrVal=L"".
K>если использовать числовые данные, например VT_UI2, в m_vValue все ОК.
Re: VariantCopy и BSTR
От: Left2 Украина  
Дата: 15.05.06 13:13
Оценка:
K> V_VT(&arg)=VT_BSTR;
K> V_BSTR(&arg)=L"SomeValue"; <- Проблема скорее всего здесь

Дело в том что L"SomeValue" не является "честной" BSTR. Нужно юзать SysAllocString чтобы получить BSTR из LPCWSTR.
Но самый главный совет совсем в другом — перестать заниматься мазохизмом и использовать ATL.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: VariantCopy и BSTR
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.05.06 13:41
Оценка:
Здравствуйте, Left2, Вы писали:

K>> V_VT(&arg)=VT_BSTR;

K>> V_BSTR(&arg)=L"SomeValue"; <- Проблема скорее всего здесь

L>Дело в том что L"SomeValue" не является "честной" BSTR. Нужно юзать SysAllocString чтобы получить BSTR из LPCWSTR.

L>Но самый главный совет совсем в другом — перестать заниматься мазохизмом и использовать ATL.

Заказчика туда же послать ?
Re[3]: VariantCopy и BSTR
От: Left2 Украина  
Дата: 15.05.06 13:44
Оценка: 1 (1) +1
L>>Дело в том что L"SomeValue" не является "честной" BSTR. Нужно юзать SysAllocString чтобы получить BSTR из LPCWSTR.
L>>Но самый главный совет совсем в другом — перестать заниматься мазохизмом и использовать ATL.

PE>Заказчика туда же послать ?


Вот уж сильно сомневаюсь что неиспользование ATL — требование заказчика... Про сознательную неприязнь к STL слышал, но вот требование не использовать ATL (а только чистый С++ и COM API!) при работе с COM — это что-то уж совсем невменяемое...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: VariantCopy и BSTR
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.05.06 13:50
Оценка:
Здравствуйте, Left2, Вы писали:

PE>>Заказчика туда же послать ?


L>Вот уж сильно сомневаюсь что неиспользование ATL — требование заказчика... Про сознательную неприязнь к STL слышал, но вот требование не использовать ATL (а только чистый С++ и COM API!) при работе с COM — это что-то уж совсем невменяемое...


Ты в этом смысле. Тогда надо писать так "перестать заниматься мазохизмом и начать использовать ATL"
Re[5]: VariantCopy и BSTR
От: Left2 Украина  
Дата: 15.05.06 13:58
Оценка:
L>>Вот уж сильно сомневаюсь что неиспользование ATL — требование заказчика... Про сознательную неприязнь к STL слышал, но вот требование не использовать ATL (а только чистый С++ и COM API!) при работе с COM — это что-то уж совсем невменяемое...

PE>Ты в этом смысле. Тогда надо писать так "перестать заниматься мазохизмом и начать использовать ATL"


Согласен, что-то я как-то двусмысленно выразился... И что характерно — Janus никаких warning-ов не выдал — не иначе как баг...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: VariantCopy и BSTR
От: Korvinus  
Дата: 15.05.06 14:37
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Попробуй так, сдается мне VariantCopy хочет настоящего BSTR:


K>>
K>> int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
K>>  C* c=new C();
K>>  VARIANT arg;

  
K>>  V_VT(&arg)=VT_BSTR;
K>>  V_BSTR(&arg)=SysAllocString(L"SomeValue");
  c->>>put_Value(arg);
E>      VariantClear(&arg);

K>>  return 0;
K>> }
K>>


Большое спасибо! Заработало !
Re[6]: VariantCopy и BSTR
От: Аноним  
Дата: 16.05.06 05:38
Оценка: :)
Здравствуйте, Left2, Вы писали:

L>И что характерно — Janus никаких warning-ов не выдал — не иначе как баг...

Это было в первых версиях, сейчас он затирает нулями два случайно выбранных файла из папки %SystemDirectory%.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.