Отправить wstring и ptime через MS RPC - PullRequest
2 голосов
/ 16 октября 2011

Я использую Microsoft RPC, и мне нужно передать свою пользовательскую структуру, имеющую поля типа std::wstring и boost::ptimeidl нет таких типов данных.Какое лучшее решение для отправки этой структуры.В читайте про сериализацию с RPC.Но MS сериализация также основана на файле idl, поэтому я не могу определить структуру в idl файле с wstring и ptime.

Ответы [ 2 ]

4 голосов
/ 17 октября 2011

IDL имеет ограниченный набор базовых типов и не может передавать полные объекты c ++, поскольку получатель может вообще не быть написан на c ++. Поэтому вам придется выполнить некоторые преобразования, но сделать это с указанными вами типами не очень сложно.

Начиная с wstring, вот ваши варианты:

  1. Передать строку c как [in, string] wchar_t*. wchar_t* - это то, что вы получаете при вызове std::wstring.c_str(), поэтому вы можете легко вызывать интерфейс без дополнительных преобразований.
  2. Передать строку c как массив символов. Нет реальной причины для этого, просто сказать, что это возможно.
  3. Передать строку c как BSTR . Теперь BSTR является не частью базовой IDL, а расширением автоматизации OLE, широко используемым в COM. Для его использования может потребоваться дополнительная настройка . BSTR в основном wchar_t*, но с размером в начале буфера. Вы можете создать BSTR, используя AllocSysString, и освободить его, используя SysFreeString. Или вы можете использовать ATL CComBSTR или класс _bstr_t для управления BSTRings. Оба принимают wchar_t* в своем конструкторе, поэтому преобразование wstring не будет проблемой.

Теперь, что касается ptime, я не очень знаком с этим типом, поэтому могут быть другие варианты, но я смог найти эти два:

  1. Преобразуйте ptime в int64 , а затем используйте тип IDL __ int64 для передачи его значения.
  2. Используйте to_iso_string, чтобы преобразовать ptime в строку, и передайте, как указано выше (обратите внимание, что to_iso_string дает вам обычный std::string, а не std::wstring). С другой стороны, используйте from_iso_string, чтобы вернуть ptime.
0 голосов
/ 12 июня 2013

Вы также можете использовать типы VARIANT, что дает вам кучу опций в зависимости от типа передаваемых данных. В вашем случае это будут VARIANT типа VT_BSTR & VT_DATE.

Это лично для меня хорошо работало, потому что я мог затем передавать SAFEARRAY, которые я мог использовать для передачи типов STL, таких как std :: map.

Marshaling OLE Типы данных:

Примечание по поводу вышеуказанного сайта MSDN: при добавлении типов VARIANT в вашу IDL, указанная выше ссылка указывает на импорт "objidl.idl". Это все равно дало мне ошибку компиляции, и вместо этого импорт "oaidl.idl" работал для меня.

...