2009-05-29 24 views

答えて

7
+0

クイックソリューション、素敵なwininet.h含む必要です。私はソースコードを投稿しようとしていたが、これはちょうどフィンを行うだろう! – toto

+0

CStringを直接受け取ったり返したりすることはありませんが、前後に変換するのは簡単です。 –

+0

注 - 機能はデコードすることもできますが、注意事項を注意深く読んでください。 – Spike0xff

0

私は、このソリューションに遭遇する可能性があり、他のラッパー関数を作成しました。またWininet.libにリンクして

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; 
    } 

使用

CString internetUse = "The Internet is %%4 <pr0n>"; 

    EscapeURL (internetUse); 

    // internetUse = 0x01538890 "The%20Internet%20is%20%25%254%20%3Cpr0n%3E" 
+0

メモリがリークしています。 escapedStringはコピーされますが、決して削除されません。 – TheSteve

関連する問題