_bstr_t на указатель на символ и вызов atof (...) - PullRequest
1 голос
/ 28 июня 2010

Этот код не будет выдавать ошибку:

_bstr_t text=n.GetText();

 atof((char*)text)

Где текст - двойное значение.

Я знаю, что _bstr_t выдает const char* в преобразовании;так что я не уверен, что atof() будет работать?

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Мне кажется, что использовать _wtof(text) абсолютно безопасно (см. http://msdn.microsoft.com/en-us/library/hc25t012.aspx), чтобы выполнить преобразование, которое вам нужно.

@ sharptooth: в общем случае BSTR данные не всегда должны быть строкой с нулем в конце. Но соответствует описанию класса _bstr_t (см. http://msdn.microsoft.com/en-us/library/zthfhkd6.aspx):

Объект _bstr_t инкапсулирует BSTR тип данных. Класс управляет ресурсом распределение и освобождение через вызовы функций к SysAllocString и SysFreeString и другие BSTR API, когда необходимо.

Только данные, выделенные с помощью SysAlloc-функций, отличных от SysAllocString, не могут заканчиваться нулем. Функция SysAllocString всегда выделяет два дополнительных байта и заполняет их L '\ 0'. Чтобы прочитать больше информации на эту тему, я обращаюсь к http://blogs.msdn.com/b/ericlippert/archive/2003/09/12/52976.aspx.

1 голос
/ 28 июня 2010

Прежде всего, _bstr_t имеет operator char*() const, поэтому вам не нужен каст. Затем этот оператор вызывает ConvertBSTRToString () , который возвращает массив символов, выделенный в куче, который вам нужен delete[] позже (см. Пример в связанной статье), в противном случае это приведет к утечке памяти. Наконец, вы должны знать, что _bstr_t может инкапсулировать нулевой указатель, который соответствует пустой строке, и ваша программа должна обрабатывать такие ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...