コンソール AP で,レジストリを読み取るために以下の様な関数を用意した.
int Reg_GetInt (HKEY hKey,LPCTSTR subKey,LPCTSTR ent,const int defValue=0)
{
DWORD value = defValue ;
#ifdef _ATL_VER
{
CRegKey reg ;
reg.Open(hKey,subKey) ;
#if (_ATL_VER >= 0x700)
reg.QueryDWORDValue(ent,value) ;
#else
reg.QueryValue(value,ent) ;
#endif
}
#else
{
HKEY hSecKey = NULL ;
LONG openStatus = ::RegOpenKeyEx(hKey,subKey,0,KEY_READ,&hSecKey) ;
if (hSecKey == NULL) { return value ; }
DWORD type = REG_NONE ;
DWORD count = sizeof(DWORD) ;
LONG queryStatus = ::RegQueryValueEx(hSecKey,ent,NULL,&type,(LPBYTE)&value,&count) ;
::RegCloseKey(hSecKey) ;
}
#endif
return int(value) ;
}
*::Reg~ などのエラーチェックは省いている.
呼出すのはこんな感じ.
int value = ::Reg_GetInt(HKEY_CURRENT_USER,_T(“Software\\Iwao\\Test\\RegAcc”),_T(“T_RegKey_DW”)) ;
CWinApp::GetProfileInt などが使えないかとやってみたが,…
1. AfxGetApp() を呼びだしても,NULL で戻ってくる.
次の様に領域を確保.
CWinApp theApp;
2. SetRegistryKey(key) が直接呼びだせないので,
class C_SRK_WinApp : public CWinApp {
public:
void SetRegKey (LPCTSTR key) { SetRegistryKey(key) ; }
} ;
変数の確保は次の様に変更.
C_SRK_WinApp theApp ;
3. SetRegistryKey の中で ASSERT(m_pszAppName != NULL)
以下を追加して,CWinApp を初期化.
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0) ;
4. これで CWinApp::GetProfileInt は利用できるようになるが,CWinApp::m_pszProfileName が邪魔.
C_SRK_WinApp* app = (C_SRK_WinApp*)AfxGetApp() ;
int val = app->GetProfileInt(_T(“Test\\RegAcc”),_T(“T_RegKey_DW”),0) ;
HKCU\Software\Iwao\(m_pszProfileName)\Test\RegAcc となってしまう.
5. m_pszProfileName を _T(“”) とすることにより,意図した値を取得できる様にはなった.
C_SRK_WinApp* app = (C_SRK_WinApp*)AfxGetApp() ;
if (app != NULL) {
AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0) ;
app->SetRegKey(_T(“Iwao”)) ;
free((void*)app->m_pszProfileName) ;
app->m_pszProfileName = _tcsdup(_T(“”)) ;
int val = app->GetProfileInt(_T(“Test\\RegAcc”),_T(“T_RegKey_DW”),0) ;
}
コンソール AP で CWinApp::GetProfileInt などを使うことは,やめ.
[…] 以前一度やっているが… https://dev.mish.work/wordpress/2015/01/28/console-ap-reg-read/ […]