| ||||
| ||||
Почему компилятор ругается на следующий участок кода: 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); | ||||
Ответы: | ||||
| ||||
Надо объявить переменную hKey и константу MY_ENCODING_TYPE. | ||||
| ||||
весь код вот: 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; | ||||
| ||||
Все равно неясно что такое ShowMessage() и MY_ENCODING_TYPE. | ||||
| ||||
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) ShowMessage показывает окно с сообщением. Данный код компилируется, ошибка появляется при выполнении программы. Ошибка Access violation. | ||||
| ||||
Ну так Вы для data память нигде не выделяете, а освободить в конце пытаетесь. Лучше писать BYTE* data = NULL, free(NULL) работает правильно. | ||||