ATL COM — функция обратного вызова EnumWindows не работает с IDispatch :: Invoke

Я пытаюсь реализовать функцию обертки для EnumWindows Функция API должна быть включена в мою оболочку dll, поэтому ее можно использовать со многими языками сценариев.

Прежде всего, я должен был проверить это с помощью VBScript. Я реализовал функцию-обертку и функцию обратного вызова для EnumWindows с помощью моих полезных исследований, но это не работает, как я хочу.

Вот код, который у меня сейчас есть:

Функции обертки для EnumWindows а также EnumWindowsProc Перезвоните:

BOOL CALLBACK EnumWindowsProc(__in HWND hWnd, __in LPARAM lParam) {

LPENUMWINDOWSPARAMS pewParams;
VARIANT vhWnd, vResult; HRESULT HR = S_OK;

VariantInit(&vhWnd);
VariantInit(&vResult);

vhWnd.vt = VT_I4;
vhWnd.lVal = (LONG)(LONG_PTR)hWnd;

pewParams = reinterpret_cast<LPENUMWINDOWSPARAMS>(lParam);
// ^ PASSING MY PARAMETERS THROUGH LPARAM

CComVariant varArgs[2] = { &vResult, &vhWnd };
DISPPARAMS Parameters = { &varArgs[0], NULL, 2, 0 };

pewParams->DISPATCH->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &Parameters, &vResult, NULL, NULL);
// ^ I SUSPECT SOMETHING IS WRONG WITH THIS INVOKE METHOD. BUT IT RETURNS S_OK.

if (vResult.vt != VT_BOOL) { HR = DISP_E_TYPEMISMATCH; }

pewParams->CallbackResult.vt = VT_ERROR;
pewParams->CallbackResult.scode = HR;

if (HR == S_OK)
return (vResult.boolVal == VARIANT_TRUE ? TRUE : FALSE);
else
return FALSE;
}

STDMETHODIMP CWinAPI::WinAPI_EnumWindows(VARIANT EnumFunc, int lParam, int *Result) {

ENUMWINDOWSPARAMS ewParams; HRESULT HR = S_OK;

switch (EnumFunc.vt)
{
case VT_DISPATCH:
ewParams.DISPATCH = EnumFunc.pdispVal;
break;

case VT_VARIANT | VT_BYREF:
if (EnumFunc.pvarVal->vt == VT_DISPATCH) { ewParams.DISPATCH = EnumFunc.pvarVal->pdispVal; }
break;

default: return DISP_E_TYPEMISMATCH;
}

ewParams.lParam = reinterpret_cast<LPVARIANT>(&lParam);

*Result = (int)EnumWindows(EnumWindowsProc, reinterpret_cast<LPARAM>(&ewParams));

HR = ewParams.CallbackResult.scode;

return HR;
}

ENUMWINDOWSPARAMS состав:

typedef struct tagENUMWINDOWSPARAMS {
LPDISPATCH DISPATCH;
LPVARIANT lParam;
VARIANT CallbackResult;
} ENUMWINDOWSPARAMS, *PENUMWINDOWSPARAMS, *LPENUMWINDOWSPARAMS;

Вот тестовый VBScript, который я сейчас использую:

Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")

Function EnumWindowsProc(HWND, lParam)
WScript.Echo "Handle to the window: 0x" + CStr(UCase(Hex(HWND)))
EnumWindowsProc = True
End Function

Dim Result: Result = WINAPI.WinAPI_EnumWindows(GetRef("EnumWindowsProc"), 0)
WScript.Echo "EnumWindows returned " + CStr(Result)

Одно работает, EnumWindows возвращается True,
Но вместо того, что я ожидаю, я не получаю эхом ручки окон.
И когда я звоню GetLastError, это возвращает ERROR_SUCCESS,

Заранее спасибо за вашу помощь.

1

Решение

Я исправил проблему, ничего особенного, только небольшое изменение:

Изменено varArgsтип от CComVariant в VARIANT как это:

VARIANT varArgs[2] = { vResult, vhWnd };

Изменено DISPPARAMS как показано ниже:

DISPPARAMS Parameters = {};
Parameters.cArgs = 2;
Parameters.rgvarg = varArgs;

Invoke метод все тот же:

pewParams->DISPATCH->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &Parameters, &vResult, NULL, NULL);

Любые хорошие предложения приветствуются.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector