|
The for loop that enumerates the HKEY_CLASSES_ROOT\CLSID key is as follows:
DWORD dwRetVal = 0 ;
for (DWORD dwClsidIndx = 1 ; dwClsidIndx <= 1488 ; dwClsidIndx++)
{
TCHAR ComClssGuid [128] ;
ZeroMemory (&ComClssGuid, 128) ;
LPTSTR pComClsid = ComClssGuid ;
dwRetVal = RegEnumKeyEx (hRootKey, dwClsidIndx, ComClssGuid, &dwSize, NULL, NULL, NULL, &ftLastWrtTime) ;
if ((dwRetVal != ERROR_SUCCESS) && (dwRetVal != ERROR_MORE_DATA))
{
dwRetErrorVal = dwRetVal ;
dwErrNumClsid = dwClsidIndx ;
dwClsidErrors++ ;
TCHAR ErrorMessage [192] ;
wsprintf (ErrorMessage, TEXT(" ERROR: Number of Errors: %lu. ERROR: CLSID %lu. Error Code: %lu"), dwClsidErrors, dwErrNumClsid, dwRetErrorVal) ;
SetStatusMessage (ErrorMessage) ;
return FALSE ;
}
WriteClsidNodesAlpha (ClsidDomDoc, pDocRtElment, pComClsid, dwClsidIndx) ;
}
Explanation: dwRetErrorVal, dwErrNumClsid, and dwClsidErrors, are all DWORD variables declared outside of the function, used just to store the error code, CLSID subkey number, and the total number of such errors.
WriteClsidNodesAlpha is the function that writes the data to a Node in an XML file.
...and SetStatusMessage merely displays text in the application's status bar.
|
|
|
|
|
David Crow,
Sorry, I can't get at the edit control to change the last post. You're probably laughing, it's such a ridiculous post. You will notice that the test expression in the for loop is: dwClsidIndx <= 1488
Well, I changed that value after the loop initially failed (at CLSID number 1488). it originally was 3965 (which is the value returned from RegQueryInfoKey, dwNumSubKeys).
You will also notice that I begin the enumeration at value 1, instead of zero, as recommended by the documentation. This is because, I was getting the same name "CLSID" written to the TCHAR ComClssGuid [128] buffer, 3965 times (each time the loop executed).
The code just preceeding the loop, where I obtain the hKey value is here:
DWORD dwNumBubKeys = 0 ;
DWORD dwMaxSubLen = 0 ;
DWORD dwSize = 128 ;
FILETIME ftLastWrtTime ;
HKEY hRootKey = NULL ;
const TCHAR ComClsidEntrs [] = TEXT("CLSID") ;
LPCTSTR ClsidKeys = ComClsidEntrs ;
RegOpenKeyEx (HKEY_CLASSES_ROOT, ClsidKeys, 0, KEY_ALL_ACCESS, &hRootKey) ;
RegQueryInfoKey (hRootKey, NULL, NULL, NULL, &dwNumBubKeys, &dwMaxSubLen, NULL, NULL, NULL, NULL, NULL, NULL) ;
DWORD dwRetVal = 0 ;
for (DWORD dwClsidIndx = 1 ; dwClsidIndx <= 3965 ; dwClsidIndx++)
{
TCHAR ComClssGuid [128] ;
ZeroMemory (&ComClssGuid, 128) ;
LPTSTR pComClsid = ComClssGuid ;
dwRetVal = RegEnumKeyEx (hRootKey, dwClsidIndx, ComClssGuid, &dwSize, NULL, NULL, NULL, &ftLastWrtTime) ;
if ((dwRetVal != ERROR_SUCCESS) && (dwRetVal != ERROR_MORE_DATA))
{
dwRetErrorVal = dwRetVal ;
dwErrNumClsid = dwClsidIndx ;
dwClsidErrors++ ;
TCHAR ErrorMessage [192] ;
wsprintf (ErrorMessage, TEXT(" ERROR: Number of Errors: %lu. ERROR: CLSID %lu. Error Code: %lu"), dwClsidErrors, dwErrNumClsid, dwRetErrorVal) ;
SetStatusMessage (ErrorMessage) ;
return FALSE ;
}
WriteClsidNodesAlpha (ClsidDomDoc, pDocRtElment, pComClsid, dwClsidIndx) ;
}
Really, it's more of an annoyance than anything, since I was able to correct the problem. I'm just curious as to why it happened.
|
|
|
|
|
Thanks, Davis Crow,
You know, it's probably something internal,...something that I can't access programmatically.
Don't worry about it. Maybe even it's corruption in the registry storage copy. My machine is old (running Windows XP, SP1).
Now, I know how to keep my code blocks from causing the displayed text to run off the page (here in the forum). Unfortunately, I can't even delete the post and repair the version. I know it looks confusing.
|
|
|
|
|
Baltoro wrote: Unfortunately, I can't even...repair the version. I know it looks confusing.
Actually you can. Go to one of your other posts and click the Edit button. Change the number in the URL to 2983307.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Baltoro wrote:
for (DWORD dwClsidIndx = 1 ; dwClsidIndx <= 1488 ; dwClsidIndx++)
{
TCHAR ComClssGuid [128] ;
ZeroMemory (&ComClssGuid, 128) ;
LPTSTR pComClsid = ComClssGuid ;
dwRetVal = RegEnumKeyEx (hRootKey, dwClsidIndx, ComClssGuid, &dwSize, NULL, NULL, NULL, &ftLastWrtTime) ;
The problem is most likely that the dwSize variable is changed every time you call RegEnumKeyEx. Since most of the keys returned have 128 characters, you're ok. However the key with the missing digit causes dwSize to be set to 127, so from that point on, the value is too small to hold the rest of the keys.
The solution is to simply set dwSize to 128 at at the top of your for loop.
Hope that helps.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
krmed,
That was it, EXACTLY! Thanks to both you and David Crow, I appreciate it.
I'm SO embarrassed! I can't believe that I made such an idiotic mistake.
Anyway, thanks again.
modified on Saturday, March 28, 2009 5:19 PM
|
|
|
|
|
How do I add event handler for dynamically created controls in MFC? For example a button & an onclick event.
|
|
|
|
|
grassrootkit wrote: How do I add event handler for dynamically created controls in MFC? For example a button & an onclick event.
Just like any other button click:
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_BN_CLICKED(IDC_SOME_BUTTON, OnButtonClicked)
END_MESSAGE_MAP()
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Can't follow you. I'm creating the control like:
CButton* pButton = new CButton;
pButton->Create("&ENTER", WS_CHILD | WS_VISIBLE,
CRect(0, 0, 100, 43), this, 1);
How do I assign a handler for this? I do not even know it's ID here. Little unclear.
|
|
|
|
|
grassrootkit wrote: I do not even know it's ID here.
Have you bothered to read the documentation? The fifth argument is the ID.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
DavidCrow wrote: Have you bothered to read the documentation? The fifth argument is the ID.
. Please excuse. That's dumb. Thanks for the reply.
|
|
|
|
|
Will that be enough, or is another shoe to drop?
|
|
|
|
|
I'm missing the punch line, Mike.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Not really one. I was predicting this[^] it hadn't shown up before I posted mine.
Looking at the times it no longer reflects the predictive nature of my post.
|
|
|
|
|
You need to define a hard-coded range of IDs for your dynamically created controls.
for example, you can decide that the range
#define IDC_DYNAMIC_CONTROL_RANGE_START 1300
#define IDC_DYNAMIC_CONTROL_RANGE_START 2000
And when you create a new control, you assign the first free ID in the range; that means you will have
a limit on how many controls you will be able to support.
This signature was proudly tested on animals.
|
|
|
|
|
Here is my code:
void CtimerDlg::OnTimer(UINT_PTR nIDEvent)
{
CString prazno;
prazno="";
progres.SetPos(100);
int j= (rand()%2)+1;
if(j==1)
{
m_sEdit=getRandomSymbol1();
AppendTextToEditCtrl(m_edit, m_sEdit);
skritEdit.GetWindowText(strGet);
strGet.MakeUpper();
}
else
{
m_number=getRandomSymbol2();
char c[10];
_itoa(m_number,c,10);
MFCString=c;
AppendTextToEditCtrl(m_edit, MFCString);
skritEdit.GetWindowText(strGetN);
}
if(m_sEdit==strGet) stevec1=stevec1+1;
else stevec2=stevec2+2;
if(MFCString==strGetN) stevec1=stevec1+1;
else stevec2=stevec2+2;
m_sEdit="";
strGet="";
m_number=0;
MFCString="";
strGetN="";
skritEdit.SetWindowTextW(prazno);
UpdateData(FALSE);
progres.SetPos(0);
CDialog::OnTimer(nIDEvent);
}
NOTE* skritEdit is CEdit with focuson and hidden where user is typing chars and numbers from keyboard. m_edit is also CEdit but visible where random chars and number are shown.
NOTE2* GetRandomSymbol1 returns char, GetRandomSymbol2 returns int.
And here are buttons that starttime and killtime..
void CtimerDlg::OnBnClickedButton2()
{
CString prazno2;
prazno2="";
this->KillTimer(1);
char e[10];
itoa(stevec1,e,10);
CString proba;
proba=e;
m_edit.SetWindowTextW(prazno2);
MessageBox(proba);
stevec1=0;
}
void CtimerDlg::OnBnClickedButton3()
{
this->SetTimer(1,x,0);
skritEdit.SetFocus();
slider.EnableWindow(FALSE);
}
Can you tell me why stevec1 and stevec2 aren't counting correctly.. in function ontimer there is MFCString always empty..like conversion with itoa wouldn't work..
|
|
|
|
|
Aljaz111 wrote: this->SetTimer(1,x,0);
What is the value of x ? In practice, it has a minimum value of about 15 .
Aljaz111 wrote: Can you tell me why stevec1 and stevec2 aren't counting correctly.. in function ontimer there is MFCString always empty..like conversion with itoa wouldn't work..
Have you used the debugger to step through the code to see what is going on? Much, much easier than looking at a big wad of code and wondering what could be wrong.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
value of x comes from onsliderrelease...i have slider.setrange(0,1000).. x=slider.getpos(); in function on slider released..
I used debugger..when it comes to MFCString it is always empty.. more..this button which kills ontimer shows wrong stevec1 or stevec2.. With debuger i saw that sometimes stevec1 goes +1 when numbers are randomly shown..with or without comparison for numbers--> if(MFCString==..).. When i used debuger only for chars..stevec1 is counting correctly but onbutton for killing time..stevec is wrong..as i said before..if numbers are shown sometimes stevec1 just goes +1 ...
|
|
|
|
|
hello all,
LPTSTR lptSub = ( LPTSTR ) malloc ( sizeof(LPTSTR)* 25 );
LPTSTR lptMessage = (LPTSTR) malloc ( sizeof(LPTSTR) * 256 );
_tcscat( lptMessage, lptSub );
is it fine....??
|
|
|
|
|
You probably mean sizeof(TCHAR) , since it's the size of a character you want, and not the size of the pointers.
|
|
|
|
|
Ok...
LPTSTR lptSub = ( LPTSTR ) malloc ( sizeof(TCHAR)* 25 );
LPTSTR lptMessage = (LPTSTR) malloc ( sizeof(TCHAR) * 256 );
_tcscat( lptMessage, lptSub );
now??? it is ok???
|
|
|
|
|
zakkas2483 wrote: now??? it is ok???
No. You have not verified that either is null terminated.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Nope - with the code you've shown there is no guarantee that either lptSub or lptMessage have a zero character that will a) tell _tcscat where to start copying lptSub into, and b) tell _tcscat when to stop copying lptSub into lptMessage.
And there's also the fact that you want sizeof(TCHAR) rather than sizeof(LPTSTR), as previously pointed out.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks but ...
I am having strange problem.
PTSTR lptSub = NULL;
lptSub = new TCHAR[25];
if( lptSub == NULL )
return;
LPTSTR lptMessage =NULL;
lptMessage= new TCHAR[256];
if( !lptMessage )
return;
somefun(lptSub);
MessageBox(NULL,lptSub,L"ABC",1);
///Above line display result perfectly
// Do something with the strings
_tcscat( lptMessage, L"TEMP::" );
_tcscat( lptMessage, lptSub );
MessageBox(NULL,lptMessage,L"ABC",1);
///Above line display only TEMP::
now i think by using new it is allocated with zero initially. but still the value of lptSub display in first Messagebox but not display in second messagebox.
Thank You.
|
|
|
|
|
zakkas2483 wrote: PTSTR lptSub = NULL;
lptSub = new TCHAR[25];
It doesn't matter much.
You should use ZeroMemory to keep the buffer empty. Try something like :
ZeroMemory(lptSub,BUF_SIZE);
ZeroMemory(lptMessage,BUF_SIZE2);
He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus
|
|
|
|
|