Използвайте WinInet::InternetSetOption() винаги връща false и GetLastError() връща 12018

Искам да позволя на IWebBrowser на ie да не е необходимо да избира сертификата, така че използвам InternetSetOption(), за да направя това. Кодът е:

HCERTSTORE hMyStore = CertOpenSystemStore(0, _T("MY");
PCCERT_CONTEXT pDesiredCert = NULL;
pDesiredCert=CertFindCertificateInStore( 
    hMyStore, 
    X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
    CERT_FIND_SUBJECT_STR,
    L"cnstr",
    NULL);

if (InternetSetOption (NULL, INTERNET_OPTION_CLIENT_CERT_CONTEXT, 
        (LPVOID)pDesiredCert, sizeof(CERT_CONTEXT)) == FALSE) { 
    DOWRD i = GetLastError(); 
} 
...

Получавам сертификата в магазин "МОЯТ". Когато използвам InternetSetOption() за настройка на сертификата, той връща false, кодът на грешката е 12018. Потърсих малко информация за този код на грешка:

"12018 ERROR_INTERNET_INCORRECT_HANDLE_TYPE Типът предоставен манипулатор е неправилен за тази операция."

Искам да задам глобалната настройка, така че задам NULL на първия параметър, първият параметър във функцията InternetSetOption() не може ли да бъде NULL? И как мога да настроя правилно опцията?


person lvshuchengyin    schedule 07.01.2014    source източник
comment
Защо c# е маркиран? На какъв език е това? Ако c++ премахнете c# от етикета   -  person Sriram Sakthivel    schedule 07.01.2014
comment
Съжалявам, защото мисля, че C# използва някои API. Премахнах това.   -  person lvshuchengyin    schedule 07.01.2014
comment
Не можете да използвате манипулатор NULL и IE не излага манипулатора HINTERNET, който използва. Това разбира се обрича този подход. Бъдете напред, като търсите в Google инсталационни сертификати за Internet Explorer.   -  person Hans Passant    schedule 07.01.2014


Отговори (2)


Както вече казахте, не можете да използвате опцията NULL за INTERNET_OPTION_CLIENT_CERT_CONTEXT. Въпреки че някои опции могат да притежават стойностNULL, като INTERNET_OPTION_CONNECT_RETRIES или INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, това не може.

Флагове за опции

Трябва да използвате валиден HINTERNET, като използвате InternetOpen() или InternetConnect(). Връзката по-долу ще ви насочи за валиден HINTERNET в раздела „Обхват на HINTERNET Handle“.

Задаване и извличане на интернет опции

И трябва да проверите стойностите hMyStore и pDesiredCert дали те също са NULL.

**РЕДАКТИРАНЕ : **

Не можете да получите HINTERNET с помощта на IWebBrowser2. Той просто разкрива методите и свойството на контрола WebBrowser. Така че трябва да използвате InternetConnect().

Например клиентските приложения, които изискват прокси с удостоверяване, вероятно не изискват задаване на потребителско име и парола на прокси всеки път, когато приложението се опитва да получи достъп до интернет ресурс. Ако всички заявки за дадена връзка се обработват от един и същ прокси сървър, задаването на потребителското име и паролата на прокси за тип HINTERNET манипулатор, тоест манипулатор, създаден от извикване към InternetConnect, ще позволи на всички повиквания, получени от този HINTERNET манипулатор, да използвайте едно и също прокси потребителско име и парола. Задаването на потребителско име и парола на прокси сървъра всеки път, когато HINTERNET манипулатор се създава от HttpOpenRequest, би изисквало допълнително и ненужно натоварване. Имайте предвид, че ако приложението използва прокси, което изисква удостоверяване, то трябва да задава идентификационните данни на проксито при всяка нова връзка.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa385384(v=vs.85).aspx

Също така написах полезна справочна връзка за това как да използвате InternetConnect().

C++ WinHTTP InternetReadFile не извлича целия източник

SSL с WinHTTP

person hyun    schedule 07.01.2014
comment
Благодаря, помага ми! Мога да получа контролата IWebBrowser2, как мога да направя в тази ситуация? - person lvshuchengyin; 08.01.2014
comment
@lvshuchengyin Редактирах отговора си. Надявам се, че това ще ви помогне малко. Благодаря за коментара. - person hyun; 08.01.2014
comment
InternetConnect() не работи. Само HINTERNET на HttpOpenRequest може да бъде зададен INTERNET_OPTION_CLIENT_CERT_CONTEXT, но това може да засегне IWebBrowser2. Но благодаря за отговора! - person lvshuchengyin; 08.01.2014
comment

Резултатът ми е [1, 2, 2, 4, 3], не е правилен. Трябва да е [1, 2, 2, 3, 4]. Но не мога да намеря грешката в моя код. Може ли някой да ми помогне да открия грешката на алгоритъма? Благодаря ти. Целият ми код е копиран по-долу. Може да се приложи.

Въпрос:

Даден е масив от n обекта с k различни цвята (номерирани от 1 до k), сортирайте ги така, че обекти от един и същи цвят да са съседни, като цветовете са в реда 1, 2, ... k.

Пример: При дадени цветове=[3, 2, 2, 1, 4], k=4, вашият код трябва да сортира цветовете на място до [1, 2, 2, 3, 4].

Изисквания: Доста ясно решение е алгоритъм с две преминавания, използващ сортиране с броене. Това ще струва O(k) допълнителна памет. Можете ли да го направите, без да използвате допълнителна памет?

import java.util.Arrays;

public class SortColorsII {
   public static void sortColors2(int[] colors, int k) {  
    int count = 0;  
    int start = 0;  
    int end = colors.length-1;  
    while (count <= k) {  
        int min = Integer.MAX_VALUE;  
        int max = Integer.MIN_VALUE;  

        for (int i = start; i < end; i++) {  
            min = Math.min(min, colors[i]);  
            max = Math.max(max, colors[i]);  
        }  
        int left = start;  
        int right = end;  
        int cur = left;  
        while(cur <= right) {  
            if (colors[cur] == min) {  
                swap(left, cur, colors);  
                cur++;  
                left++;  
            } else if(colors[cur] == max) {  
                swap(cur, right, colors);  
                right--;  
            } else {  
                cur++; 
            }  
        }  
        count += 2;  
        start = left;  
        end = right;  
    }  
}  

private static void swap(int left, int right, int[] colors) {  
    int tmp = colors[left];  
    colors[left] = colors[right];  
    colors[right] = tmp;  
} 
   public static void main(String[] args){
    int[] colors = new int[]{3, 2, 2, 1, 4};
    int k = 4;
    sortColors2(colors,  k);
    String res = Arrays.toString(colors);
    System.out.println(res);
   }
}
- person lvshuchengyin; 14.01.2014

Вярвам, че приложеният отговор е правилен. Въпреки че съществува друг проблем, който се разкрива по подобен начин.
Можете да получите грешка "INCORRECT_HANDLE_TYPE", ако константата INTERNET_OPTION_CLIENT_CERT_CONTEXT е дефинирана неправилно. В този случай просто ще преминете грешната опция. Правилната стойност е 84 (dec) в WinInet

#define INTERNET_OPTION_CLIENT_CERT_CONTEXT 84

съответната константа в WinHttp трябва да бъде

#define WINHTTP_OPTION_CLIENT_CERT_CONTEXT 47

Не ги смесвайте. Бъдете внимателни и приятно прекарване на кодирането!

person naXa    schedule 16.03.2014