Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

API WinInet - Отказано в доступе и др ошибки...

8.3K
18 марта 2011 года
Eddie P.
8 / / 14.02.2005
Здравствуйте Товарищи!..

Проблема: При запуске последовательно нажимаю кнопки 0, 1, 2, 3 (приведены ниже), в процессе нажатия в журнале (Журнал_1) пишется результат по каждой кнопке, метод POST и GET проходят (обрабатываются успешно - GET - Отправка, POST - получение), В СЛУЧАЕ ЕСЛИ использую InternetErrorDlg, в ином случае пишет "Получено непредвиденное сообщение или оно имеет неправильный формат" (Думаю, это из-за того, что при InternetSetOption - происходят ошибки, но из-за чего понять не могу), Подскажите пожалуйста, кто знает в чём проблема?

Ps0: В Гугле ответ найти не получилось...
Ps1: Ниже приведён журнал соединений программы (Журнал_1)...
Ps2: Даже пытался последовательно по каждой функции WinInet шагать по msdn.microsoft.com, Результат тот же - отрицательный...
Ps3: Ребят Подскажите, что это за "Отказано в доступе" (Быть может в самой Винде Запрет какой стоит?), "Область данных, переданная по системному вызову, слишком мала" (А тут Шут Его знает...)
Ps4: Замечено что в Windows7 - InternetConnect иногда пишет GetLastError() = 0, а иногда GetLastError() = 5 (Зависимость не ясна), на XP Всегда = 5...


Журнал_1::
-
0. Кнопка "Get Sertificat"
-
• Успешная загрузка сертификата, версия: 2

1. Кнопка "Open & Connect"
-
• InternetConnect, err > 0 - [5]::Отказано в доступе.


2. Кнопка "HttpOpenRequest"
-
• HttpOpenRequest[Error > 0]:: - [122]::Область данных, переданная по системному вызову, слишком мала.
• HttpOpenRequest - OK...[122]::Область данных, переданная по системному вызову, слишком мала.
• InternetSetOption = [5]::Отказано в доступе.


3. Кнопка "HttpSendRequest"
-
• HttpSendRequest - [12044]::Для проверки подлинности клиента требуется сертификат
• InternetSetOption [iSert] = [87]::Параметр задан неверно.
• Нужен сертификат? Получай!!, Погнали к q1;[5]::Отказано в доступе.
• HttpSendRequest = FALSE;[2148074278]::Получено непредвиденное сообщение или оно имеет неправильный формат.

-----==== ДЕЙСТВИЯ ====-----

Кнопка "Get Sertificat"
Код:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
   String     CertStore = cb1->Text.UpperCase(), Subject = cb2->Text;
   PChar      stor;
   HCERTSTORE store;
   DWORD      encType, iSertOptions;
   PWideChar  subj;
   HCRYPTPROV prov;
   encType = PKCS_7_ASN_ENCODING || X509_ASN_ENCODING;
   stor = StrAlloc(CertStore.Length() + 1);
   StrPCopy(stor, CertStore);
   store = CertOpenSystemStore(prov, CertStore.c_str());
   StrDispose(stor);
   if(store == NULL)
     {
      ShowMessage("• CertOpenSystemStore::Error");
      return;
     }
   subj = (PWideChar)HeapAlloc(HeapCreate(HEAP_NO_SERIALIZE,9,9),HEAP_ZERO_MEMORY,9);
   StringToWideChar(Subject, subj, 2 * Subject.Length() + 1);
   iSert = NULL;
   iSert = CertEnumCertificatesInStore(store, iSert);
   if(GetLastError()>0) Memo1->Lines->Add("CertFindCertificateInStore::Error [" + String(GetLastError())  + "] - " + GetTextError(GetLastError()));
   if(iSert == NULL)
     {
      //Memo1->Lines->Add("CertFindCertificateInStore::NULL");
      Memo1->Lines->Add("Ошибка, Сертификат Вероятно не найден...");
      return;
     }
   else
     {
      Memo1->Lines->Add("• Успешная загрузка сертификата - " + String(Subject) + ", версия: " + String(iSert->pCertInfo->dwVersion));
     }
   BitBtn1->Enabled = false;
   BitBtn2->Enabled = true;
}


Кнопка "Open & Connect"
Код:
void __fastcall TForm1::BitBtn5Click(TObject *Sender)
{
   String fHost, url;
   INTERNET_PORT fPort;
 
   url      = cb_host->Text + cb_script->Text;
   fHost    = GetHostName(url);

               //Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; InfoPath.1)
   hInternet = InternetOpen("Mozilla", //"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.2914)",
                            INTERNET_OPEN_TYPE_PRECONFIG,
                            NULL,
                            NULL,
                            0);
                            //INTERNET_FLAG_ASYNC || INTERNET_FLAG_FROM_CACHE || INTERNET_FLAG_OFFLINE
   if(GetLastError()>0) Memo1->Lines->Add("• InternetOpen::Error #" + String(GetLastError()));
   if(hInternet)
     {
      Memo1->Lines->Add("• InternetOpen - OK..." + String(GetLastError()));
     }
   else
      Memo1->Lines->Add("• InternetOpen - Error..." + String(GetLastError()));
   if(cb_port->ItemIndex == 0) fPort = INTERNET_DEFAULT_HTTPS_PORT;
   else if(cb_port->ItemIndex == 1) fPort = INTERNET_DEFAULT_HTTP_PORT;
   else fPort = (WORD)cb_port->Text.ToInt();

   hConnect = InternetConnect(hInternet,fHost.c_str(),fPort, NULL,NULL,INTERNET_SERVICE_HTTP,0,1);

   if(GetLastError()>0)  
     {
      Memo1->Lines->Add("• InternetConnect, err > 0  - " + GetTextError(GetLastError()));
      //Memo1->Lines->Add("InternetConnect::Text:: " + GetTextError(GetLastError()));
     }
   if(hConnect)
     {
      Memo1->Lines->Add("• InternetConnect - OK..." + String(GetLastError()));
     }
   else
     {
      Memo1->Lines->Add("• InternetConnect - Error..." + String(GetLastError()));
     }
}


Кнопка "HttpOpenRequest"
Код:
void __fastcall TForm1::BitBtn7Click(TObject *Sender)
{
   String       fmethod, fScript, url, fHost;
   Cardinal     Flags_connection,Flags_Request,flags_security;
   url      = cb_host->Text + cb_script->Text;
   fHost    = GetHostName(url);
   fScript  = GetScriptName(url,fHost);
   fmethod  = cb_method->Text.Trim().UpperCase();
   int ierr = 0;
   Form1->SetFlags(url,Flags_connection,Flags_Request);

   hRequest = HttpOpenRequest(hConnect,
                              fmethod.c_str(), // TEXT("GET")  POST
                              fScript.c_str(),
                              NULL,
                              NULL,
                              0,
                              Flags_Request,
INTERNET_FLAG_NO_CACHE_WRITE || INTERNET_FLAG_SECURE || INTERNET_FLAG_PRAGMA_NOCACHE || INTERNET_FLAG_KEEP_CONNECTION,
                              0);
   ierr = GetLastError();
   if (ierr == ERROR_INTERNET_INVALID_CA)  ShowMessage("ERROR_INTERNET_INVALID_CA!!!!!!!");
                                                                               
   if(ierr>0) Memo1->Lines->Add("• HttpOpenRequest[Error > 0]:: - " + GetTextError(ierr));
   if(hRequest)
     {
      Memo1->Lines->Add("• HttpOpenRequest - OK..." + GetTextError(ierr));
            DWORD dwSeqFlags = 0;
            DWORD dwBuffLen = sizeof(dwSeqFlags);
            InternetQueryOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwSeqFlags, &dwBuffLen);

            dwSeqFlags = SECURITY_FLAG_IGNORE_UNKNOWN_CA |
                         INTERNET_FLAG_IGNORE_CERT_CN_INVALID  |
                         SECURITY_FLAG_FORTEZZA |
                         SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP |
                         SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS |
                         INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
            InternetSetOption (hRequest, INTERNET_OPTION_SECURITY_FLAGS, &dwSeqFlags, sizeof (dwSeqFlags) );
            Memo1->Lines->Add("• InternetSetOption = " + GetTextError(GetLastError()));
 
     }
   else
     {
      Memo1->Lines->Add("• HttpOpenRequest - FALSE..." + GetTextError(ierr));
     }
}


Кнопка "HttpSendRequest"
Код:
void __fastcall TForm1::BitBtn8Click(TObject *Sender)
{
   unsigned long dwBytesRead=0, L=0;
   char cBuffer[1024];
   int iErr = 0;
   AnsiString   fmethod, fScript, url, fHost, iHeader;
   url      = cb_host->Text + cb_script->Text;
   fHost    = GetHostName(url);
   fScript  = GetScriptName(url,fHost);

   iHeader = "Content-Type:*/*" + String(char(13)) + String(char(10)) +
             "Accept: text/xml" + String(char(13)) + String(char(10)) +
             "Content-Length: " + String(fScript.Length());
 
q1:
   bool e = HttpSendRequest(hRequest, iHeader.c_str(), iHeader.Length(), fScript.c_str(),fScript.Length());
   iErr = GetLastError();

   if((iErr == 12044))
     {
      Memo1->Lines->Add("• HttpSendRequest - " + GetTextError(iErr));
                if(RadioButton2->Checked == true)
                  {
                       DWORD dwCert = 0;
              sizeof(PCCERT_CONTEXT)   sizeof(iSert)
                       InternetSetOption(hRequest, INTERNET_OPTION_SECURITY_SELECT_CLIENT_CERT, &iSert, sizeof(iSert));

                       Memo1->Lines->Add("• InternetSetOption [iSert] = " + GetTextError(GetLastError()));
                       Memo1->Lines->Add("• Нужен сертификат? Получай!!, Погнали к q1;" + GetTextError(GetLastError()));
                       goto q1;
                  }
                if(RadioButton1->Checked == true)
                  {
                   if( InternetErrorDlg( GetDesktopWindow(),
                             hRequest,
                             ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED,
                             FLAGS_ERROR_UI_FILTER_FOR_ERRORS       ||
                             FLAGS_ERROR_UI_FLAGS_GENERATE_DATA     ||
                             FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
                             NULL) == ERROR_SUCCESS ) goto q1;
      }           }
   if(e == true)
     {
      Memo1->Lines->Add("• HttpSendRequest = TRUE;" + GetTextError(iErr));
      if(InternetReadFile(hRequest,(LPSTR)cBuffer,(DWORD)1024,&dwBytesRead))
         Memo1->Lines->Add("• Читаем...");
      Form1->Memo1->Lines->Add("dwBytesRead::" + String(dwBytesRead));
      Form1->Memo1->Lines->Add(cBuffer);
     }
   else Memo1->Lines->Add("• HttpSendRequest = FALSE;" + GetTextError(iErr));
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог