API WinInet - Отказано в доступе и др ошибки...
Проблема: При запуске последовательно нажимаю кнопки 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;
}
{
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()));
}
}
{
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));
}
}
{
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));
}
{
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));
}