kapiaba Posted November 29, 2018 Report Share Posted November 29, 2018 http://forums.fivetechsupport.com/viewtopic.php?f=6&t=35045&p=208513&hilit=Firmar#p208513 #include "fivewin.ch" FUNCTION main() MsgInfo( "Seleccionado certificado: " + ToTxt( SELCERT() ), "CryptoApi" ) RETURN NIL //***************************************************************************** //***************************************************************************** FUNCTION ToTxt( uVal ) LOCAL cType := ValType( uVal ) DO CASE CASE cType == "C" .OR. cType == "M" RETURN uVal CASE cType == "D" RETURN DToC( uVal ) CASE cType == "L" RETURN IF( uVal, ".T.", ".F." ) CASE cType == "N" RETURN AllTrim( Str( uVal ) ) CASE cType == "B" RETURN "{|| ... }" CASE cType == "A" RETURN "{ ... }" CASE cType == "O" RETURN IF( __ObjHasData( uVal, "cClassName" ), uVal:cClassName, uVal:ClassName() ) CASE cType == "H" RETURN "{=>}" OTHERWISE RETURN "" ENDCASE RETURN nil //***************************************************************************** //***************************************************************************** #pragma BEGINDUMP #include <windows.h> //#include <psapi.h> //#include <hbapi.h> //#include <hbapierr.h> //#include <hbapiitm.h> //#include <wincrypt.h> #define CRYPTUI_SELECT_LOCATION_COLUMN 0x000000010 //Definir el prototipo de las funciones: typedef HCERTSTORE (WINAPI * PTYPECERTOPEN) (HCRYPTPROV, LPTSTR); typedef PCCERT_CONTEXT (WINAPI * PTYPECERTSELECTDLG) (HCERTSTORE, HWND, LPCWSTR, LPCWSTR, DWORD, DWORD, void*); typedef PCCERT_CONTEXT (WINAPI * PTYPECERTENUM) (HCERTSTORE, PCCERT_CONTEXT); typedef DWORD (WINAPI * PTYPECERTGETNAME) (PCCERT_CONTEXT, DWORD, DWORD, VOID*, LPTSTR, DWORD); typedef DWORD (WINAPI * PTYPECERTNAMETOSTR) (DWORD, PCERT_NAME_BLOB, DWORD, LPTSTR, DWORD); typedef BOOL (WINAPI * PTYPECERTFREECC) (PCCERT_CONTEXT); typedef BOOL (WINAPI * PTYPECERTCLOSESTORE) (HCERTSTORE, DWORD); HB_FUNC(SELCERT) { // Hay varios ejemplos en: https://msdn.microsoft.com/en-us/librar ... 61(v=vs.85).aspx HCERTSTORE hStore; PCCERT_CONTEXT PrevContext, CurContext; PCHAR sNombre; DWORD cbSize; PHB_ITEM pArray; PHB_ITEM pItem; PCCERT_CONTEXT pCertContext; // Cargamos las librerías de las que queremos la dirección de las funciones. HMODULE HCrypt = LoadLibrary("Crypt32.dll"); HMODULE HCrypt2 = LoadLibrary("Cryptui.dll"); // Declaramos el tipo de puntero a la función, tenemos la definición arriba. PTYPECERTOPEN pCertOpen; PTYPECERTSELECTDLG pCertSelectDlg; PTYPECERTGETNAME pCertGetName; PTYPECERTNAMETOSTR pCertNameToStr; PTYPECERTFREECC pCertFreeCC; PTYPECERTCLOSESTORE pCertCloseStore; if (HCrypt != NULL && HCrypt2 != NULL){ //Sacamos el puntero todas las funciones que vamos a usar mediante GetProcAddress: #ifdef UNICODE pCertOpen = (PTYPECERTOPEN) GetProcAddress(HCrypt, "CertOpenSystemStoreW"); pCertGetName = (PTYPECERTGETNAME) GetProcAddress(HCrypt, "CertGetNameStringW"); #else pCertOpen = (PTYPECERTOPEN) GetProcAddress(HCrypt, "CertOpenSystemStoreA"); pCertGetName = (PTYPECERTGETNAME) GetProcAddress(HCrypt, "CertGetNameStringA"); #endif pCertSelectDlg = (PTYPECERTSELECTDLG) GetProcAddress(HCrypt2, "CryptUIDlgSelectCertificateFromStore"); pCertFreeCC = (PTYPECERTFREECC) GetProcAddress(HCrypt, "CertFreeCertificateContext"); pCertCloseStore = (PTYPECERTCLOSESTORE) GetProcAddress(HCrypt, "CertCloseStore"); } if (pCertOpen){ // Llamada a CertOpenSystemStore: hStore = pCertOpen(NULL, TEXT("MY")); } if (hStore){ // Diálogo de selección de certificado: pCertContext = pCertSelectDlg(hStore, NULL, NULL, NULL, CRYPTUI_SELECT_LOCATION_COLUMN, 0, NULL); if (pCertContext){ cbSize = pCertGetName(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, NULL, 0); if (cbSize>0) { //Reservamos la memoria que necesitamos para el texto que recibiremos sNombre = (LPTSTR)malloc(cbSize * sizeof(TCHAR)); pCertGetName(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, sNombre, cbSize); // Llamada a CertFreeCertificateContext: pCertFreeCC(pCertContext); } } // Cerrar el almacen de certificados: // Llamada a CertCloseStore: pCertCloseStore(hStore, 0); } FreeLibrary(HCrypt); FreeLibrary(HCrypt2); hb_retc(sNombre); } #pragma ENDDUMP Quote Link to comment Share on other sites More sharing options...
oribeiro Posted May 21, 2019 Report Share Posted May 21, 2019 Como faço para selecionar um certificado digital e trazer para o sistema o nome e a senha dele? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 21, 2019 Author Report Share Posted May 21, 2019 Usas a FlexDocs? Quote Link to comment Share on other sites More sharing options...
oribeiro Posted May 21, 2019 Report Share Posted May 21, 2019 Não. Uso o ACBr Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.