You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用windows-rs调用ObjectFromLresult报错0x80070057求解决

解决windows-rs中调用ObjectFromLresult返回0x80070057错误的思路

核心排查方向

  • 严格匹配参数类型:
    逐一核对ObjectFromLresult的每个参数与原C#代码的一致性:

    • lResult:必须是SendMessageW返回的有效LRESULT值(Rust中对应isize类型),确认WM_GETOBJECT消息发送无误
    • riid:确保传入的是目标COM接口的正确IID,比如IWebBrowser2的IID_IWebBrowser2,Rust中需用windows::core::GUID正确初始化,字节序列不能出错
    • wParam:保持和C#一致传0(对应Rust的WPARAM(0))
    • ppv:必须是指向COM接口指针的可变指针,比如&mut Option<IWebBrowser2>,指针类型要严格匹配
  • 确认STA线程环境:
    Internet Explorer_Server属于单线程单元(STA)组件,Rust代码必须在STA线程中运行,初始化代码示例:

    use windows::runtime::ApartmentType;
    
    fn main() -> windows::core::Result<()> {
        windows::runtime::init_apartment(ApartmentType::SingleThreaded)?;
        // 后续业务逻辑
        Ok(())
    }
    
  • 二次验证句柄状态:
    即使已确认是Internet Explorer_Server句柄,也要通过GetWindowThreadProcessId检查句柄所属进程是否活跃,避免操作已销毁的窗口

简化实现示例

以下是调用ObjectFromLresult获取IWebBrowser2的代码片段:

use windows::{
    core::{GUID, HRESULT},
    Win32::{
        Foundation::{HWND, LRESULT, WPARAM, LPARAM},
        System::Com::{ObjectFromLresult, IID_IWebBrowser2},
        UI::WindowsAndMessaging::{SendMessageW, WM_GETOBJECT},
    },
};

fn get_webbrowser(hwnd: HWND) -> windows::core::Result<impl windows::Win32::WebBrowser::IWebBrowser2> {
    const OBJID_NATIVEOM: u32 = 0xFFFFFFF0;

    let lresult = unsafe { SendMessageW(hwnd, WM_GETOBJECT, WPARAM(OBJID_NATIVEOM as usize), LPARAM(0)) };
    if lresult == 0 {
        return Err(windows::core::Error::from(HRESULT(0x80004005)));
    }

    let mut browser: Option<windows::Win32::WebBrowser::IWebBrowser2> = None;
    unsafe {
        ObjectFromLresult(
            lresult,
            &IID_IWebBrowser2,
            WPARAM(0),
            &mut browser as *mut _ as *mut _,
        )?;
    }

    browser.ok_or_else(|| windows::core::Error::from(HRESULT(0x80004005)))
}

额外注意事项

  • 所有COM接口操作必须在初始化的STA线程中执行,禁止跨线程调用COM对象
  • 检查SendMessageW返回值,若为0说明WM_GETOBJECT消息未被目标窗口正确处理
  • 确保使用最新稳定版的windows crate,避免版本兼容问题导致的API调用异常

内容的提问来源于stack exchange,提问作者Ohad Dahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:52:19