|
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
|
|
|
|
|
simple and excellent logic...
Truth Can'nt be changed
|
|
|
|
|
Can someone please give an explanation of the following instruction? const size_t size = A.size();
|
|
|
|
|
The answer depends on what A is, since size is one of its members.
Steve
|
|
|
|
|
The constant size is initialized with the return value of the call to the size method of the A object (probably an instance of a container class).
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]
|
|
|
|
|
computerpublic wrote: A.size();
can you let me know the datatype of A
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Hey everyone, my problem is I keep getting compile errors and i can not pin point the problem
errors:
2>c:\users\rob\school work\information technology\computer programming with c++\projects\etc\ect_1\countptr.hpp(37) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
2> c:\users\rob\school work\information technology\computer programming with c++\projects\etc\ect_1\countptr.hpp(71) : see reference to class template instantiation 'CountedPtr<T>' being compiled
2>c:\users\rob\school work\information technology\computer programming with c++\projects\etc\ect_1\countptr.hpp(37) : error C2143: syntax error : missing ',' before '&'
2>c:\users\rob\school work\information technology\computer programming with c++\projects\etc\ect_1\countptr.hpp(37) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
2> c:\users\rob\school work\information technology\computer programming with c++\projects\etc\ect_1\refsem1.cpp(11) : see reference to class template instantiation 'CountedPtr<T>' being compiled
2> with
2> [
2> T=int
2> ]
2>c:\users\rob\school work\information technology\computer programming with c++\projects\etc\ect_1\countptr.hpp(37) : error C2143: syntax error : missing ',' before '&'
.hpp file
#ifndef COUNTED_PTR_HPP
#define COUNTED_PTR_HPP
template <typename T>
class CountedPtr
{
private:
T* ptr;
long* count;
public:
explicit CountedPtr(T* p = 0) : ptr(p), count(new long(1))
{
}
CountedPtr(const CountedPtr<T>& p) throw() : ptr(p.ptr), count(p.count)
{
++count;
}
~CountedPtr() throw()
{
release();
}
CountedPtr<T>& operator= (const CounterPtr<T>& p) throw ()
{
if (this != &p)
{
release();
ptr = p.ptr;
count = p.count;
++*count;
}
return *this;
}
T& operator*() const throw ()
{
return *ptr;
}
T* operator->() const throw()
{
return ptr;
}
private:
void release()
{
++*count;
if (*count == 0)
{
delete count;
delete ptr;
}
}
};
#endif //COUNTED_PTR_HPP
.cpp file
#include <iostream>
#include <list>
#include <deque>
#include <algorithm>
#include "countptr.hpp"
using namespace std;
void printCountedPtr(CountedPtr<int> elem)
{
cout << *elem << ' ';
}
int main()
{
typedef CountedPtr<int> IntPtr;
deque<IntPtr> coll1;
list <IntPtr> coll2;
static int values [] = {3,5,9,1,6,4};
for (unsigned i = 0; i < sizeof(values)/sizeof(values[0]); ++i)
{
IntPtr ptr(new int(values[i]));
coll1.push_back(ptr);
coll2.push_front(ptr);
}
for_each(coll1.begin(), coll1.end(), printCountedPtr);
cout << endl;
for_each(coll2.begin(), coll2.end(), printCountedPtr);
cout << endl;
*coll1[2] *= *coll1[2];
(**coll1.begin()) *= -1;
(**coll2.begin()) = 0;
for_each(coll1.begin(), coll1.end(), printCountedPtr);
cout << endl;
for_each(coll2.begin(), coll2.end(), printCountedPtr);
cout << endl;
}
Thanks For all the help,
RobNO
|
|
|
|
|
First, it would have been helpful if you had marked the error locations for us
I counted to line 37 and found this:
CountedPtr<T>& operator= (const CounterPtr<T>& p) throw ()
{
if (this != &p)
{
release();
ptr = p.ptr;
count = p.count;
++*count;
}
return *this;
}
Have a look at the spelling where I've underlined.
Steve
|
|
|
|
|
Thank you very much! Next Time I will try to indicate where the error is.
RobNO.
|
|
|
|