블로그 이미지
랜달프

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Notice

    2008. 12. 10. 15:52 Programming/VC++(API,MFC,WTL,ATL)

    MFC를 사용한다면 AfxParseURL 이나 AfxParseURLEx 함수를 사용하면된다.

    API에서는 InternetCrackUrl 함수를 사용한다.

    BOOL InternetCrackUrl(
      LPCTSTR lpszUrl,
      DWORD dwUrlLength,
      DWORD dwFlags,
      LPURL_COMPONENTS lpUrlComponents
    );

    typedef struct {
     DWORD dwStructSize;
     LPTSTR lpszScheme;
     DWORD dwSchemeLength;
     INTERNET_SCHEME nScheme;
     LPTSTR lpszHostName;
     DWORD dwHostNameLength;
     INTERNET_PORT nPort;
     LPTSTR lpszUserName;
     DWORD dwUserNameLength;
     LPTSTR lpszPassword;
     DWORD dwPasswordLength;
     LPTSTR lpszUrlPath;
     DWORD dwUrlPathLength;
     LPTSTR lpszExtraInfo;
     DWORD dwExtraInfoLength;
    } URL_COMPONENTS, *LPURL_COMPONENTS;

     

    URL_COMPONENTS 에서 문자열포인터와 문자열길이 멤버의 사용은

    문자열포인터와 문자열길이가 모두 0이면 해당 멤버값은 사용하지 않는다.

    문자열포인터가 NULL 이고 문자열길이가 0이 아니면 문자열포인터에는 lpszUrl 에서 해당되는 포인터가 담기고 문자열길이에는 길이가 담긴다.

    문자열포인터와 문자열길이가 모두 0이 아니면 해당하는 값을 문자열포인터에 복사하고 문자열길이에는 구한 문자열의 길이가 담긴다.

     

     URL_COMPONENTS urlComponents;
     memset(&urlComponents, 0, sizeof(URL_COMPONENTS));
     urlComponents.dwStructSize = sizeof(URL_COMPONENTS);

     

     urlComponents.dwSchemeLength = INTERNET_MAX_SCHEME_LENGTH;
     urlComponents.lpszScheme = new TCHAR[INTERNET_MAX_SCHEME_LENGTH + 1];
     urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH;
     urlComponents.lpszHostName = new TCHAR[INTERNET_MAX_HOST_NAME_LENGTH + 1];
     urlComponents.dwUrlPathLength = INTERNET_MAX_PATH_LENGTH;
     urlComponents.lpszUrlPath = new TCHAR[INTERNET_MAX_PATH_LENGTH + 1];
     urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH;
     urlComponents.lpszUserName = new TCHAR[INTERNET_MAX_USER_NAME_LENGTH + 1];
     urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH;
     urlComponents.lpszPassword = new TCHAR[INTERNET_MAX_PASSWORD_LENGTH + 1];
     urlComponents.dwExtraInfoLength = INTERNET_MAX_PATH_LENGTH;
     urlComponents.lpszExtraInfo = new TCHAR[INTERNET_MAX_PATH_LENGTH + 1];

     

     InternetCrackUrl(lpszUrl, 0, 0, &urlComponents);

     

    함수사용은 위와 같은 예제로 사용하면된다.

    여기서 lpszExtraInfo 에는 '?'로 시작되는 옵션 문자열이 구해지는데 dwExtraInfoLength 와 lpszExtraInfo 를 0으로 하여 사용하지 않으면 lpszUrlPath에 옵션문자열까지 포함되고 dwExtraInfoLength를 0이 아닌 값으로 하여 구하면 lpszUrlPath에는 '?' 이전까지 그리고

    lpszExtraInfo에는 '?'를 포함한 이후의 문자열이 구해진다.

    그리고 InternetCrackUrl 함수가 호출되면 각 길이변수에는 실제로 구한 문자열의 길이가 들어간다.

    posted by 랜달프