| ||||
| ||||
Уважаемые специалисты, подскажите пожалуйста в чем проблема: есть следуюший код //Глобальные переменные typedef BOOL (* __stdcall TSelectCertFunc) (PCERT_SELECT_STRUCT); TSelectCertFunc SelectCert; CERT_SELECT_STRUCT css; HCERTSTORE CertArray[1]; //в функции hinstLib = LoadLibrary(TEXT(cryptdlg")); if (hinstLib != NULL) { SelectCert = (TSelectCertFunc) GetProcAddress(hinstLib, TEXT("CertSelectCertificateA")); if (NULL == SelectCert) { return false; } css.dwSize=sizeof(CERT_SELECT_STRUCT); css.cCertStore=1; } else return false; if ( !( hCertStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"my"))) { DisplayError(); return false; } CertArray[0]=hCertStore; css.arrayCertStore=CertArray; css.szTitle="Select one"; css.hprov=hCryptProv; (SelectCert)(&css); и тут он говорит что access violation in cryptdlg.dll read of address 00000000 если установить css.cCertStore=0 тогда окно появляется но после возврашения из функции вылетает ошибка сохранения ESP мол функция вызвана с помошью неверной конвенции. Пробовал и cdecl такая же ошибка. Спасибо | ||||
Ответы: | ||||
| ||||
Попробуйте перед инициализацией css сделать memset(&css, 0, sizeof(CERT_SELECT_STRUCT)); css.dwSize = sizeof(CERT_SELECT_STRUCT); | ||||
| ||||
Обязательно необходимо инициализировать css.arrayCertContext, хотя бы, например, так: css.cCertContext = 0; сss.arrayCertContext = new PCCERT_CONTEXT[1]; Т.к. функция потом будет в этот массив выкладывать выбранный/ные сертификаты. Тогда будет работать. Хотя странная такая вещь, когда линкую с /MTd вылетает исключение при вызове CertSelectCertificate, когда с /MT всё в порядке. Глючная какая-то вообщем функция. CryptUIDlgSelectCertificate в cryptui.dll оказалась надёжнее, только доступна, начиная с XP. Кстати, подскажите, какую можно использовать функцию под Win2000 аналогичную CertSelectCertificate, а также диалог выбора хранилища? (в cryptui.dll есть некая недокументированная CryptUIDlgSelectStore, которая, похоже подошла бы, только не описана нигде) Есть ли вообще функции вызова диалога выбора хранилища есть существующих в системе? | ||||
| ||||
ответил почтой | ||||