美文网首页
IE的window.external调用宿主程序函数时整数类型问

IE的window.external调用宿主程序函数时整数类型问

作者: 赵海洋 | 来源:发表于2019-06-12 09:18 被阅读0次

在项目中使使用window.external.foobar(intVal)调用c++程序中webbrowser提供的函数。在web控件的Invoke方法中,获取该参数intVal。

HRESULT __stdcall XXXWebBrowser::Invoke( 
          DISPID  dispIdMember,
          REFIID  riid,              
          LCID  lcid,                
          WORD  wFlags,              
          DISPPARAMS FAR*  pDispParams,  
          VARIANT FAR*  pVarResult,  
          EXCEPINFO FAR*  pExcepInfo,  
          unsigned int FAR*  puArgErr  
          ){
      int v = pDispParams->rgvarg[0].intVal;
}

pDispParams->rgvarg[0]是一个VARIANT,类型为VT_I4。以前一直直接使用intVal来取整数值,都很正常。但在当intVal为UNIX时间戳时,发现该参数在c++中变成了VT_R8,变成了浮点数。

觉得奇怪,时间戳明明还在整数的范围内,为什么会变成了浮点数。
于是在js里写了一些测试代码,最后发现临界值为 0x40000000,超过此值的调用后VARIANT类型为VT_R8,不超过时,为VT_I4。

于是代码做了下兼容:

uint32_t  XXXWebBrowser::GetDispUIntArg( DISPPARAMS* pDispParams, uint32_t index, uint32_t defaultValue /*= 0*/ )
{
    if (index >= pDispParams->cArgs)
    {
        assert(false);
        return defaultValue;
    }

       switch (pDispParams->rgvarg[argIndex].vt)
    {
    case VT_I2:
    case VT_UI2:
    case VT_I4:
    case VT_UI4:
    case VT_I8:
    case VT_UI8:
        {
            return pDispParams->rgvarg[argIndex].intVal;
        }
        break;
    case VT_R4:
    case VT_R8:
        {
            return (uint32_t)pDispParams->rgvarg[argIndex].dblVal;
        }
        break;
    default:
        GAMEMGR_ASSERT(false && "GetDispUIntArg接收到了不支持的类型");
               return defaultValue;
    }

相关文章

  • IE的window.external调用宿主程序函数时整数类型问

    在项目中使使用window.external.foobar(intVal)调用c++程序中webbrowser提供...

  • 第四章: 序列类型range

    range是一种序列类型,range类型用于表示不可变的整数序列 可以调用内置函数range创建range类型的对...

  • python函数进阶

    函数 主程序调用函数时,必须保证这个函数此前已经定义过,即被调函数的实现要在调用函数之前: 但在函数内部调用其他函...

  • 函数

    一、函数原型声明 1.目的 说明函数类型和参数情况,以保证程序编译时能判断对该函数的调用是否正确。 2.一般格...

  • c++入门 - 内联函数、#pragma once

    内联函数 函数的调用 执行到函数调用指令时,程序将在函数在调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(...

  • 第二章:数据类型

    什么是数据类型:数据类型是对数据的分类,例如,整数型、浮点型、字符串类型,等等 如何获取数据类型:调用内置函数ty...

  • python 函数参数类型

    本文主要学习内容: python函数参数类型 python 的函数参数类型分为4种:1.位置参数:调用函数时根据函...

  • 第一章:开始

    1. 编写一个简单的 C++ 程序 main 函数的返回类型必须为 int,即整数类型。int 类型是一种 内置类...

  • Primer

    1.1 编写一个简单的程序 main 函数 返回的类型必然是int即整数型 因此,return返回一个整数,0表示...

  • 21.Vim插件之man.vim

    2016-01-05 15:28:07 用vim查看程序代码时,会经常碰到系统函数调用,对于它们的参数类型、参数个...

网友评论

      本文标题:IE的window.external调用宿主程序函数时整数类型问

      本文链接:https://www.haomeiwen.com/subject/sztkfctx.html