代码之家  ›  专栏  ›  技术社区  ›  GTAVLover

从COM接口中的函数返回多个值

  •  0
  • GTAVLover  · 技术社区  · 7 年前

    我做了一项研究,并为实现了一个包装器函数 GetWindowRect API,它运行良好。但它目前只能通过 SAFEARRAY

    我这样宣布:

    [id(10)] HRESULT WinAPI_GetWindowRect([in] VARIANT hWnd, [out, retval] SAFEARRAY(VARIANT) *lpRect);
    
    STDMETHOD(WinAPI_GetWindowRect)(VARIANT hWnd, SAFEARRAY **lpRect);
    

    和实施:

    STDMETHODIMP CWinAPI::WinAPI_GetWindowRect(VARIANT hWnd, SAFEARRAY **lpRect {
    
        CComSafeArray<VARIANT> CCSA_RECT;
        RECT Rect;
        HRESULT HResult;
    
        if (!lpRect) { return E_INVALIDARG; }
    
        *lpRect = nullptr;
    
        int Result = (int)GetWindowRect(VariantToHWND(hWnd), &Rect);
        //   ^ I ALSO WANT TO RETURN THIS RESULT TOO
    
        if (Result != 0)
        {
            HResult = CCSA_RECT.Create(4, 0);
            assert(HResult == S_OK);
    
            CCSA_RECT[0] = Rect.left;
            CCSA_RECT[1] = Rect.top;
            ...
        }
        else
        { ... }
    }
    

    [out, retval] 值,那么有没有关于如何返回此值的建议( Result

    当我试着这样归还时:

    [id(10)] HRESULT WinAPI_GetWindowRect([in] VARIANT hWnd, [out] SAFEARRAY(VARIANT) *lpRect, [out, retval] VARIANT *Result);
    
    STDMETHOD(WinAPI_GetWindowRect)(VARIANT hWnd, SAFEARRAY **lpRect, VARIANT *Result);
    

    按如下方式分配:

    Result->intVal = (int)GetWindowRect(VariantToHWND(hWnd), &Rect);
    

    Type mismatch 尝试使用VBScript时,下面的VBScript行出错:

    Dim lpRect, Result: Result = WINAPI.WinAPI_GetWindowRect(AutoItX3.WinGetHandle("[CLASS:ConsoleWindowClass]"), lpRect)
    

    我想要这个 成为 [out] 参数和 后果 作为返回值。

    1 回复  |  直到 7 年前
        1
  •  0
  •   GTAVLover    7 年前

    我通过使用 VARIANT [out] 参数如下:

    [id(10)] HRESULT WinAPI_GetWindowRect([in] VARIANT hWnd, [out] VARIANT *Result, [out, retval] SAFEARRAY(VARIANT) *lpRect);
    
    STDMETHOD(WinAPI_GetWindowRect)(VARIANT hWnd, VARIANT *Result, SAFEARRAY **lpRect);
    

    STDMETHODIMP CWinAPI::WinAPI_GetWindowRect(VARIANT hWnd, VARIANT *Result, SAFEARRAY **lpRect) {
    
        CComSafeArray<VARIANT> CCSA_RECT;
        RECT Rect;
        HRESULT HResult;
    
        if (!lpRect) { return E_INVALIDARG; }
    
        *lpRect = nullptr;
    
        VariantInit(Result);
        Result->vt = VT_I2;
    
        Result->intVal = (int)GetWindowRect(VariantToHWND(hWnd), &Rect);
    
        if (Result->intVal != 0)
        {...}
        else
        {...}
    
    }
    

    这已使用以下VBScript进行了测试:

    Dim AutoItX3: Set AutoItX3 = WScript.CreateObject("AutoItX3.Control")
    Dim WINAPI: Set WINAPI = WScript.CreateObject("WinAPIWrapperLib.WINAPI")
    
    Dim lpRect, Result: lpRect = WINAPI.WinAPI_GetWindowRect(AutoItX3.WinGetHandle("[CLASS:ConsoleWindowClass]"), Result)
    
    WScript.Echo "GetWindowRect returned: " + CStr(Result)
    
    If CInt(Result) <> 0 Then
        For iNum = 0 To UBound(lpRect)
            WScript.Echo CStr(lpRect(iNum))
        Next
    End If
    
    WScript.Echo(CStr(WINAPI.WinAPI_GetLastErrorMessage))
    

    但是,我仍然无法使用 SAFEARRAY [输出] [输出] Result [out, retval]

    [id(10)] HRESULT WinAPI_GetWindowRect([in] VARIANT hWnd, [out] SAFEARRAY(VARIANT) *lpRect, [out, retval] VARIANT *Result);
    

    仍然导致 Type mismatch 错误