Seriales PenDrive DevC++ (SRC)

Iniciado por Maurice_Lupin, 17 Noviembre 2011, 17:27 PM

0 Miembros y 1 Visitante están viendo este tema.

Maurice_Lupin

Buscando código para VB.NET encontré esto, hice pequeñas modificaciones para que funcione en Dev C++ y googleando encontré la función Split, comparto el resultado

Hay que linkear: -lsetupapi
Código (cpp) [Seleccionar]


#include <windows.h>
#include <Setupapi.h>
#include <stdio.h>

static /*const*/ GUID hidGUID = { 0xA5DCBF10L, 0x6530, 0x11D2,
{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };

char **split ( char *string, const char sep) {

   char       **lista;
   char       *p = string;
   int         i = 0;

   int         pos;
   const int   len = strlen (string);

   lista = (char **) malloc (sizeof (char *));
   if (lista == NULL) {                      /* Cannot allocate memory */
       return NULL;
   }

   lista[pos=0] = NULL;

   while (i <len) {

       while ((p[i] == sep) && (i <len))
           i++;

       if (i <len) {

           char **tmp = (char **) realloc (lista , (pos + 2) * sizeof (char *));
           if (tmp == NULL) {       /* Cannot allocate memory */
               free (lista);
               return NULL;
           }
           lista = tmp;
           tmp = NULL;

           lista[pos + 1] = NULL;
           lista[pos] = (char *) malloc (sizeof (char));
           if (lista[pos] == NULL) {         /* Cannot allocate memory */
               for (i = 0; i <pos; i++)
                   free (lista[i]);
               free (lista);
               return NULL;
           }

           int j = 0;
           for (i; ((p[i] != sep) && (i <len)); i++) {
               lista[pos][j] = p[i];
               j++;

               char *tmp2 = (char *) realloc (lista[pos],(j + 1) * sizeof (char));
               if (lista[pos] == NULL) {     /* Cannot allocate memory */
                   for (i = 0; i <pos; i++)
                       free (lista[i]);
                   free (lista);
                   return NULL;
               }
               lista[pos] = tmp2;
               tmp2 = NULL;
           }
           lista[pos][j] = '\0';
           pos++;
       }
   }

   return lista;
}

HANDLE connectDeviceNumber(DWORD deviceIndex)
{
   //GUID hidGUID;  
   
   
   HDEVINFO hardwareDeviceInfoSet;
   SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
   PSP_INTERFACE_DEVICE_DETAIL_DATA deviceDetail;
   ULONG requiredSize;
   HANDLE deviceHandle = INVALID_HANDLE_VALUE;
   DWORD result;

   //Get the HID GUID value - used as mask to get list of devices
   //HidD_GetHidGuid (&hidGUID);
   //hidGUID = new GUID(GUID GUID_DEVINTERFACE_USB_DEVICE);

   //Get a list of devices matching the criteria (hid interface, present)
   hardwareDeviceInfoSet = SetupDiGetClassDevs (&hidGUID,
                                                NULL, // Define no enumerator (global)
                                                NULL, // Define no
                                                (DIGCF_PRESENT | // Only Devices present
                                                DIGCF_DEVICEINTERFACE)); // Function class devices.

   deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

   //Go through the list and get the interface data
   result = SetupDiEnumDeviceInterfaces (hardwareDeviceInfoSet,
                                         NULL, //infoData,
                                         &hidGUID, //interfaceClassGuid,
                                         deviceIndex,
                                         &deviceInterfaceData);

   /* Failed to get a device - possibly the index is larger than the number of devices */
   if (result == FALSE)
   {
       SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
       printf("hidin: -- failed to get specified device number");
       return INVALID_HANDLE_VALUE;
   }

   //Get the details with null values to get the required size of the buffer
   SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
                                    &deviceInterfaceData,
                                    NULL, //interfaceDetail,
                                    0, //interfaceDetailSize,
                                    &requiredSize,
                                    0); //infoData))

   //Allocate the buffer
   deviceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredSize);
   deviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

   //Fill the buffer with the device details
   if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfoSet,
                                         &deviceInterfaceData,
                                         deviceDetail,
                                         requiredSize,
                                         &requiredSize,
                                         NULL))
   {
       SetupDiDestroyDeviceInfoList (hardwareDeviceInfoSet);
       free (deviceDetail);
       printf("hidin: -- failed to get device info");
       return INVALID_HANDLE_VALUE;
   }

   char  **listSplit;

   listSplit = split(deviceDetail->DevicePath,'#');
   
   //printf("Opening device with path: %s", deviceDetail->DevicePath);
   printf("Serial: %s\n",listSplit[2] );
}

int main(int argc, char* argv[]) {
   connectDeviceNumber(0);
   
   getchar();
  return 0;
}

Un error se comete al equivocarse.