Oj poprawiłem już na unsigend.
Ten sam kod funkcji wykonałem jako funkcja bez parametrów i działa (wyniki wyświetlam na konsoli).
Kod funkcji
extern "C" SMARTCARDLIB_API int __stdcall pobierz_UID_Karty_MIFARE(unsigned char *uid);
#include "stdafx.h"
#include <sstream>
#include <stdlib.h>
#include <Math.h>
#include <string>
#include <strsafe.h>
#include "SmartCardLib.h"
#include "winscard.h"
#include "pcsc.h"
#include "util.h"
#include "ClassCardType.h"
#pragma comment(lib, "Winscard.lib")
SMARTCARDLIB_API int __stdcall pobierz_UID_Karty_MIFARE(unsigned char *uid)
{
printf("Jestesmy w funkcji... \n");
// Get Data: CLA = 0xFF, INS = 0xCA, P1 = 0x00, P2 = 0x00, Le = 0x00
BYTE baCmdApduGetData[] = { 0xFF, 0xCA, 0x00, 0x00, 0x00};
BYTE baResponseApdu[300];
DWORD lResponseApduLen = 0;
BYTE atr[40];
INT atrLength;
LONG lRetValue;
// PCSC_Connect - true - szukamy czytnika bezstykowego = -CL czyli contact less
lRetValue = PCSC_Connect(NULL, TRUE );
PCSC_EXIT_ON_ERROR(lRetValue);
lRetValue = PCSC_WaitForCardPresent();
if (lRetValue == 0x02)
{
//PCSC_Disconnect();
return -1 ;// błąd
}
PCSC_EXIT_ON_ERROR(lRetValue);
lRetValue = PCSC_ActivateCard();
PCSC_EXIT_ON_ERROR(lRetValue);
lRetValue = PCSC_GetAtrString(atr, &atrLength);
PCSC_EXIT_ON_ERROR(lRetValue);
PCSC_Exchange(baCmdApduGetData,(DWORD)sizeof(baCmdApduGetData),baResponseApdu, &lResponseApduLen);
PCSC_EXIT_ON_ERROR(lRetValue);
if( baResponseApdu[lResponseApduLen - 2] == 0x90 &&
baResponseApdu[lResponseApduLen - 1] == 0x00)
{
if( getClessCardType(atr) == Mifare1K)
{
//printf("Card Type: MIFARE Classic 1k");
}
else if( getClessCardType(atr) == Mifare4K)
{
//printf("Card Type: MIFARE Classic 4k");
}
else if( getClessCardType(atr) == MifareUL)
{
//printf("Card Type: MIFARE Ultralight");
}
}
//lRetValue = PCSC_WaitForCardRemoval();
PCSC_Disconnect();
printf("%i\n", lResponseApduLen);
int j = 0;
for(unsigned int i = 0; i < lResponseApduLen; i++, j += 2)
{
sprintf_s((char*)(uid + j), 2,"%02X", baResponseApdu[i]);
}
uid[j] = '\0';
return 0;
}
Nie wyświetla mi nawet tego tekstu na konsoli,ze jestesmy w funkcji...
UPDATE.
Wyrzuciłem __stdcall z deklaracji. Wczytuje funkcję, wiesza się w 1 iteracji pętli tzn
sprintf_s((char*)(uid + j), 2,"%02X", baResponseApdu[i]);
Dobra, zrobiłem wersję nie z sprinf_s tylko bez...
int j = 0;
const char* hex = "0123456789ABCDEF";
for(unsigned int i = 0; i < lResponseApduLen-2; i++)
{
uid[j++] = hex[ (baResponseApdu[i] >> 4) & 0xF ];
uid[j++] = hex[ baResponseApdu[i] & 0xF ];
}
uid[j] = '\0';
A w programie:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <Objbase.h>
#include <string>
#include "SmartCardLib_Test.h"
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char chWynik[14 + 1];
HINSTANCE hDll;
hDll = LoadLibrary( L"SmartCardLib" );
if( hDll != NULL )
{
pobierz_UID_Karty_MIFARE = ( MYFUNC ) GetProcAddress( hDll, "pobierz_UID_Karty_MIFARE" );
printf("Szukamy funkcji w DLL... \n");
if (pobierz_UID_Karty_MIFARE == NULL)
{
printf("Nie mogę odnaleźć funkcji! \n");
getchar();
return -1;
}
if( pobierz_UID_Karty_MIFARE(chWynik) == 0 )
{
printf("OK \n");
printf("Pobrany nr UID karty z funkcji w bibliotece DLL: \n");
printf("%s", (char*)chWynik);
printf("\n");
}
else
{
printf("Brak takiej funkcji w pliku DLL! \n");
}
getchar();
FreeLibrary( hDll );
}
Także działa już. Nie wiem czemu wersja z sprintf_s nie działa...
Z czystej ciekawości, jak tablice najlepiej przekazywać napisy *char do parametru wyjściowego funkcji ?
Jeśli tworzymy funkcje np. pobierzNapis(char * napis), żeby "wypełnić" parametr napis?