|
hi
try to use a return value of InsertItem function as index in SetItemText() instead the value that you use.
index InsertItem function returns is a current line. otherwise you can;t to know in which line your text will appeare
|
|
|
|
|
Ok thank you
any have i have solved this problem
3 days back
|
|
|
|
|
Modification: I didn't mention that I'm working under W7!
Morning all!
I have a GDI leak in a program that I'm trying to track down.
I've found various programs (GDIView, MemoryValidator, DPus, Deleaker), and none of them do what I want (though they have been useful to narrow the issue down).
What I want to do, is to be able to get a list of all the GDI handles that exist in my process - then I can make a before / after comparison to see which ones should be around, and which not.
The nearest functions I can find are GetObject , and GetObjectType - but to use those I have to loop around 4 billion times, and I get a lot of false positives - not to mention, it takes a LONG time to do 4 billion calls in an out of kernel mode.
There's also GetGuiResources , but that just gives a total.
Where's my EnumGuiResourcesEx function!?
Any hints? I've had a look at DbgHelp.dll too, and it does not seem useful in this case.
Here's hoping y'all can say "Oh, just look at the frobble sdk - it's perfect!"
Iain.
I have now moved to Sweden for love (awwww).
modified on Tuesday, May 25, 2010 7:46 AM
|
|
|
|
|
I don't know if you have already checked out this [^] (moreover I don't know if it might be helpful, as it is a bit outdated).
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.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Yes, I had... But it's out of date now.
I did miss out a vital fact that I'm working under Windows 7.
Thanks for trying though!
Iain.
I have now moved to Sweden for love (awwww).
|
|
|
|
|
This might be completely useless, but Sysinternals do a utility called, IIRC, Handle. I think you can run it against a single process. Probably shows way too much, but filtering the output sounds a lot less painful than 2^32. You might need to cobble up some way of suspending your process at appropriate before/afters.
Good luck! Leaks are the original and best PITA.
Software rusts. Simon Stephenson, ca 1994.
|
|
|
|
|
I thought I looked at Handle - and on a further check, I had.
Sadly, it's great for events, file handles, etc - but completely skips gdi handles.
I checked out devenv.exe. I can't believe VS2008 doesn't have any bitmap objects open for it's toolbars...
So, nul point, but keep trying!
Iain.
ps. I didn't think this would be hard either, but...
I have now moved to Sweden for love (awwww).
|
|
|
|
|
There are probably shed loads of functions to hook, but could you hook the various Creates and Deletes for GDI objects and keep a count of what's using what that way? There was a time when everyone under the sun was writing API hooks so there are plenty of implementations out there for 32 bit code at least.
Cheers,
Ash
|
|
|
|
|
I think this will end up being the way I go...
This is for my day job, but maybe I'll end up with an article out of it!
This looks like a good start: API Hooking with MS Detours[^]
Thanks,
Iain.
I have now moved to Sweden for love (awwww).
|
|
|
|
|
hope this[^] helps
oops, didn't refresh the page, now i saw you already had this answer, sorry
There is sufficient light for those who desire to see, and there is sufficient darkness for those of a contrary disposition.
Blaise Pascal
|
|
|
|
|
sashoalm wrote: oops, didn't refresh the page, now i saw you already had this answer, sorry
I've *never* done that.... erm...
Thanks for the thought though!
Iain.
I have now moved to Sweden for love (awwww).
|
|
|
|
|
Hey!
Don't know if this question is still actual or not (better late then never i guess) but i found this: http://www.codeguru.com/forum/archive/index.php/t-176997.html[^], they talk about a way to query all the handles of a process and their "types", don't know if this can help you at all or not, maybe it doesn't even include GDI handles, didn't try it but i thought i share, perhaps it has some usefull info.
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
> Computers are evil, EVIL i tell you!! <
|
|
|
|
|
Nice search, thanks. It does talk about the sysinternals utilities - and they skip over GDI handles, so I'm not overly optimistic. But trying it out has to be easier than writing my own hooking stuff!
Thanks,
Iain.
I have now moved to Sweden for love (awwww).
|
|
|
|
|
Hi,
I am drawing png image on button using
Graphics grpx(dc);
Image *Img = new Image(L"dleft.png",TRUE);
But I have to put the png in the relative folder. I want to put it in resource file so that I can use only exe file.
How to do that?
|
|
|
|
|
I would describe the algorithm in brief.
Step 1:Add the image to your project as resource.
Step 2:Call FindResource to retrieve HRSRC handle for the resource.Next call LoadResource API function to load the resource into the memory.
Step 3:Call CreateStreamOnHGlobal function to get IStream* pointer to the resource.
Step 4.Use the appropriate constructor of GDI+ Image/Bitmap class to create the instance and release the resources if needed.
Life is a stage and we are all actors!
|
|
|
|
|
Thank you very much...I try as you described
|
|
|
|
|
Hi,
I want to compare last five character.Is there any direct syntax for that.
Im geting secondary monitor size, to get that im using the follwing code
mi.cbSize = sizeof(mi);
GetMonitorInfo(hMonitor, &mi);
mix.cbSize = sizeof(mix);
GetMonitorInfo(hMonitor, (MONITORINFO*)&mix);
CString display;
display.Format("%s" ,(LPSTR)mix.szDevice);
if(strcmp(display,\\.\DISPLAY1)==0)
{
DualRect = mi.rcMonitor;
display.Format(" Res[%d,%d,%d,%d]",DualRect.left,DualRect.right,DualRect.top,DualRect.bottom);
AfxMessageBox(display);
}
Here display get string as "\\.\DISPLAY1" but in stringcomparison,it doesnot get passed.
Whats my mistake?
Like this i will strcmp with DISPLAY2 string and then i will get that second monitor screen size.
Anu
|
|
|
|
|
CString::ReverseFind[^]
or if you're too much into C++, string::rfind or wstring::rfind can be used.
I suggest you to use the CString version. You can find lot of string parsing functions in CString class.
To find whether a monitor is a primary or secondary, you can use dwFlags parameter in the MONITORINFO structure [^]
-Sarath.
Rate the answers and close your posts if it's answered
|
|
|
|
|
since display is a CString, the = overload may be used.
just try out this.
if(display=="\\.\DISPLAY1")
{
.......
}
and make sure, since you have \ as a character in a string, perhaps, you will have to use one more \ preceeding it.
--------------------------------------------
Suggestion to the members:
Please prefix your main thread subject with [SOLVED] if it is solved.
thanks.
chandu.
|
|
|
|
|
Anu_Bala wrote: if(strcmp(display,\\.\DISPLAY1)==0) //PROBLEM IS HERE
Well this will obviously not compile so I assume your copy and paste does not work. I am presuming that it should read:
if(strcmp(display, "\\.\DISPLAY1")==0)
but since the '\' character in a string is used to escape the next character this is still wrong, the resultant string passed to strcmp() will be "\.dISPLAY1"
It should read:
if(strcmp(display, "\\\\.\\DISPLAY1")==0)
It's time for a new signature.
|
|
|
|
|
Hi Anu,
Richard's hit the reason on the head as to why your code doesn't work. If you have this sort of problem again it always pays to see that the string you're doing the comparison with is correct - something as simple as:
::AfxMessageBox( "\\.\DISPLAY1" );
would have shown you something was wrong with the string you're comparing against.
Cheers,
Ash
PS: Three other quick point:
- You probably don't need to use CString::Format to copy the string from the structure, a constructor would have done the job.
- While I don't use CString that often doesn't it have a comparison operator you can use instead of strcmp?
- Instead of using CString why not use the string type that comes with the language? You only need CString when you're interfacing with MFC, the rest of the time std::string is a bit more flexible and with fewer conversion operators is less likely to blow up on you.
|
|
|
|
|
If you wish to compare only specific string parts in C/C++ you could just use strncmp .
Life is a stage and we are all actors!
|
|
|
|
|
Not quite. The strncmp() function lexicographically compares, at most, the first N characters in both strings. That is vastly different from which characters (e.g., middle 5, last 5) to compare.
"One man's wage rise is another man's price increase." - Harold Wilson
"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
"Man who follows car will be exhausted." - Confucius
|
|
|
|
|
Yes you are right but of course, but actually with a bit of simple logic you could compare any substrings using the same function, even the last n symbols for example:
char* a="Demo string";
char *b="Another string";
if(strncmp((char*)(a+strlen(a)-6),(char*)(b+strlen(b)-6),6)==0)
{
printf("Last 6 symbols are equal.\n");
}
else
{
printf("Last 6 symbols aren't equal\n");
}
It's not the best or even recommended practise, but It's possible.
Life is a stage and we are all actors!
|
|
|
|
|
Of course you can, since they are just addresses.
"One man's wage rise is another man's price increase." - Harold Wilson
"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
"Man who follows car will be exhausted." - Confucius
|
|
|
|