2009-12-31 2 views
3

Использование VB6. Это не сложно свернуть, но я подумал, был ли там заранее подготовленный?Есть ли доступная библиотека COM для разрешения кодировки URL?

+0

Я еще не нашел его - но есть фрагменты кода, которые делают это. – quamrana

+2

Вы можете посмотреть на API-вызовы UrlEscape и UrlUnescape в файле shlwapi.dll. – Bob77

+1

Роллинг - это ужасная идея. Вы ошибетесь. Используйте библиотеку. –

ответ

4

Подскажите комментарий Боба: Google нашел эту упаковку для UrlEscape в newsgroup post от Karl Peterson.

Private Declare Function UrlEscape Lib "Shlwapi.dll" Alias "UrlEscapeA" (_ 
    ByVal pszURL As String, ByVal pszEscaped As String, ByRef pcchEscaped As Long, _ 
    ByVal dwFlags As Long) As Long 

Private Const URL_DONT_ESCAPE_EXTRA_INFO As Long = &H2000000 

Private Function EscapeURL(ByVal URL As String) As String 
' Purpose: A thin wrapper for the URLEscape API function. ' 
Dim EscTxt As String 
Dim nLen As Long 

' Create a maximum sized buffer. ' 
nLen = Len(URL) * 3 
EscTxt = Space$(nLen) 

If UrlEscape(URL, EscTxt, nLen, URL_DONT_ESCAPE_EXTRA_INFO) = 0 Then 
    EscapeURL = Left$(EscTxt, nLen) 
End If 
End Function 

Отказ от ответственности: Я не пробовал этот код сам.

+0

Мне придется сломать тест, но быстрый тест отлично работает. Спасибо :) –

+0

Эта библиотека не избегает всех символов и все равно приведет к проблемам. Например, если вы сравните вывод с методом .NET Framework «System.Web.HttpUtility.UrlEncode», у вас будут совершенно разные результаты. –

2

Вы должны использовать CoInternetParseUrl(), с URL_ENCODE.

Образец из MSDN, измененный для ваших целей. Конечно, вам нужно будет выяснить, как вызвать CoInternetParseUrl() из VB6, но вы, похоже, на пути к этому.

#include <wininet.h> 

// ... 

WCHAR encoded_url[INTERNET_MAX_URL_LENGTH]; 
DWORD encoded_url_len = ARRAYSIZE(encoded_url); 

// Assumes |url| contains the value you want to encode. 

HRESULT hr = CoInternetParseUrl(url, PARSE_CANONICALIZE, URL_ENCODE, encoded_url, 
         INTERNET_MAX_URL_LENGTH, & encoded_url_len, 0); 
if (SUCCEEDED(hr)) { 
    // Do stuff... 
} 

Вы можете использовать PARSE_ENCODE вместо PARSE_CANONICALIZE, в зависимости от ваших потребностей.

Кроме того, рассмотрите возможность использования google-url. Может быть сложно, так как это C++, а не COM.

+0

Хороший совет. Я бы поднял вас, но мне нужно еще 2 re rofl :) –

+0

Является ли это мошенничеством для меня, чтобы повысить ваш вопрос из-за этого? :) –

+0

Обман слишком силен словом ... Возможно, «Конфликт интересов»;) –