14.02.2005 15:20:42проблема с CertSelectCertificate Ответов: 3
Dilmar
Уважаемые специалисты, подскажите пожалуйста в чем проблема:
есть следуюший код
//Глобальные переменные
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 такая же ошибка.
Спасибо


 
Ответы:
14.02.2005 17:35:59Kirill Sobolev
Попробуйте перед инициализацией css сделать
memset(&css, 0, sizeof(CERT_SELECT_STRUCT));
css.dwSize = sizeof(CERT_SELECT_STRUCT);
09.04.2006 7:12:53Artyom
Обязательно необходимо инициализировать css.arrayCertContext, хотя бы, например, так:
css.cCertContext = 0;
сss.arrayCertContext = new PCCERT_CONTEXT[1];
Т.к. функция потом будет в этот массив выкладывать выбранный/ные сертификаты. Тогда будет работать. Хотя странная такая вещь, когда линкую с /MTd вылетает исключение при вызове CertSelectCertificate, когда с /MT всё в порядке. Глючная какая-то вообщем функция. CryptUIDlgSelectCertificate в cryptui.dll оказалась надёжнее, только доступна, начиная с XP.
Кстати, подскажите, какую можно использовать функцию под Win2000 аналогичную CertSelectCertificate, а также диалог выбора хранилища? (в cryptui.dll есть некая недокументированная CryptUIDlgSelectStore, которая, похоже подошла бы, только не описана нигде) Есть ли вообще функции вызова диалога выбора хранилища есть существующих в системе?
11.04.2006 11:02:12Kirill Sobolev
ответил почтой