I haven't used Detours in a few years, but offhand I can think of a few problems with hooking Qt class methods.
The first problem is the ABI (Application Binary Interface) used by Qt. This differs from the ABI used by Windows APIs or by COM objects, and in fact can (and does) vary between compiler implementations.
The second problem is the C++ name mangling - there is no standard way of mangling names. You would have research the exported name (which might be something like QPushButton$event$QEventP$bool and might be something totally different), and do this for every function that you wish to intercept. Again, this depends on the compiler used to compile Qt.
Can you give us some idea of the problem you are trying to solve? Perhaps there is a better way to do this.
I stand by the points that I made in my first reply. You must either statically link with the Qt DLL (and can then extract a pointer to the method) or dynamically load the Qt DLL (and use GetProcAddress() with the mangled method name).
IIRC, the source code for Qt is available for download. An examination of the make file would give you the compiler and compiler options used, which would give you the calling convention and the mangled name for the C++ method. You may then write a class that uses the same calling conventions, and contains a method with the same signature as the method that you wish to intercept. This should get you close enough to working code that debugging would be feasible. For example:
class QT_API MyQPushButton
boolevent( void* data )
// your code goes here
Finally, I was wrong : I found an easier way.
I just create a Qt DLL that I inject in the destination process, then I get the QWidget* from the main hWnd and I can enumerate all children from there and do what I want on any Qt pseudo-control
Thanks for answers.
Yes, I saw that article, but there is a solution to customize the scrollbars controls (stand alone scrollbars, CScrollbar control, I mean), or, in my situation, the grid control has it's own scrollbars ... I don't know how to customize the control scrollbars ... if I well understanding ...
Later edit: Yes, I could use your solution, but for that I should hide the grid control scrollbars, put these ones, and sincronize the grid and the scrollbar control ... but I guess on this road, I'll meet another problems ... and I think it the longest road ...
I am writing a membership program in C++ and MFC (Yes I know that is old hat these days!) and I want it to be able to send HTML emails with attachments and use BCC list.
My initial attempt uses MAPI functions. This has two problems :
1) If the application is built as a UNICODE application, but the MAPI client is MBCS (or visa versa) then the MAPI calls fail.
2) Not all mail clients are MAPI compliant. Outlook is, but Outlook Express and various shareware mail clients are not. Also a lot of people use cloud based systems.
What method can I use to send emails that will work with most (if not all) Windows systems?
Thank you for stating the bleeding obvious. I have already done that. It comes up with a list of articles (277 of them) with those words in them. It does not come up with a recommendation of which of the many methods is the most flexible; which one overcomes the 32/64 bit problem; what the pros and cons of each method are. The Code Project search engine, whilst very good at finding words in articles, is ill equipped to give recommendations. I have already tried one of the articles (Using extended MAPI) and found problems with it. Rather than trying the other 276 articles in turn, I thought I would seek advice on the matter from the friendly people at Code Project. I find that asking humans these sorts of questions yields better results. Well most of the time anyway. Occasionally you get someone who has had a bad day and feels the need to take it out on someone else. If you don't know the answer to my question or you don't understand the question then don't be shy. Let me know and I will try to explain myself in more simpler terms for you.
At which point in your original question did you make mention of the fact that you had in fact done some degree of research, particularly that you had reviewed CP's articles?
If you don't state what you've done, how can you expect someone not to suggest the very same thing?
Furthermore, you make mention that you realize MFC is old hat, which is irrelevant, yet make no mention of research, only of the failings of your initial attempt.
Frankly, your reply post is one I consider rather rude and I'd be surprised to learn I was alone in thinking like this. I hope the rest of your day improved/s.
"When I was 5 years old, my mother always told me that happiness was the key to life. When I went to school, they asked me what I wanted to be when I grew up. I wrote down 'happy'. They told me I didn't understand the assignment, and I told them they didn't understand life." - John Lennon
I'm not really familiar with the stuff you're using, and I haven't used C++ for a few years, but from what I remember any functions in the Windows API that changed between character types depending on precomiler definitions had other similarly named functions.
I remember the function to show a message box was called MessageBox(), and internally it mapped to either MessageBoxA() or MessageBoxW() depending on precompiler definitions.
Maybe you'll find something similar with your function for sending the mail?
Then depending on how speedy you need it to run you could write some code to attempt the other version of the function if the first try failed, or if you need it faster try to detect what the MAPI client needed you to use and have some kinda fancy interface, function pointer, etc to convert your text and send it using the right format.
Alternatively, you could try using .Net from C++ to use all of the email junk built into that - though I'm kinda assuming you're avoiding needing to install the entire .Net framework alongside your application.
I'm studying MMS Protocol in order to develop the program connecting to FM Radio broadcast of which the url scheme is mms://domain_name/sub_name(directory name?) such as mms://wmc1.liquidviewer.net/WEEI
I can obtain the ip address of mms url above, but i don't know the meaning of sub_name. it's important when i write tcp socket code.
The socket function usually takes ip address and port number.
The MMS protocol's port number is used with 1755.
If i have ip address and port number, i can write code as below.
const int MMF_PROTOCOL = 1755;