|
i am reading source code, there are lines below :
------------------------------------------------
...
WNDCLASSEX wcx;
...
wcx.cbWndExtra = sizeof(TextView *);
...
...
TextView *ptv = (TextView *)GetWindowLongPtr(hwnd, 0);
....
SetWindowLongPtr(hwnd, 0, (LONG)ptv);
....
-------------------------------------------------
i have never seen pass "0" to GetWindowLongPtr, what it means?
And another question:
MSDN says:"Valid values are in the range zero through the number of bytes of extra window memory, minus the size of an integer."
It means ((zero ~ Num of Bytes) - sizeof(int)) or (zero ~ (Num of Bytes - sizeof(int)) ) ??? What is it used for?
How to store and access the userdata associated with a window instance.
|
|
|
|
|
zhongwenjia wrote: i have never seen pass "0" to GetWindowLongPtr, what it means?
It means that extra window memory has been specified by setting the cbWndExtra member of WNDCLASSEX , and then using SetWindowLongPtr(hwnd, 0, (LONG)ptv); to store a value in that memory, at offset 0.
|
|
|
|
|
OK ! then, what are GWLP_USERDATA and DWLP_USER used for ???
What`s the difference!!!
Their offset are not zero.
Thank you very much!!!
|
|
|
|
|
GWLP_USERDATA (and DWLP_USER) are LONG_PTR-sized slots that you get for free.
If you need additional space you need to reserve some with the "cbWndExtra member of WNDCLASSEX"
as mentioned by Hanz.
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Hi all:
int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
char szBuf[100];
szBuf[10000] = 0; // Stack underflow
return(0);
}
It was said that the above code snippet will cause stack underflow, but since we got 1MB of thread stack space, we're only trying to access to 10000 byte of memory, I believe you got stack underflow when you trying to access the area beyond the stack's origin, right? Or this is because of you're trying to access to a address space which is not reserved to be exactly, instead of stack underflow.
|
|
|
|
|
Hi,
Compiler will set up a "stack frame" whenever a function is called. "stack frame" is a memory area that holds function arguments, local variables.
1 MB is the default "stack" size of a thread not the "stack frame" size, it is the total memory area of all the "stack frame" (allocated for each function) in a call graph. when this limit is exceeded you will get "stack overflow". Try a infinite recursive function to get this exception.
you in your code exceeded the "stack frame" size.
Best Regards
Raj
|
|
|
|
|
Hi, thanks for the reply,
Rajkumar_R wrote: you in your code exceeded the "stack frame" size.
sounds suspicious to me, I believe exceeded the stack will causes an access violation instead of *stack frame*, besides isn't the stack frame has variable size? and it can grows from the begining of frame to near the bottom of the stack, but in this situation, _tWinMain is the one of the first frame on the stack and I figure count from 1000 byte there's still enough space to the bottom of the stack. In addition how this is causing stack *underflow*?
-- modified at 4:20 Thursday 7th June, 2007
|
|
|
|
|
The stack grows from high memory locations to lower ones; arrays are indexed from low memory locations to higher ones; local variables are placed on the stack. Thus your code is likely to access memory "below" the bottom of the stack. While I personally wouldn’t technically class this as a stack underflow (because nothing is being popped off) it has much in common with one.
Steve
|
|
|
|
|
Stephen Hewitt wrote: The stack grows from high memory locations to lower ones; arrays are indexed from low memory locations to higher ones;
makes perfect sense to me, this way the program trying to access area beyond the origin of the stack (in your term "bottom" of the stack), thus underflow is caused. Thanks.
Stephen Hewitt wrote: While I personally wouldn’t technically class this as a stack underflow
How would you define a stack underflow?
|
|
|
|
|
LiYS wrote: How would you define a stack underflow?
Attempting to "pop" an item from an empty stack. Like Stephen said, you ain't popping, so you ain't underflowing.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I have seen MSDN for the above but what is the real reason for the usage of GetBuffer/ReleaseBuffer? In the below code the value i comes out to be 3 then what is the intent of 1024 as the arguement in GetBuffer. If I change the value to 2 i still comes out to be 3. Please explain.
CString s;<br />
s = "abc";<br />
LPTSTR p = s.GetBuffer( 1024 );<br />
int i = _tcslen((LPCTSTR)p);<br />
_tcscpy(p, _T("abc"));
ASSERT( s.GetLength() == 3 );
s.ReleaseBuffer();
|
|
|
|
|
When you call GetBuffer with 1024, 1024 bytes will be allocated as an internal buffer but your string is still 3 characters long (it is still "abc", no matter how large the buffer is).
It is the same principle as:
char szBuf[1024];<br />
strcpy(szBuff,"abc");<br />
int Size = strlen(szBuff);
|
|
|
|
|
The function pair exists because CString object deallocates/reallocates internally its buffer.
The argument supplied to GetBuffer is the minumum warranted buffer size NOT the stringh length.
GetBuffer is used whenever you want to perform operation directly with the CString buffer (usually you don't have to do it). The call to GetBuffer gives to you, at least, the requested memory size. On the other hand, you need to call ReleaseBuffer to tell the CString object you've finished with you buffer raw operations, i.e. CString object can freely (and transparently) internally reallocates memory as needed.
Hope that helps.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
|
you'd better get to work on this -- so we can see the result!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.soonr.com">SoonR Inc -- PC Power delivered to your phone</A>
|
|
|
|
|
Hi,
Can anybody tell me how to convert PLVOID[] into CSTRING?
Its urgent.
Regards
Atul
Atul Bhatt
|
|
|
|
|
You can't.
If the LPVOID points to character data, you can create a CString from that data. You'd need
to know the type of the characters (char or wchar_t) so the appropriate constructor is called.
Something like these should work:
// LPVOID pVoid = ...;
// pVoid points to unicode characters, null terminated
CString str((wchar_t *)pVoid);
// pVoid points to ANSI characters, null terminated
CString str((char *)pVoid);
If the character data is not null-terminated and you know the length, there's CString constructors
which take a length (int) as a second parameter.
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
I need to add a new message handler for a dialog box... but its giving "Cannot add a new member"...
...
i tried deleting clw file and the rebuliding it.but doesnt work.
Also all my classes are not getting displayed in class wizard.
Plz help me.
Thanks n Advance
|
|
|
|
|
How many controls do you have on the form?
|
|
|
|
|
I think you must add some member in header file , for example : in following
code , when you want add double click to add a new member in dialog, the
"Cannot add new member " message will be occur. please move the
private:
int m_iValue
below the ADX_DATA will be fixed!
// Dialog Data
//{{AFX_DATA(CDlg)
enum { IDD = IDD_DIALOG };
CButton m_ABC;
CRichEditCtrl m_RichEdit;
private:
int m_iValue
//}}AFX_DATA
Also this inidicates that the file is readonly, or that perhaps the various magic comments have
been corrupted
akt
|
|
|
|
|
I think you must add some member in header file , for example : in following
code , when you want add double click to add a new member in dialog, the
"Cannot add new member " message will be occur. please move the
private:
int m_iValue
below the ADX_DATA will be fixed!
// Dialog Data
//{{AFX_DATA(CDlg)
enum { IDD = IDD_DIALOG };
CButton m_ABC;
CRichEditCtrl m_RichEdit;
private:
int m_iValue
//}}AFX_DATA
Also this inidicates that the file is readonly, or that perhaps the various magic comments have
been corrupted
akt
|
|
|
|
|
Thanks 4 that....
but i dont have any member variable of class scope.. so the above doesn't fit the solution.
how to display all classes what i have in ma project in class wizard
Note : All my classes where not created using class wizard
Thanks in Advance.
Regards.
Arshad.
"I am just loving this....."
|
|
|
|
|
You can also declare your variables manualy.
|
|
|
|
|
hello,
I want to create a dynamic Bitmap (size + data), what is the way doing this?
I try to use CreateBitmap without big success.
Thanks.
|
|
|
|
|
Can you more explain about create a dynamic Bitmap
|
|
|
|