브라우저 도우미 개체에 대해 this example code을 이해하려고합니다.C++에서 여러 COM 인터페이스를 구현하는 방법은 무엇입니까?
내부에서는 작성자가 여러 인터페이스 (IObjectWithSite, IDispatch)를 노출하는 단일 클래스를 구현합니다.
자신의 QueryInterface 함수는 다음을 수행합니다
if(riid == IID_IUnknown) *ppv = static_cast<BHO*>(this);
else if(riid == IID_IObjectWithSite) *ppv = static_cast<IObjectWithSite*>(this);
else if (riid == IID_IDispatch) *ppv = static_cast<IDispatch*>(this);
나는 C의 관점에서, 인터페이스 포인터는 단지 vtable을에 대한 포인터 것을 배웠습니다. 그래서 C++이 static_cast를 사용하여 구현 된 인터페이스의 VTable을 반환 할 수 있다는 것을 의미합니다.
이 방법으로 구성된 클래스는 메모리에 VTables 묶음이 있다는 것을 의미합니까 (IObjectWithSite, IDispatch 등)? C++은 서로 다른 인터페이스 (각각 QueryInterface, AddRef 및 Release 함수가 있음)에서 이름 충돌을 어떻게 처리합니까? 각각에 대해 서로 다른 메소드를 구현할 수 있습니까?
고마워요! 내 자신의 일부 독서 짓을하고 그것이 다른 VTables를 만들뿐만 아니라 일반적인 기능으로 다시 리디렉션하기 전에 포인터를 수정하는 "썽크"함수를 만듭니다 발견했습니다. – Martin