You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
5.7 KiB
256 lines
5.7 KiB
/*
|
|
* profile.c
|
|
*
|
|
* win32/win16 utility functions to read and write profile items
|
|
* for multimedia tools
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <profile.key>
|
|
|
|
/*
|
|
* read a UINT from the profile, or return default if
|
|
* not found.
|
|
*/
|
|
#ifdef _WIN32
|
|
UINT mmGetProfileIntA(LPCSTR appname, LPCSTR valuename, INT uDefault)
|
|
{
|
|
CHAR achName[MAX_PATH];
|
|
HKEY hkey;
|
|
DWORD dwType;
|
|
INT value = uDefault;
|
|
DWORD dwData;
|
|
int cbData;
|
|
|
|
lstrcpyA(achName, KEYNAMEA);
|
|
lstrcatA(achName, appname);
|
|
if (RegOpenKeyA(ROOTKEY, achName, &hkey) == ERROR_SUCCESS) {
|
|
|
|
cbData = sizeof(dwData);
|
|
if (RegQueryValueExA(
|
|
hkey,
|
|
(LPSTR)valuename,
|
|
NULL,
|
|
&dwType,
|
|
(PBYTE) &dwData,
|
|
&cbData) == ERROR_SUCCESS) {
|
|
if (dwType == REG_DWORD) {
|
|
value = (INT)dwData;
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
return((UINT)value);
|
|
}
|
|
|
|
UINT
|
|
mmGetProfileInt(LPCTSTR appname, LPCTSTR valuename, INT uDefault)
|
|
{
|
|
TCHAR achName[MAX_PATH];
|
|
HKEY hkey;
|
|
DWORD dwType;
|
|
INT value = uDefault;
|
|
DWORD dwData;
|
|
int cbData;
|
|
|
|
lstrcpy(achName, KEYNAME);
|
|
lstrcat(achName, appname);
|
|
if (RegOpenKey(ROOTKEY, achName, &hkey) == ERROR_SUCCESS) {
|
|
|
|
cbData = sizeof(dwData);
|
|
if (RegQueryValueEx(
|
|
hkey,
|
|
(LPTSTR)valuename,
|
|
NULL,
|
|
&dwType,
|
|
(PBYTE) &dwData,
|
|
&cbData) == ERROR_SUCCESS) {
|
|
if (dwType == REG_DWORD) {
|
|
value = (INT)dwData;
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
return((UINT)value);
|
|
}
|
|
#endif
|
|
|
|
|
|
/*
|
|
* write a UINT to the profile, if it is not the
|
|
* same as the default or the value already there
|
|
*/
|
|
#ifdef _WIN32
|
|
VOID
|
|
mmWriteProfileInt(LPCTSTR appname, LPCTSTR valuename, INT Value)
|
|
{
|
|
// If we would write the same as already there... return.
|
|
if (mmGetProfileInt(appname, valuename, !Value) == (UINT)Value) {
|
|
return;
|
|
}
|
|
|
|
{
|
|
TCHAR achName[MAX_PATH];
|
|
HKEY hkey;
|
|
|
|
lstrcpy(achName, KEYNAME);
|
|
lstrcat(achName, appname);
|
|
if (RegCreateKey(ROOTKEY, achName, &hkey) == ERROR_SUCCESS) {
|
|
RegSetValueEx(
|
|
hkey,
|
|
valuename,
|
|
0,
|
|
REG_DWORD,
|
|
(PBYTE) &Value,
|
|
sizeof(Value)
|
|
);
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
}
|
|
|
|
}
|
|
#else
|
|
// For Win16 we use a macro and assume we have been passed a string value
|
|
// char ach[12];
|
|
//
|
|
// wsprintf(ach, "%d", Value);
|
|
//
|
|
// WriteProfileString(
|
|
// appname,
|
|
// valuename,
|
|
// ach);
|
|
}
|
|
#endif
|
|
|
|
|
|
/*
|
|
* read a string from the profile into pResult.
|
|
* result is number of bytes written into pResult
|
|
*/
|
|
#ifdef _WIN32
|
|
DWORD
|
|
mmGetProfileStringA(
|
|
LPCSTR appname,
|
|
LPCSTR valuename,
|
|
LPCSTR pDefault,
|
|
LPSTR pResult,
|
|
int cbResult
|
|
)
|
|
{
|
|
CHAR achName[MAX_PATH];
|
|
HKEY hkey;
|
|
DWORD dwType;
|
|
|
|
lstrcpyA(achName, KEYNAMEA);
|
|
lstrcatA(achName, appname);
|
|
if (RegOpenKeyA(ROOTKEY, achName, &hkey) == ERROR_SUCCESS) {
|
|
|
|
cbResult = cbResult * sizeof(TCHAR);
|
|
if (RegQueryValueExA(
|
|
hkey,
|
|
(LPSTR)valuename,
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE)pResult,
|
|
&cbResult) == ERROR_SUCCESS) {
|
|
|
|
if (dwType == REG_SZ) {
|
|
// cbResult is set to the size including null
|
|
RegCloseKey(hkey);
|
|
return(cbResult - 1);
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
// if we got here, we didn't find it, or it was the wrong type - return
|
|
// the default string
|
|
lstrcpyA(pResult, pDefault);
|
|
return(lstrlenA(pDefault));
|
|
}
|
|
|
|
DWORD
|
|
mmGetProfileString(
|
|
LPCTSTR appname,
|
|
LPCTSTR valuename,
|
|
LPCTSTR pDefault,
|
|
LPTSTR pResult,
|
|
int cbResult
|
|
)
|
|
{
|
|
TCHAR achName[MAX_PATH];
|
|
HKEY hkey;
|
|
DWORD dwType;
|
|
|
|
lstrcpy(achName, KEYNAME);
|
|
lstrcat(achName, appname);
|
|
if (RegOpenKey(ROOTKEY, achName, &hkey) == ERROR_SUCCESS) {
|
|
|
|
cbResult = cbResult * sizeof(TCHAR);
|
|
if (RegQueryValueEx(
|
|
hkey,
|
|
(LPTSTR)valuename,
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE)pResult,
|
|
&cbResult) == ERROR_SUCCESS) {
|
|
|
|
if (dwType == REG_SZ) {
|
|
// cbResult is set to the size including null
|
|
RegCloseKey(hkey);
|
|
return(cbResult/sizeof(TCHAR) - 1);
|
|
}
|
|
}
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
// if we got here, we didn't find it, or it was the wrong type - return
|
|
// the default string
|
|
lstrcpy(pResult, pDefault);
|
|
return(lstrlen(pDefault));
|
|
}
|
|
#endif
|
|
|
|
|
|
/*
|
|
* write a string to the profile
|
|
*/
|
|
#ifdef _WIN32
|
|
VOID
|
|
mmWriteProfileString(LPCTSTR appname, LPCTSTR valuename, LPCTSTR pData)
|
|
{
|
|
TCHAR achName[MAX_PATH];
|
|
HKEY hkey;
|
|
|
|
lstrcpy(achName, KEYNAME);
|
|
lstrcat(achName, appname);
|
|
if (RegCreateKey(ROOTKEY, achName, &hkey) == ERROR_SUCCESS) {
|
|
if (pData) {
|
|
RegSetValueEx(
|
|
hkey,
|
|
valuename,
|
|
0,
|
|
REG_SZ,
|
|
(LPBYTE)pData,
|
|
(lstrlen(pData) + 1) * sizeof(TCHAR)
|
|
);
|
|
} else {
|
|
RegDeleteValue(
|
|
hkey,
|
|
(LPTSTR)valuename
|
|
);
|
|
}
|
|
|
|
RegCloseKey(hkey);
|
|
}
|
|
}
|
|
#endif
|
|
|