I created a wrapper function for others that might run into this solution. A link to Wininet.lib is also required, including wininet.h
bool EscapeURL ( CString& url, DWORD options = ICU_DECODE | ICU_ENCODE_PERCENT ) { DWORD bytes = url.GetLength () + 1; LPTSTR escapedString = new TCHAR[bytes + 1]; escapedString[0] = 0; // First read will generate the correct byte count for the return string // bool result = InternetCanonicalizeUrl ( url.GetBuffer (), escapedString, &bytes, options ); if ( !result ) { // Resize the String // delete [] escapedString; escapedString = new TCHAR[bytes]; escapedString[0] = 0; result = InternetCanonicalizeUrl ( url.GetBuffer (), escapedString, &bytes, options ); } if ( result ) { url = escapedString; delete [] escapedString; // Thanks The Steve } else { // Optional // If the call fails return the message in the url // DWORD errorMessageID = ::GetLastError (); LPSTR messageBuffer = nullptr; size_t size = FormatMessageA ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL); std::string message ( messageBuffer, size ); LocalFree ( messageBuffer ); url = message.c_str (); } return result; }
Using
CString internetUse = "The Internet is %%4 <pr0n>"; EscapeURL ( internetUse ); // internetUse = 0x01538890 "The%20Internet%20is%20%25%254%20%3Cpr0n%3E"
Sparx source share