Una simple funcion para obtener el nombre del Sistema Operativo.
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
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 Vb.net y queria comenzar con algo sencillo..
Saludos.