인터페이스가 얻어지고, 메소드가 호출된다 : 어셈블리C++에서 인터페이스에 대한 포인터의 주소를 찾는 방법은 무엇입니까?
IFileOpenDialog *pFileOpen;
CoCreateInstance(__uuidof(FileOpenDialog), NULL, CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pFileOpen));
pFileOpen->Show(NULL);
그것은이다 ECX이다
mov eax,pFileOpen
mov ecx,dword ptr [eax]
mov edx,pFileOpen
push edx
mov eax,dword ptr [ecx+ offset_Show]
call eax
가 VMT 포인터이다 [ECX는 + offset_Show]에있어서 표시된다. offset_Show를 얻는 방법, 가능한 한 높은 수준을 유지하는 것이 바람직합니다. pFileOpen-> 포인터가 컴파일 가능하지 않음을 보여줍니다.
를 사용하여 마이크로 소프트의을 offsetof() 매크로. https://msdn.microsoft.com/en-us/library/dz4y9b9a.aspx –
shobjidl.h를 #include하기 전에 CINTERFACE를 # 정의해야합니다. 그런 다음 vtbl 선언과 offsetof (IFileDialogVtbl, Show)에 액세스 할 수 있습니다. 작동합니다. 그러나 그것은 프로그램의 나머지 부분에 매우 혼란 스럽습니다. Google은 해킹을 위해 "vtbl에서 가상 함수의 오프셋을 얻습니다." –