Я обошел метод класса, используя CDetours
через инъекцию dll (да я изучаю реверс-инжиниринг) void MyClass::SetData( D3DXVECTOR3& data )
и в реальном приложении все работает нормально, функция отключена, и я вижу сообщения отладки (вывод на консоль).
Теперь настоящая проблема в том, что я пытаюсь сделать эту функцию вызовом, если бы она была глобальной функцией, я бы сделал:
typedef void (*SetDataFunc)(D3DXVECTOR3&); //for global functions __cdecl is ok
SetDataFunc SetDataRev = (SetDataFunc)0x00428FD0; //just an example address
then call it:
D3DXVECTOR3 data(0,0,0);
SetDataRev(data);
и все снова будет работать нормально, моя проблема в том, что даже зная адрес MyClass::SetData
и используя метод выше, чтобы вызвать его (это действительно называется), но MyClass
созданный объект останется прежним, потому что сам вызов не имеет смысла, так как вы не вызываете его из объекта.
Например
MyClass myobj;
myobj.SetData( data ); //ok any members that 'SetData' changes will be changed.
SetDataRevForClass( data ); //not ok, nothing on 'myobj' changed
Как я могу вызвать метод класса «из» myobj
на моей длл?
Это зависит от соглашения о вызовах. Вам нужно проверить, как именно функции-члены представлены в вашей перехваченной DLL. На стороне c ++ вышеприведенное объявление и присваивание неверны, тип функции-члена: void (MyClass :: *) (D3DXVECTOR3&). Как это будет переведено, зависит от соглашения о вызовах, но в любом случае указатель на объект MyClass должен быть передан во время вызова.
Других решений пока нет …