|
I'm producing a Web Viewer so that our customers can view the Images that we scan for them from anywhere. They enter the site and perform a search for the images and then view them. Their search details are saved in the Web Server's Registry and the fields(text boxes) are populated with their last query the next time they enter the site. The site is writen using ASP, Javascript and an ISAPI extension dll, using MFC, that does all the database stuff and file handling etc.
However, although I can read their last query from the registry, I cannot set values. I am using CRegKey::Open, with the access set to KEY_SET_VALUE ( I have tried KEY_WRITE and KEY_ALL_ACCESS ).
The RegConnectRegistry( ) function before it is succeeding OK.
I have tried using GetLastError() and then FormatMessage to get the Error Message but it returns "The operation was successful"!
Oh, the OS is W2k.
Any help would be greatly appreciated.
code as below:
// open the Registry Key and update it...
// connect to the Registry...
if ( RegConnectRegistry( NULL, HKEY_LOCAL_MACHINE , &m_RegKey.m_hKey ) != ERROR_SUCCESS )
{
#ifdef _DEBUG
MessageBox( NULL,"Unable to connect to Registry", "ERROR !", MB_DEFAULT_DESKTOP_ONLY );
#endif
return;
}
// and open (or create and open) the key...
if( m_RegKey.Create( m_RegKey.m_hKey, m_strSubKey, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, NULL ) != ERROR_SUCCESS )
{
// if it fails, find out why...
int nGetLastError = GetLastError( );
#ifdef _DEBUG
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, nGetLastError, 0, (LPSTR)szBuffer, 255, NULL );
MessageBox( NULL, szBuffer, "ERROR - SetLastQueryData()", MB_DEFAULT_DESKTOP_ONLY );
#endif
return;
}
Thanx for your patience and any help,
code dope.
|
|
|
|
|
I think it's because your web-application is running under the same security context as your users. If those users are anonymous the process dont have rights to write to that part of the registry.
Why don't you just save the data in a database?
It sounds a lot of data to save in the registry...
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
This is a typical case for using cookies.
|
|
|
|
|
Thanks Alex - I'll look into it, although I'm afraid my knowledge on Cookies is absolutely Zero (I'm just an ordinary ol' C, C++ programmer who's venturing into the Big and scary new world of Web Development!). Is it fairly easy?
Thanx again,
code dope.
|
|
|
|
|
My knowledge in cookies is exactly as yours. However, I know that they are done exactly for such purpose - to keep client settings on client computer. I would ask the separate question about cookies in message board.
|
|
|
|
|
Thanks, Anders, I think you're probably correct. However, unfortunately I am not permitted to create any new tables, views etc in the database.
The actual data is only about 10 words, so not really that much. Is there a way of changing the rights for an anonymous user without jeopardising the site, code, database etc.?
Thanx again,
code dope.
|
|
|
|
|
You _clould_ change the security settings in the registry, but that would open up a huge security hole
How about saving the data in a (XML)file instead?
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
You definately want to use a Cookie, very simple in ASP. effin Simple.
I dont think a web application should ever store data in a registry entry.
Ryan Baillargeon
Software Specialist
Fuel Cell Technologies Inc.
|
|
|
|
|
In MainFrm.h
Add the following member:
CReBar m_wndReBar;
CButton m_wndButton;
In MainFrm.cpp
int CMainFrame::OnCreate(..) {
...
// I Add
m_wndButton.Create(_T("OK"), WS_CHILD | WS_VISIBLE, CRect(0, 0, 80, 20), this, AFX_IDW_TOOLBAR + 3);
m_wndReBar.AddBar(&m_wndToolBar);
...
}
But when the application displays, The button I create on the m_wndReBar is disabled, Why ??
It's me, code_cold
|
|
|
|
|
You need to provide ON_COMMAND or ON_UPDATE_CMD_UI handler for your button.
Tomasz Sowinski -- http://www.shooltz.com
Never argue with an idiot, he'll bring you to his level and beat you with experience.
|
|
|
|
|
Hello,
I apologise, if this question has been asked before. I couldn't check it because the search doesn't work.
There's a memory leak in my program. The part of the memory that leaks is allocated (at least) during call ProcessShellCommand(cmdInfo) and it is allocated by function CString::AllocBuffer(by line new BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)]; ). Is there anything I can do about this memory leak? I mean because I don't directly call AllocBuffer myself, can I do anything about it?
BTW the start point of my program is main and I call InitInstance() and Run() from there, if it has something to do with this.
-Janetta
|
|
|
|
|
Why did you use your own 'main'?
Tomasz Sowinski -- http://www.shooltz.com
Never argue with an idiot, he'll bring you to his level and beat you with experience.
|
|
|
|
|
Tomasz Sowinski wrote:
Why did you use your own 'main'?
It has to work as a console application in windows and unix besides gui.
-Janetta
|
|
|
|
|
But you've copied the AfxWinMain into your main, including the calls to AfxWinTerm?
Tomasz Sowinski -- http://www.shooltz.com
Never argue with an idiot, he'll bring you to his level and beat you with experience.
|
|
|
|
|
Tomasz Sowinski wrote:
But you've copied the AfxWinMain into your main, including the calls to AfxWinTerm?
No. I call AfxWinInit, InitApplication, InitInstance and Run myself. In AfxWinMain InitInstance and Run are called to a CWinThread, but I call those of the application. Could this be the problem? I tried adding AfxWinTerm after Run, but it didn't help.
-Janetta
|
|
|
|
|
Janetta wrote:
call those of the application. Could this be the problem?
I don't think so, but you may try to copy AfxWinMain into your main.
Tomasz Sowinski -- http://www.shooltz.com
Never argue with an idiot, he'll bring you to his level and beat you with experience.
|
|
|
|
|
Tried already, didn't help. Thank you anyway!
Anyone got any other ideas? Can I rely on CStrings being safe and not leaking memory themselves?
-Janetta
|
|
|
|
|
The CString data should delete itself when the ref count goes to zero. Which CString instance leaks? Do you do any CString::LockBuffer/CString::GetBuffer calls without matching CString::UnlockBuffer/CString::ReleaseBuffer?
Another possibility is that it doesn't really leak, I've seen people here at CP complaining that their leak detector was wrong (was it BoundChecker? Purify? I can't remember, doesn't use one myself), especially when dealing with global objects (such as the global CWinApp instance).
Cheers
Steen.
"To claim that computer games influence children is ridiculous. If Pacman had influenced children born in the 80'ies we would see a lot of youngsters running around in dark rooms eating pills while listening to monotonous music"
|
|
|
|
|
Steen Krogsgaard wrote:
Do you do any CString::LockBuffer/CString::GetBuffer calls without matching CString::UnlockBuffer/CString::ReleaseBuffer?
If I remember right, the things you mentioned should be ok. I can't get to the code right now, but I'll check when I can.
Thanks!
-Janetta
|
|
|
|
|
I want to use the RETURN and ESCAPE key in a control which I have placed on a dialog. I simply want to remove the RETURN and ESCAPE action (Ok/Cancel) from the dialog.
|
|
|
|
|
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_KEYDOWN )
{
if( pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE )
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
|
|
|
|
|
IMHO using PreTranslateMessage() for this is a bad idea. Your code snippet will disable the 'Enter' key from working on any and all button in the dialog. A person is far better off to override the OnOK() and OnCancel() functions and not call the base class implementations. The following code stops the 'Enter' key from closing the dialog unless the 'OK' or 'Cancel' button has the focus. It also stops the 'Escape' key from closing the dialog unless the 'Cancel' button has the focus. In all other instances, the keys work as would be expected.
void CMyDialog::OnOK()
{
if (GetFocus() == GetDlgItem(IDOK))
CDialog::OnOK();
}
void CMyDialog::OnCancel()
{
if (GetFocus() == GetDlgItem(ICANCEL))
CDialog::OnCancel();
}
CPUA 0x5041
Sonork 100.11743 Chicken Little
"So it can now be written in stone as a testament to humanities achievments "PJ did Pi at CP"." Colin Davies
Within you lies the power for good - Use it!
|
|
|
|
|
Hi,
I'm looking to catch an input error from a dialog box. I have edit boxes with doubles mapped to them so when letters are entered and the button is pressed the application automatically generates a MessageBox asking the user to enter a number. I want to catch this in order to be able to reset variables, etc. Is there a Message Handler for this?
Thanks,
Graham
|
|
|
|
|
gm_coll wrote:
I have edit boxes with doubles mapped to them so when letters are entered and the button is pressed the application automatically generates a MessageBox asking the user to enter a number
This is implemented in DDX_Text function. Calls to DDX_xxx functions are inserted in CYourDlg::DoDataExchange by ClassWizard. Unfortunately, there's no notification going back to your app when validation fails - MFC just displays a message box and throws CUserException, which is later catched in CWnd::UpdateData.
You basically have two options: catching CUserException (and throwing it again with argument-less 'throw') or doing data transfer/validation without DDX_ routines.
Tomasz Sowinski -- http://www.shooltz.com
Never argue with an idiot, he'll bring you to his level and beat you with experience.
|
|
|
|
|
Would I catch the CUserException in my BN_CLICKED message handler and carry out my additional functions before throwing the exception on?
Thanks in advance,
Graham
|
|
|
|