как отправить VARIANT_bstr через COPYDATASTRUCT - PullRequest
2 голосов
/ 09 января 2010

Мне нужно отправить значение VARIANT в другое приложение, используя COPYDATASTRUCT. Вот структура, которую я использую для отправки сообщений.

struct {
   int     i_MsgId;
   VARIANT variant_Value;
}Message;

В моем коде я инициализирую VARIANT для типа BSTR и выделяю строку следующим образом.

Message structMessage;
VariantInit(&structMessage.variant_Value);
structMessage.var_Value.vt = VT_BSTR;

structMessage.variant_Value.bstrVal = ::SysAllocString(L"I am a happy BSTR");

Затем я отправляю это с помощью COPYDATASTRUCT следующим образом.

    COPYDATASTRUCT structCDS;

structCDS.cbData = sizeof(structMessage);
structCDS.dwData = 12;
structCDS.lpData = (LPVOID)(&structMessage);

::SendMessage(this->m_RemoteWindow,WM_COPYDATA,(WPARAM)this->GetSafeHwnd(),(LPARAM)&structCDS);

Это сообщение успешно получает мое второе приложение, ОДНАКО, когда я возвращаю его обратно в исходную структуру, "bstrVal" указывает на неверный указатель .

Я борюсь с этой ошибкой, так что жду вашей ценной помощи. Обратите внимание, что другие типы varinat (int, double) могут быть успешно преобразованы обратно, и эта ошибка только с bstr. (

Спасибо

1 Ответ

0 голосов
/ 09 января 2010

WM_COPYDATA поделится вашей структурой данных (на которую ссылается lpData) с другим приложением. Все, что содержится внутри структуры данных, будет доступно другому приложению. Однако bstrVal - это указатель, который ссылается на память в вашем приложении, и когда другое приложение попытается обратиться к нему, произойдет сбой.

Вот одно из решений; это требует дополнительной работы с обеих сторон.

На стороне отправителя, когда вы выделяете структуру данных (structMessage), добавьте достаточно места для хранения вашей строки. Добавьте строку в конец структуры данных (и обязательно увеличьте dwData на соответствующий размер).

На стороне получателя вы можете извлечь строку и использовать вызов SysAllocString в этой точке для назначения bstrVal. Не забудьте позвонить SysFree, когда закончите.

...