(Solucionado) Ayuda obtener id de vb a c++

Iniciado por Cromatico, 26 Junio 2015, 17:53 PM

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

Cromatico

Buenas tardes estimados, estoy necesitando convertir esta parte de código que esta en vb.net a c++... La idea es poder hacer la misma función, pero para codeblocks c++...

Public Function ProcessorID()
       Dim cpuInfo As String = String.Empty
       Dim temp As String = String.Empty
       Dim mc As ManagementClass = New ManagementClass("Win32_Processor")
       Dim moc As ManagementObjectCollection = mc.GetInstances
       For Each mo As ManagementObject In moc
           If (cpuInfo = String.Empty) Then
               cpuInfo = mo.Properties("ProcessorId").Value.ToString
               ProcessorID = cpuInfo
               Exit Function
           End If
       Next
       ProcessorID = cpuInfo
   End Function


Buscando por internet encontre esto:
void getPSN(char *PSN)
{
   int varEAX, varEBX, varECX, varEDX;
   char str[9];
   //%eax=1 gives most significant 32 bits in eax
   __asm__ __volatile__ ("cpuid"   : "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (1));
   sprintf(str, "%08X", varEAX); //i.e. XXXX-XXXX-xxxx-xxxx-xxxx-xxxx
   sprintf(PSN, "%C%C%C%C-%C%C%C%C", str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
   //%eax=3 gives least significant 64 bits in edx and ecx [if PN is enabled]
   __asm__ __volatile__ ("cpuid"   : "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (3));
   sprintf(str, "%08X", varEDX); //i.e. xxxx-xxxx-XXXX-XXXX-xxxx-xxxx
   sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
   sprintf(str, "%08X", varECX); //i.e. xxxx-xxxx-xxxx-xxxx-XXXX-XXXX
   sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
}


Pero solo me devuelve la última parte del ID... Tienen idea si hay alguna alternativa para C++ que haga lo mismo? Imagino que si pero no estoy buscando bien...

Desde ya gracias!


EDIT: Ya esta, toqueteando como buen novato despues de varios intentos, agregue este bloquesito:

__asm__ __volatile__ ("cpuid"   : "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (1));
    sprintf(str, "%08X", varEDX); //i.e. XXXX-XXXX-xxxx-xxxx-xxxx-xxxx
    sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN,str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);


Y me trajo la primer parte del ID, ahora lo reacomodo y listo...

No se lo que hice y tampoco quiero saber por ahora JAJAJA, no se nada de asm...
No mentira, si alguien tiene conocimiento, digame que hice.

Saludos y solucionado.

x64core

No sé si exista una funcion especifica en C++ para obtener el nombre del CPU, pero especifico en Windows hay varias maneras de obtener el nombre: instrucción CPUID, WMI y el registro.

El registro es el menos recomendado, tratar de leer especificas direcciónes del resgitro no es seguro, se debe evitar lo más posible.

Instrucción CPUID: https://en.wikipedia.org/wiki/CPUID
La más detallada información la encontras en los PDFs de intel. CPUID se puede utilizar para obtener cierta información del procesador(es): nombre, nucleos, caracteristicas, etc.

Al menos en VC++ exista una funcion __cpuid que sirve para generar una instruccion cpuid dejando al compilador asunto como optimización y demás, sin usar ensamblador en el código C/C++.