LPVOID — это просто void*, поэтому вы можете преобразовать в него любой указатель, поскольку любой указатель может быть преобразован в void*. Однако это не гарантирует, что эта операция даст правильный результат с точки зрения ваших ожиданий.
Просто LPVOID используется в ситуациях по следующей схеме
int i = 10; // some real data
int* pi = &i; // pointer to data
// convert to opaque pointer, not usable (readable), onlly can be passed around
// for instance to thread procedure
void* pv = pi;
pi = reinterpret_cast<int*>(pv); // convert back to pointer to data
int j = *pi; // access real data
Проблема в том, что вы должны гарантировать, что i
будет оставаться в живых, по крайней мере, до тех пор, пока данные будут доступны/используются через указатель pv
. Вы должны учитывать, если ваш w
Итак, вы можете сделать это:
bool httpWrapper::setPostData(const string &postData){
_postData = reinterpret_cast<LPVOID>(postData.c_str());
return false;
}
но вы должны гарантировать, что строковый объект, который вы передаете по ссылке как postData
, останется живым, по крайней мере, до тех пор, пока на него указывает _postData
. На самом деле _postData
указывает на внутреннее расположение возвращенного c_str()
Кроме того, кажется, что вы собираетесь использовать значение, возвращаемое c_str()
, как LPWSTR
. Чтобы использовать LPWSTR, вам необходимо преобразовать ANSI в широкие символы, например, используя MultiByteToWideChar.
Другими словами, преобразование одного указателя в другой само по себе не является проблемой. Проблема заключается в том, чтобы гарантировать надлежащее время жизни и использования объектов.
person
mloskot
schedule
06.02.2010