使用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消息未被目标窗口正确处理 - 确保使用最新稳定版的
windowscrate,避免版本兼容问题导致的API调用异常
内容的提问来源于stack exchange,提问作者Ohad Dahan
相关产品推荐
相关产品推荐

