微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IWebbrowser2:使用Uint8array填充没有循环

我可以在IWebbrowser2窗口中创build一个Uint8array:

IHTMLWindow2 window = ...; disPID dispid_uint8array = ...; VARIANT self; self.vt = VT_NULL; VARIANT length; length.vt = VT_I4; length.lVal = 100; VARIANT args[2] = { self,length }; disPID named_args[1] = { disPID_THIS }; disPParaMS params; params.rgvarg = args; params.rgdispidNamedArgs = named_args; params.cArgs = 2; params.cNamedArgs = 1; VARIANT result; result.vt = VT_EMPTY; HRESULT hr = container->Invoke( dispid_uint8array,IID_NULL,LOCALE_USER_DEFAULT,disPATCH_METHOD,&params,&result,nullptr,nullptr ); assert(hr == S_OK); assert(result.vt == VT_disPATCH); Idispatch my_new_uint8array = result.pdispVal;

现在我可以在my_new_uint8array使用Idispatch::Invoke(...,disPATCH_PROPERTYPUT,...)设置my_new_uint8array项目字段。

但是没有一个适当的接口来填充整个缓冲区只需一个电话? 例如,我可以以某种方式检索包含的缓冲区?

是否有一个接口的定义,像iuint8Array ?

在Windows上运行

如何find使用DrawText在Windows中呈现的文本的EXACT像素高度

Mongodb的Windows设置“pipe理员控制台正在等待28017端口上的连接”错误

Windows在c ++中读取快捷方式文件的目标

什么导致PHPlocking文件

'C: wmic'不被识别为内部或外部命令,可操作程序或batch file

PHP在Windows机器上安装SSH2

启动过程错误stream是空的

如何以编程方式检查Windows计算机上打开的浏览器实例?

TortoiseSVN客户端预先提交钩子获取存储库URL

我想出了一个令人难以置信的难题:使用<canvas>的ArrayBuffer。 我只会发布伪代码,因为完整的C ++,包括错误检查,解包等等,太长了:

序幕:

FEATURE_broWSER_EMULATION已设置为11001

IWebbrowser2::get_ReadyState返回READYSTATE_COMPLETE

IHTMLDocument6::get_documentMode返回11

IHTMLDocument5::get_compatMode返回"CSS1Compat"

IHTMLDocument2 *doc和IHTMLWindow2 *win被设置。

我在我的伪代码中使用简单的字符串,但是当然你必须使用BSTR 。

您可能需要查询一次或两次,以便结果合适。

不要忽略错误

如何获得“Uint8Array”:

ULONG len_in_dwords = (LENGTH_I_WANT + 3) / 4; IHTMLCanvasElement *canvas = doc->createElement("canvas"); ICanvasRenderingContext2D *context = canvas->getContext("2d"); ICanvasPixelArrayData *array_data = context->createImageData(len_in_dwords,1); // use this variable for interfaces that accept an ArrayBuffer Idispatch *array_buffer = Get property "buffer" of array_data; // use this variable to edit the content: BYTE *byte_buffer; ULONG buffer_length_in_bytes; array_data->GetBufferPointer(&byte_buffer,&buffer_length_in_bytes); // no need for that anymore: canvas->Release(); context->Release(); array_data->Release();

ArrayBuffer array_buffer的大小总是可以被4整除。 这适用于我,但可能不适用于其他用例。 您可以使用array_buffer的方法slice(0,LENGTH_I_WANT)来删除memcpy到byte_buffer之后的额外字节。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐