Underc0de

Programación General => Otros lenguajes => Mensaje iniciado por: fudmario en Marzo 01, 2017, 12:57:17 AM

Título: [Cramel] Obtener Nombre del Sistema Operativo
Publicado por: fudmario en Marzo 01, 2017, 12:57:17 AM
Una simple funcion para obtener el nombre del Sistema Operativo.
Código (text) [Seleccionar]

Importar "Cramel.cml"
API RegOpenKeyEx(hKey:Entero,lpSubKey:Cadena,ulOptions,samDesired:Entero,Referencia phkResult:Entero):Entero, "Advapi32.dll" "RegOpenKeyExA"
API RegQueryValueEx(hKey:Entero,lpValueName:Cadena,lpReserved:Entero,Referencia lpType:Entero,Referencia lpData:Cadena,Referencia lpcbData:Entero):Entero, "Advapi32.dll" "RegQueryValueExA"
API RegCloseKey(hKey:Entero):Entero, "Advapi32.dll"
'=> Obtiene Nombre del Sistema Operativo
'=> Retorna Cadena
Proc SistemaOperativo():Cadena
Var SubKey, ValueName, CadenaFinal:Cadena
Var Result,ret,Data,Tipo,resData:Entero
Result = &80000002 'HKLM
SubKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
ValueName =  "ProductName"
ret = RegOpenKeyEx(Result, SubKey, 0, &20019, Result)
Si ret<> &0 Entonces Devolver "Desconocido"
ret = RegQueryValueEx(Result, ValueName, 0, 0, CadenaFinal, Data) 
CadenaFinal = RepCarac(0, Data)
ret = RegQueryValueEx(Result, ValueName, 0,  0, CadenaFinal, Data) 
Devolver CadenaFinal
RegCloseKey(Result)
FinProc

Mensaje(SistemaOperativo())

Título: Re:[Cramel] Obtener Nombre del Sistema Operativo
Publicado por: Yuki en Marzo 01, 2017, 12:35:06 PM
Veo que le estas agarrando la mano al lenguaje, te dejo un par de notas, recomiendo usar la función "Espacio" en vez de "RepCarac", según recuerdo crea un buffer inicializado a cero, básicamente lo que quieres hacer con "RepCarac", pero sin el FillMemory.

No es necesario asignar una variable de retorno a los procedimientos, puedes procesarlos directamente desde una sentencia "Si".

La instrucción "Devolver" retorna un valor y finaliza la ejecución de tu procedimiento, por lo que nunca llega a cerrar el registro.

Te dejo acá el código como creo que debería quedar
Importar "Cramel.cml"
API RegOpenKeyEx(hKey:Entero,lpSubKey:Cadena,ulOptions,samDesired:Entero,Referencia phkResult:Entero):Entero, "Advapi32.dll" "RegOpenKeyExA"
API RegQueryValueEx(hKey:Entero,lpValueName:Cadena,lpReserved:Entero,Referencia lpType:Entero,Referencia lpData:Cadena,Referencia lpcbData:Entero):Entero, "Advapi32.dll" "RegQueryValueExA"
API RegCloseKey(hKey:Entero):Entero, "Advapi32.dll"
'=> Obtiene Nombre del Sistema Operativo
'=> Retorna Cadena
Proc SistemaOperativo():Cadena
    Var SubKey, ValueName, CadenaFinal:Cadena
    Var Result,ret,Data,Tipo,resData:Entero
    Result = &80000002 'HKLM
    SubKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
    ValueName =  "ProductName"
    Si RegOpenKeyEx(Result, SubKey, 0, &20019, Result) <> &0 Entonces Devolver "Desconocido"
    RegQueryValueEx(Result, ValueName, 0, 0, CadenaFinal, Data) 
    CadenaFinal = Espacio(Data)
    RegQueryValueEx(Result, ValueName, 0,  0, CadenaFinal, Data) 
    RegCloseKey(Result)
    Resultado = CadenaFinal
FinProc

Mensaje(SistemaOperativo())


Bueno, mas haya de ese par de pequeños problemas, tu código es excelente y una muy buena manera de obtener el nombre del sistema operativo.
Título: Re:[Cramel] Obtener Nombre del Sistema Operativo
Publicado por: fudmario en Marzo 01, 2017, 11:39:18 PM
Gracias por las Correcciones, recien me estoy familiarizando con el Lenguaje.
Tenia pensado traducir algunas funciones de mi libreria que hice en Vb.net y queria comenzar con algo sencillo..


Saludos.