|
Hi Mark. What are those situations?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
I haven't tested, but apparently apps running as administrator
won't receive the message from non administrator apps, like explorer
generally is running.
It's probably rare that an administrative application is going to care
about that message anyway, but it's possible
I should really try it out one of these days - it's on my TODO list....i just
only seem to be able to crash the explorer when I don't want to. hmmm - just
killing the process should do it...
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hello,
I try to understand memory management and pointers in C on a simple level right now.
Here is the task: concatenate 2 buffers (in this case buffA & buffB to buffAB). The values of the following code-snipets are small for debugging purposes ... imagine the size of each source buffer is much larger: how can I propper clean up the "mess" after creating buffAB?
<br />
char buffA[] = {'a'};<br />
char* p_buffA = &buffA[0];<br />
<br />
char buffB[] = {'b','b'};<br />
char* p_buffB = &buffB[0];<br />
<br />
char buffAB[] = {'x','x','x'};<br />
char* p_buffAB = &buffAB[0];<br />
<br />
memcpy(p_buffAB, p_buffA, 1);
memcpy(p_buffAB+1, p_buffB, 2);
<br />
<br />
I am thankfull for all suggesting to improve the code.
|
|
|
|
|
since you didn't dynamically allocate anything (with new or malloc, etc), there's nothing to clean up.
|
|
|
|
|
_NielsB wrote: // buffAB is the only thing we want ... how to clean up the rest?
clean up is called free in C language and works on dynamic allocated memory, i.e. it should pair a previous call to malloc (or another allocation function, like calloc ).
For instance:
char * pB = malloc(2);
pB[0]='b';
pB[1]='b';
char * pA = malloc(1);
pA[0]='a';
char * PAB = malloc(3);
memcpy(pAB, pA, 1 );
memcpy(pAB+1, pB, 2);
free(pA);
free(pB);
Note that I've omitted (to keep code compact) malloc return value check, but you must always do it in real programming, i.e.
char *p=malloc(10);
if ( ! p )
{
}
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.
[my articles]
|
|
|
|
|
Hello again!
Thank you for your adwises
The real task I want to test is to append buffB to buffA. Asume there is a function-call that gives me 2 pointers to buffers (p_buffA and p_buffB) and the size of each of them (n_A and n_B). The function should retur the new pointer to buffA and the new size (f.e. saved in a struct).
Now I am using c++ new / delete to allocate and free memory.
<br />
int n_A = 30; <br />
char* p_buffA = new char[n_A];<br />
memset(p_buffA, (int)'a', n_A);<br />
<br />
int n_B = 50;<br />
char* p_buffB = new char[n_B];<br />
memset(p_buffB, (int)'b', n_B);<br />
<br />
int n_AB = n_A + n_B;<br />
char* p_buffAB = new char[n_AB];<br />
<br />
memcpy(p_buffAB, p_buffA, n_A);
memcpy(p_buffAB+n_A, p_buffB, n_B);
<br />
delete [] p_buffA;<br />
delete [] p_buffB;<br />
<br />
p_buffA = p_buffAB;<br />
n_A = n_AB;<br />
<br />
Is this snipet ok?
Are there better ways to solve this issue?
|
|
|
|
|
It is ok. But you have always check for pointer validity, for instance
char* p_buffA = new char[n_A];
if ( !p_buffA )
{
}
...
You have also the option to use realloc :
int n_A = 30;
char* p_buffA = (char*) malloc(n_A);
memset(p_buffA, (int)'a', n_A);
int n_B = 50;
char* p_buffB = (char*) malloc(n_B);
memset(p_buffB, (int)'b', n_B);
char* p_buffA = realloc[p_BuffA, n_A + n_B];
memcpy(p_buffA + n_A, p_buffB, n_B);
free(p_buffB);
(as stated above you've always to check return value of allocation function)
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.
[my articles]
|
|
|
|
|
Looks nice
Thnaks alot.
|
|
|
|
|
Trying to search the web in a loop, hitting the search engine with a new query with each iteration (with thousands of terms for this particular application). Don't know frankly if that's even allowed, as google kicks you off if you try to do it. But the following code below uses the COM IWebBrowser2 interface to an open InternetExplorer. Don't know if that is considered antiquated or there's a faster way to do it, because right now I'm just getting about a page per second. Is there a faster way than the following:
SHDocVw::IWebBrowser2Ptr brwsr = NULL;
.
.
.
brwsr = SHDocVw::IWebBrowser2Ptr(spDisp);
.
.
.
strcpy(srch_engn,"http://www.mysearch.com/search/GGmain.jhtml?searchfor");
sprintf(szURL,"%s=%s+%%22",srch_engn,q_misc);
char* szSrch = szURL+strlen(szURL);
while (1) {
strcpy(szSrch,getNextSrch(...));
BSTR bstr = ConvertStringToBSTR(szURL);
brwsr->Navigate(bstr);
VARIANT_BOOL busy;
READYSTATE rs;
while(1) {
Sleep(200);
brwsr->get_Busy(&busy);
if (!busy) break;
brwsr->get_ReadyState(&rs);
if (rs == READYSTATE_LOADED) break;
if (rs == READYSTATE_COMPLETE) break;
}
brwsr->Stop();
.
.
.
}
|
|
|
|
|
After the Stop statement above, here's how I process the returned page (as I guess that might be the bottleneck):
if (rsltDoc = IHTMLDocument2Ptr(brwsr->GetDocument())) {
HRESULT hr = rsltDoc->get_body(&body);
if (!FAILED(hr)) {
BSTR bstr_b;
hr = body->get_innerText(&bstr_b);
if (!FAILED(hr)) {
char* szBody = ConvertBSTRToString(bstr_b);
if (!strstr(szBody,szNotFound)) {
pf_fmt(szSrch);
fprintf(f,"%s\n\n",szSrch);
printf("%s\n\n",szSrch);
bMatch = TRUE;
}
delete [] szBody;
SysFreeString(bstr_b);
}
}
}
|
|
|
|
|
Hello
How can I disable/enable hibernation programatically in C++ in VS.NET ?
Or need to change registry values?
Thank you for any help ..will really help
modified on Saturday, January 12, 2008 3:08:48 PM
|
|
|
|
|
tibiz wrote: Or need to change registry values?
You can use RegSetValueEx() .
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Thanx, I know about registry setting.
I'm trying using the GLOBAL_POWER_POLICY and if it will not help, maybe the reg. settings. Can you post me the place where to find the reg. entry ?
|
|
|
|
|
tibiz wrote: Can you post me the place where to find the reg. entry ?
It will be in the following value:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power\Heuristics
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
<br />
bool SetHibState(BYTE state)<br />
{<br />
HKEY hKey;<br />
HKEY hk;<br />
<br />
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, SUBKEY, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {<br />
<br />
BYTE byteRegData[255];<br />
DWORD dwBufLen = 255;<br />
<br />
LONG lRet;<br />
if((lRet = RegQueryValueEx(hKey, VALNAME, NULL, NULL, byteRegData, &dwBufLen)) == ERROR_SUCCESS) {<br />
RegCloseKey(hKey);<br />
<br />
byteRegData[6]=(BYTE)state;<br />
<br />
<br />
if(!RegCreateKey(HKEY_LOCAL_MACHINE, SUBKEY, &hk)) {<br />
<br />
RegSetValueEx(hk, VALNAME, 0, REG_BINARY, (LPBYTE)byteRegData, (DWORD)dwBufLen);<br />
RegCloseKey(hk);<br />
} <br />
else return false;<br />
}<br />
else {<br />
RegCloseKey(hKey);<br />
return false;<br />
}<br />
}<br />
<br />
return true;<br />
}<br />
</dwbuflen;i++)>
.... but the problem is, the system won't give any reaction to the change, in power options is still the old setting
|
|
|
|
|
If you are merely trying to keep a system 'alive' consider investing these coding tips into your application, from the MDSN topic: Using Power Management, instead of disabling the hibernate policy altogether, just keep system awake while your program is running. If user does NOT run your program, then there might be no reason the system should not hibernate. If yu need to perform some task at a scheduled time, then let it hibernate, but consider setting a waitable timer. This will wake system up and your process will resume.
|
|
|
|
|
I've tested it doesn't flick without popping up the context menu.
With the menu, the backgroup is erase automatically.
Any way to make it flicking free?
Thanks a lot.
|
|
|
|
|
followait wrote: With the menu, the backgroup is erase automatically.
backgroup? What's behind/under the menu? One of your windows?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Yes, the view.
In OnRButtonDown I draw the memory graphics(GDI+) and call CView::OnRButtonDown .
I have the same code in CView::OnLButtonDown , it doesn't flick with no context menu.
The framework (generated by BCG app wizard) has such a function:
void CMyView::OnContextMenu(CWnd*, CPoint point)
{
theApp.ShowPopupMenu (IDR_CONTEXT_MENU, point, this);
}
modified on Saturday, January 12, 2008 9:28:51 PM
|
|
|
|
|
Did you ever solve this?
If not, can you reproduce it in a simple project?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Can anybody tell me the difference between stack & heap? or any relating tutorial.
|
|
|
|
|
|
|
A simple difference is:
1. To declare a variable of size 4G in the stack will usually crash.
struct A {
unsigned char[0xFFFFFFFE];
} obj;
2. To allocate a variable of size 4G in the heap is OK.
A* p = new A;
Maxwell Chen
|
|
|
|
|
Hey Max:
(1) There's no hope to compile that code.
(2) 4GB=0x100000000
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.
[my articles]
|
|
|
|
|