我正在编写一个在VBScript中使用的Windows API COM包装器,并且遇到了回调控制函数的问题,例如EnumWindows
。
这就是我目前的情况:
STDMETHODIMP CWinAPI::WinAPI_EnumWindows(BSTR lpEnumFunc, int lParam, int *Result)
{
*Result = int(EnumWindows(WNDENUMPROC(lpEnumFunc), lParam))
return S_OK;
}
但是,正如我所料,这不起作用,当我使用它与VBScript时,它会崩溃。
如何从我的COM包装器中导出EnumWindows
以在VBScript中使用,并且VBScript是否支持使用它?如果是这样,我如何在VBScript中使用EnumWindowsProc
回调函数?
更新
BSTR WindowClassName = SysAllocString(L"");
WCHAR WindowTitle[8192];
BOOL CALLBACK EnumWindowsProc(
__in HWND hWnd,
__in LPARAM lParam
)
{
RealGetWindowClass(hWnd, WindowClassName, 100);
GetWindowText(hWnd, WindowTitle, 8192);
if (0 == wcscmp(WindowClassName, L"#32768"))
{
//<< NOW, HWND need to be caught by WSH and then show it. (I.E. WScript.Echo HWND) >>
}
return TRUE;
}
STDMETHODIMP CWinAPI::WinAPI_EnumWindows(int lParam)
{
EnumWindows(EnumWindowsProc, lParam);
return S_OK;
}
Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")
WINAPI.WinAPI_EnumWindows 0
现在我做了以上,但是我需要WSH知道是否找到指定窗口类型的句柄并在内部返回HWND
并从WSH显示它,而不是直接从C ++显示。(例如via消息框)。
此函数的lParam
参数可以从VBScript设置,但如何设置EnumWindowsProc
?是否可以使用GetRef
或类似的VBSript来完成?但是GeRef
只允许一个参数。我希望这个EnumWindowsProc
回调函数也在VBScript中声明,否则包装这个函数就变得无用了。
我从@ Alex.K的评论中读到this帖子,发现它非常有用,但我无法理解如何将其与EnumWindows
的回调EnumWindowsProc
一起使用。
请帮我详细说明。