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

如何在C++中使用WinINet API调用系统默认浏览器打开指定URL

Windows C++ 调用默认浏览器打开OTP页面+WinINet状态查询示例

前置说明

WinINet 是Windows系统提供的HTTP客户端网络库,本身不具备启动外部程序的能力,打开系统默认浏览器的标准实现依赖ShellExecute API,以下示例包含完整的OTP认证流程代码,同时覆盖启动浏览器和WinINet网络请求的逻辑。

编译配置

  • 需要引入头文件:<windows.h>、<wininet.h>
  • MSVC编译时需链接wininet.lib,可直接通过预处理指令指定:#pragma comment(lib, "wininet.lib")

完整可运行代码

#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <string.h>

#pragma comment(lib, "wininet.lib")

int main() {
    // 替换为你实际的OTP认证页面地址
    const char* otp_page_url = "https://你的认证服务地址/otp-input";
    // 替换为你实际的认证状态查询接口地址
    const char* auth_check_url = "https://你的认证服务地址/api/check-auth";

    // 1. 调用系统默认浏览器打开OTP输入页面
    HINSTANCE open_ret = ShellExecuteA(
        NULL,
        "open",
        otp_page_url,
        NULL,
        NULL,
        SW_SHOWNORMAL
    );

    // 校验浏览器启动结果
    if ((INT_PTR)open_ret <= 32) {
        printf("启动浏览器失败,错误码:%lu\n", GetLastError());
        return 1;
    }
    printf("OTP页面已打开,请在浏览器中完成验证\n");

    // 2. 初始化WinINet,轮询认证状态
    HINTERNET h_inet = InternetOpenA(
        "OTP-Auth-Client/1.0",
        INTERNET_OPEN_TYPE_PRECONFIG,
        NULL,
        NULL,
        0
    );
    if (!h_inet) {
        printf("WinINet初始化失败,错误码:%lu\n", GetLastError());
        return 1;
    }

    BOOL auth_success = FALSE;
    int retry_times = 0;
    const int max_retry = 30; // 最多轮询30次,每次间隔2秒,总超时1分钟
    char resp_buf[1024] = {0};

    while (retry_times < max_retry && !auth_success) {
        HINTERNET h_req = InternetOpenUrlA(
            h_inet,
            auth_check_url,
            NULL,
            0,
            INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE,
            0
        );
        if (h_req) {
            DWORD read_bytes = 0;
            if (InternetReadFile(h_req, resp_buf, sizeof(resp_buf) - 1, &read_bytes)) {
                resp_buf[read_bytes] = '\0';
                // 此处根据你服务端的返回规则判断是否认证完成,示例以返回"auth_ok"为成功标识
                if (strstr(resp_buf, "auth_ok") != NULL) {
                    auth_success = TRUE;
                    printf("OTP认证成功\n");
                }
            }
            InternetCloseHandle(h_req);
        }
        if (!auth_success) {
            Sleep(2000);
            retry_times++;
        }
    }

    if (!auth_success) {
        printf("认证超时,请重试\n");
    }

    // 释放WinINet资源
    InternetCloseHandle(h_inet);
    return 0;
}

注意事项

  • ShellExecute会自动读取系统默认浏览器配置,无需额外适配Chrome、Edge等不同浏览器
  • WinINet创建的所有句柄使用完毕后必须调用InternetCloseHandle释放,避免资源泄漏
  • 轮询的间隔、最大重试次数可以根据业务需求自行调整,也可以替换为长连接等其他状态同步逻辑

内容的提问来源于stack exchange,提问作者Madhur Jodhwani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:09:02