Я унаследовал старое приложение, которое использует элемент управления CppWebBrowser.
Приложение всегда использовало метод :: Navigate для запросов GET, но теперь мне нужно начать использовать его для POST; однако существующий код не работает для POST. У меня ограниченные знания, работающие с этими типами данных, но я подозреваю, что это связано с преобразованием CString в VT_ARRAY | VT_UI1.Как преобразовать CString в VT_ARRAY | VT_UI1
void WebPostData(TCppWebBrowser *CppWebBrowser, CString sURL, CString sPostData)
{
BSTR bstrHeaders = NULL;
TVariant vFlags = { 0 }, vTargetFrameName = { 0 }, vPostData = { 0 }, vHeaders = { 0 };
LPSAFEARRAY psa;
LPCTSTR cszPostData = sPostData;
UINT cElems = lstrlen(cszPostData);
LPSTR pPostData;
LPVARIANT pvPostData;
bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencodedrn");
if (!bstrHeaders){
Application->MessageBox("Could not allocate bstrHeaders", "Warning", MB_OK | MB_ICONWARNING);
return;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
pvPostData = vPostData;
if (pvPostData){
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
if (!psa){
return;
}
SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, cszPostData, cElems);
SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
}
CppWebBrowser->Navigate((TVariant)sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
}
Значит ли [** это **] (Http: //edn.embarcadero. com/article/27519) help? – abelenky
Я предполагаю, что у вас есть сборка Unicode (может быть, нет, особенно, это старый проект), и в этом случае значение 'CString' будет строкой Unicode, и вы хотите, чтобы ASCII или UTF-8 для' memcpy' в массив байтов. –
Эта статья выглядит как точное место, где исходный разработчик скопировал код, за исключением того, что они изменили параметр sPostData из String в CString. Кроме того, в некоторых комментариях к этой статье говорится, что она не работает для сообщений. – ddrjca