May 9, 2013 at 7:47 AM
Edited May 11, 2013 at 4:52 AM
I'm trying to hook into a target application that was written in the Qt framework, so the functions I am hooking are object methods (as opposed to static functions).
So, a random example is:
qint64 QIODevice::read ( char * data, qint64 maxSize )
I can hook something of this form, and it works fine. My delegate looks like:
delegate Int64 DDeviceRead(IntPtr Device, IntPtr data, Int64 maxSize)
(The "IntPtr Device" as the first argument is how the "thiscall" calling convention knows the object it is operating on)
Generally, I take the IntPtr Device, and pass it to a C++/CLI wrapper, which calls the function natively, and just return the result back to C#, and then back to the target application.
There are two situations that I cannot get working:
- Any object constructors. So, something like "QIODevice::QIODevice ( QObject * parent )" is tricky, because firstly I'm not sure of the correct delegate signature, and secondly, once I create a new object instance in my C++/CLI code, I try to pass
the object reference back to C# and then back to the target application, which invariably crashes. If anyone has a working example of calling a constructor in C++/CLI and passing that reference back to the target application, please let me know.
- Any method that returns a complex object rather than a simple type. For example, "QByteArray QIODevice::read ( qint64 maxSize )" returns a QByteArray, which I'm guessing I need to return as an IntPtr. (Yes, I could try to return something similar
to byte, but this is only an example - many of the functions return objects that don't map easily to simple types). Again, if anyone knows how I can pass such a return value from C++/CLI back to C# and back to the target application without it crashing,
I would love you forever ...
Just so you know, C++/CLI is very new to me, so maybe I'm stuffing up pointers and references or something like that. I can also post sample code if anyone asks for it.