Не создается указатель для обращения к функции

Раньше работал с ней таким способом:

IEnumWbemClassObject* pEnumerator = NULL;
hRes = pService->ExecQuery((BSTR)"WQL",
(BSTR)"SELECT * FROM Win32_Processor",
WBEM_FLAG_FORWARD_ONLY,
NULL,
&pEnumerator)

Теперь необходимо вызвать примерно так:

VOID(WINAPI* TrueSleep)(DWORD dwMilliseconds) = Sleep; //пример для функции Sleep()

Я делаю так, но получаю ошибку

 VOID(WINAPI* ExecQuery)(BSTR argument) = Sleep; 

Ответы (1 шт):

Автор решения: mik.ov
  1. Стиль си:
#define EXEC_QUERY_ID 20

typedef HRESULT(__stdcall *PFN_WbemServicesExecQuery)(IWbemServices * This,
                                                      const BSTR strQueryLanguage,
                                                      const BSTR strQuery,
                                                      long lFlags,
                                                      IWbemContext *pCtx,
                                                      IEnumWbemClassObject **ppEnum);


IWbemServices * pWbemServices;
PFN_WbemServicesExecQuery *vtbl_ptr =
                           (PFN_WbemServicesExecQuery*) *((char**) pWbemServices);

PFN_WbemServicesExecQuery pfn_ptr = vtbl_ptr[EXEC_QUERY_ID];

// call

pfn_ptr(pWbemServices, ...);
  1. Стиль c++:
typedef HRESULT(__stdcall IWbemServices::*PFN_ExecQuery)(const BSTR strQueryLanguage,
                                                         const BSTR strQuery,
                                                         long lFlags,
                                                         IWbemContext *pCtx,
                                                         IEnumWbemClassObject **ppEnum);

PFN_ExecQuery pQuery = &IWbemServices::ExecQuery;

// call

(pWbemServices->*pQuery)(...);
→ Ссылка