2020-09-30 16:53:49 +02:00

99 lines
3.7 KiB
C++

// RCMLPersist.cpp: implementation of the RCMLPersist class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RCMLPersist.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//
// this is the persitance NODE in the DWIN32 namespace.
//
HRESULT STDMETHODCALLTYPE CXMLPersist::InitNode(
IRCMLNode __RPC_FAR *pParent)
{
if( SUCCEEDED(pParent->IsType(L"EDIT") ))
{
LPCTSTR pszApplicationName=Get(TEXT("APPNAME"));
LPCTSTR pszKeyName=Get(TEXT("KEYNAME"));
BOOL bSet=FALSE;
if( pszApplicationName && pszKeyName )
{
HKEY hkSoftware;
if( RegOpenKey( HKEY_CURRENT_USER, TEXT("Software"), &hkSoftware ) == ERROR_SUCCESS )
{
HKEY hkApplication;
if( RegOpenKey( hkSoftware, pszApplicationName, &hkApplication) == ERROR_SUCCESS )
{
DWORD dwSize;
DWORD dwType=REG_SZ;
if( RegQueryValueEx( hkApplication, pszKeyName, NULL, &dwType, NULL, &dwSize ) == ERROR_SUCCESS )
{
LPTSTR pszData=new TCHAR[dwSize];
if( RegQueryValueEx( hkApplication, pszKeyName, NULL, &dwType, (LPBYTE)pszData, &dwSize ) == ERROR_SUCCESS )
{
pParent->put_Attr( L"TEXT", pszData );
delete pszData ;
bSet=TRUE;
}
}
RegCloseKey(hkApplication);
}
RegCloseKey(hkSoftware);
}
}
if(bSet==FALSE)
pParent->put_Attr(L"TEXT", Get(L"TEXT") );
}
return S_OK;
}
//
// this is the persitance NODE in the DWIN32 namespace.
// should only really be called if the user clicks OK, rather than cancel??
//
HRESULT STDMETHODCALLTYPE CXMLPersist::ExitNode(
IRCMLNode __RPC_FAR *pParent, LONG lDialogResult)
{
if(lDialogResult != IDOK )
return S_OK;
if(SUCCEEDED( pParent->IsType(L"EDIT")))
{
LPCTSTR pszApplicationName=Get(TEXT("APPNAME"));
LPCTSTR pszKeyName=Get(TEXT("KEYNAME"));
if( pszApplicationName && pszKeyName )
{
HKEY hkSoftware;
if( RegOpenKey( HKEY_CURRENT_USER, TEXT("Software"), &hkSoftware ) == ERROR_SUCCESS )
{
HKEY hkApplication;
if( RegCreateKey( hkSoftware, pszApplicationName, &hkApplication) == ERROR_SUCCESS )
{
IRCMLControl * pControl;
if(SUCCEEDED( pParent->QueryInterface( __uuidof( IRCMLControl ), (LPVOID*)&pControl)))
{
HWND hWnd;
if( SUCCEEDED( pControl->get_Window(&hWnd) ))
{
LPTSTR szString=NULL;
DWORD cbNeeded = GetWindowTextLength( hWnd )+1;
szString = new TCHAR[cbNeeded];
GetWindowText( hWnd, szString, cbNeeded );
RegSetValueEx( hkApplication, pszKeyName, NULL, REG_SZ, (LPBYTE) szString, cbNeeded*sizeof(TCHAR) );
}
pControl->Release();
}
RegCloseKey(hkApplication);
}
RegCloseKey(hkSoftware);
}
}
}
return S_OK;
}