[Cramel] Obtener Nombre del Sistema Operativo

Iniciado por fudmario, Marzo 01, 2017, 12:57:17 AM

Tema anterior - Siguiente tema

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

Marzo 01, 2017, 12:57:17 AM Ultima modificación: Marzo 01, 2017, 01:44:59 AM por fudmario
Una simple funcion para obtener el nombre del Sistema Operativo.
Código: text

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())




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
Código: php
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.

Gracias por las Correcciones, recien me estoy familiarizando con el Lenguaje.
Tenia pensado traducir algunas funciones de mi libreria que hice en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y queria comenzar con algo sencillo..


Saludos.