我正在为NSIS(Unicode)开发一个插件,我正在尝试使用InternetCrackUrl()来获取URL的主机名(即:http://www.google.com/test.html - > www.google.com),而不是lpszHostName只需返回“www.google.com”,它就会返回“www.google.com/test.html”。
这是我的代码:
void __declspec(dllexport) Example(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) {
g_hwndParent=hwndParent;
EXDLL_INIT();
LPWSTR szURI = new WCHAR[string_size];
URL_COMPONENTS urlComp;
// Sets szURI to "http://www.xyz.com/test.html"
popstring(szURI);
wstring strUri = szURI;
ZeroMemory(&urlComp, sizeof(urlComp));
urlComp.dwStructSize = sizeof(urlComp);
// Set required component lengths to non-zero so that they are cracked.
urlComp.dwHostNameLength = static_cast<DWORD>(-1);
urlComp.dwSchemeLength = static_cast<DWORD>(-1);
urlComp.dwUrlPathLength = static_cast<DWORD>(-1);
urlComp.dwExtraInfoLength = static_cast<DWORD>(-1);
if (!InternetCrackUrlW(strUri.c_str(), strUri.length(), 0, &urlComp)) {
return _T("InternetCrackUrl failed");
}
// urlComp.lpszHostName = www.xyz.com/test.html
}
有什么想法吗?
答案 0 :(得分:7)
如果您不提供自己的缓冲区,InternetCrackUrl将返回指向您作为输入传递的原始字符串中的字符的指针。它不会复制字符串。
因此,lpszHostName将指向第一个字符,dwHostNameLength将为您提供构成主机名的字符数。
答案 1 :(得分:0)
这是预期的行为。 因为当您说www.google.com时,它会转换为http://www.google.com/test.html。 该网址实际上是www.google.com/test.html,这是返回的内容。 为了得到你需要的东西,你需要做一些字符串操作。
您可以使用strrchr函数或std :: string类的find_first_of方法。