27.03.2007 11:05:11Получение имени получателя Ответов: 5
Волков
Почему компилятор ругается на следующий участок кода:
BYTE* pbCert = NULL;
DWORD pcbCert = 0;
PCCERT_CONTEXT certContext;

CryptGetKeyParam(
hKey,
KP_CERTIFICATE,
NULL,
&pcbCert,
0);
pbCert = (BYTE*)malloc(pcbCert);
CryptGetKeyParam(hKey,
KP_CERTIFICATE,
pbCert,
&pcbCert,
0);

certContext = CertCreateCertificateContext(
MY_ENCODING_TYPE,
pbCert,
pcbCert);

DWORD dataSize;
BYTE* data;
char* tmpString;
DWORD tmpStringSize;
dataSize=CertGetNameString(
certContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
NULL,
0);

tmpString = (char*)malloc(dataSize);
CertGetNameString(
certContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
tmpString,
dataSize);
 
Ответы:
27.03.2007 11:52:37Kirill Sobolev
Надо объявить переменную hKey и константу MY_ENCODING_TYPE.
27.03.2007 12:35:47Волков
весь код вот:
DWORD size=1000;
BYTE result[1000];
DWORD fParam = CRYPT_FIRST;
HCRYPTPROV hCryptProv;
int j=0;

if (!CryptAcquireContextA(
&hCryptProv,
NULL,
NULL,
75,
CRYPT_VERIFYCONTEXT))
{
ShowMessage("Îøèáêà CryptAcquireContext...");
getch();
return 0;
}

while(CryptGetProvParam(
hCryptProv,
PP_ENUMCONTAINERS,
result,
&size,
fParam))
{
fParam = 0;

HCRYPTPROV tmpProv = NULL;
LPCSTR containerName = (LPCSTR)result;

CryptAcquireContextA(
&tmpProv,
containerName,
"",
75,
0);

printf(containerName);
printf(" ");

HCRYPTKEY hKey = NULL;

if (!CryptGetUserKey(tmpProv, AT_KEYEXCHANGE, &hKey))
{
CryptGetUserKey(tmpProv, AT_SIGNATURE, &hKey);
}

BYTE* pbCert = NULL;
DWORD pcbCert = 0;
PCCERT_CONTEXT certContext;

CryptGetKeyParam(
hKey,
KP_CERTIFICATE,
NULL,
&pcbCert,
0);
pbCert = (BYTE*)malloc(pcbCert);
CryptGetKeyParam(hKey,
KP_CERTIFICATE,
pbCert,
&pcbCert,
0);

certContext = CertCreateCertificateContext(
MY_ENCODING_TYPE,
pbCert,
pcbCert);

DWORD dataSize;
BYTE* data;
char* tmpString;
DWORD tmpStringSize;

//Èìÿ Ïîëó÷àòåëÿ
dataSize=CertGetNameString(
certContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
NULL,
0);

tmpString = (char*)malloc(dataSize);
CertGetNameString(
certContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
tmpString,
dataSize);

printf(tmpString);
printf("\n");
j++;
free(pbCert);
free(data);
free(tmpString);
}
return 0;
27.03.2007 12:45:16Kirill Sobolev
Все равно неясно что такое ShowMessage() и MY_ENCODING_TYPE.
27.03.2007 12:53:46Волков
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

ShowMessage показывает окно с сообщением.
Данный код компилируется, ошибка появляется при выполнении программы. Ошибка Access violation.
27.03.2007 13:48:45Kirill Sobolev
Ну так Вы для data память нигде не выделяете, а освободить в конце пытаетесь.
Лучше писать BYTE* data = NULL, free(NULL) работает правильно.