Показать сообщение отдельно
  #3  
Старый 14.02.2014, 10:31
shpion08 shpion08 вне форума
Прохожий
 
Регистрация: 13.02.2014
Сообщения: 2
Версия Delphi: Delphi XE2
Репутация: 10
По умолчанию

Не совсем понял как его применить под Delphi. (там вроде как данные о странице... а мне нужно скачивание файлов в оперативу!! (без сохранения) для разового просмотра указанного файла)
На оф.сайте код C/C++ API / JS.
С++ знаю весьма "хренова"), так что прошу исправить мои ошибки при переделки данного кода с С на Delphi.
Оригинал С++
Оригинал JS(авторизация)
Попытка переделать код:
Код:
uses winhttp_tlb;
...
begin
  DWORD ChooseAuthScheme(DWORD dwSupportedSchemes)
  begin
    if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_NEGOTIATE) then
      return WINHTTP_AUTH_SCHEME_NEGOTIATE
    else if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_NTLM) then
      return WINHTTP_AUTH_SCHEME_NTLM
    else if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_PASSPORT) then
      return WINHTTP_AUTH_SCHEME_PASSPORT
    else if (dwSupportedSchemes and WINHTTP_AUTH_SCHEME_DIGEST) then
      return WINHTTP_AUTH_SCHEME_DIGEST
    else
      return 0;
  end;

  struct SWinHttpSampleGet
  begin
    LPCWSTR szServer;
    LPCWSTR szPath;
    BOOL fUseSSL;
    LPCWSTR szServerUsername;
    LPCWSTR szServerPassword;
    LPCWSTR szProxyUsername;
    LPCWSTR szProxyPassword;
  end;

  void WinHttpAuthSample(IN SWinHttpSampleGet * pGetRequest)
  begin
    DWORD dwStatusCode := 0;
    DWORD dwSupportedSchemes;
    DWORD dwFirstScheme;
    DWORD dwSelectedScheme;
    DWORD dwTarget;
    DWORD dwLastStatus := 0;
    DWORD dwSize := sizeof(DWORD);
    BOOL bResults := FALSE;
    BOOL bDone := FALSE;

    DWORD dwProxyAuthScheme := 0;
    HINTERNET hSession := NULL, hConnect := NULL, hRequest := NULL;

    hSession := WinHttpOpen(L " WinHTTP Example / 1.0 ",
      WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME,
      WINHTTP_NO_PROXY_BYPASS, 0);

    INTERNET_PORT nPort := (pGetRequest - > fUseSSL)
      ? INTERNET_DEFAULT_HTTPS_PORT: INTERNET_DEFAULT_HTTP_PORT;

    if (hSession) then
      hConnect := WinHttpConnect(hSession, pGetRequest - > szServer, nPort, 0);

    if (hConnect) then
      hRequest := WinHttpOpenRequest(hConnect, L " GET ",
        pGetRequest - > szPath, NULL, WINHTTP_NO_REFERER,
        WINHTTP_DEFAULT_ACCEPT_TYPES, (pGetRequest - > fUseSSL)
        ? WINHTTP_FLAG_SECURE: 0);

    if (hRequest = = NULL) then
      bDone := TRUE;
    while not(bDone) do
    begin
      if (dwProxyAuthScheme not = 0)bResults = WinHttpSetCredentials(hRequest,
        WINHTTP_AUTH_TARGET_PROXY, dwProxyAuthScheme,
        pGetRequest - > szProxyUsername, pGetRequest - > szProxyPassword, NULL);

        bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS,
          0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);

      if (bResults) then
        bResults = WinHttpReceiveResponse(hRequest, NULL);

      if (not bResults and GetLastError() = = ERROR_WINHTTP_RESEND_REQUEST) then
        continue;

      if (bResults) then
        bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE or
          WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, NULL);

      if (bResults) then
      begin
        switch(dwStatusCode)
        begin
          case 200: begin printf
            (" The resource was successfully retrieved.\ n ");
            bDone := TRUE;
            break;
            end;

            case 401:
              begin
                printf(" The server requires authentication.Sending
                  credentials .. .\ n ");

                bResults := WinHttpQueryAuthSchemes(hRequest,
                  &dwSupportedSchemes, &dwFirstScheme, &dwTarget);

                if (bResults) then
                begin
                  dwSelectedScheme := ChooseAuthScheme(dwSupportedSchemes);

                  if (dwSelectedScheme = = 0) then
                    bDone := TRUE
                  else
                    bResults := WinHttpSetCredentials(hRequest, dwTarget,
                      dwSelectedScheme, pGetRequest - > szServerUsername,
                      pGetRequest - > szServerPassword, NULL);
                end;

                if (dwLastStatus = = 401) then
                  bDone := TRUE;

                break;
              end;

            case 407: printf(" The proxy requires authentication.Sending
              credentials .. .\ n ");

              bResults = WinHttpQueryAuthSchemes(hRequest, &dwSupportedSchemes,
                &dwFirstScheme, &dwTarget);

              if (bResults) then dwProxyAuthScheme :=
                ChooseAuthScheme(dwSupportedSchemes);

              if (dwLastStatus = = 407) then bDone := TRUE;
              break;

              default:
                printf(" Error.Status code % d returned.\ n ", dwStatusCode);
              bDone := TRUE;
              end;
              end;

              dwLastStatus := dwStatusCode;

              if (not bResults) then bDone := TRUE;
              end;

              if (not bResults) then begin DWORD dwLastError = GetLastError();
              printf(" Error % d has occurred.\ n ", dwLastError);
              end;

              if (hRequest) then WinHttpCloseHandle(hRequest);
              if (hConnect) then WinHttpCloseHandle(hConnect);
              if (hSession) then WinHttpCloseHandle(hSession);

              end;
              end;
Ответить с цитированием