#include <iostream>
using namespace std;
// Dll provided header.
class Interface
{
public:
virtual void test() = 0;
};
Interface* GetProvidedByDLL()
{
// aligned with Interface layout.
struct Local
{
virtual void foo()
{
cout<<data<<endl;
}
int data = 9487;
};
void* temp = (void*)new Local;
// return (void*)new Local; // will fail compiling.
return static_cast<Interface*>(temp);
}
int main() {
// Assume GetProvidedByDLL is extracted by GetProcessAddress
GetProvidedByDLL()->test();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gRGxsIHByb3ZpZGVkIGhlYWRlci4KY2xhc3MgSW50ZXJmYWNlCnsKcHVibGljOgoJdmlydHVhbCB2b2lkIHRlc3QoKSA9IDA7Cn07CgpJbnRlcmZhY2UqIEdldFByb3ZpZGVkQnlETEwoKQp7CgkvLyBhbGlnbmVkIHdpdGggSW50ZXJmYWNlIGxheW91dC4KCXN0cnVjdCBMb2NhbAoJewoJCXZpcnR1YWwgdm9pZCBmb28oKQoJCXsKCQkJY291dDw8ZGF0YTw8ZW5kbDsKCQl9CgkJaW50IGRhdGEgPSA5NDg3OwoJfTsKCXZvaWQqIHRlbXAgPSAodm9pZCopbmV3IExvY2FsOwoJLy8gcmV0dXJuICh2b2lkKiluZXcgTG9jYWw7IC8vIHdpbGwgZmFpbCBjb21waWxpbmcuCglyZXR1cm4gc3RhdGljX2Nhc3Q8SW50ZXJmYWNlKj4odGVtcCk7Cn0KaW50IG1haW4oKSB7CgkvLyBBc3N1bWUgR2V0UHJvdmlkZWRCeURMTCBpcyBleHRyYWN0ZWQgYnkgR2V0UHJvY2Vzc0FkZHJlc3MKICAgICAgICAgICAgR2V0UHJvdmlkZWRCeURMTCgpLT50ZXN0KCk7CglyZXR1cm4gMDsKfQ==