我可以在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,¶ms,&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项目字段。
但是没有一个适当的接口来填充整个缓冲区只需一个电话? 例如,我可以以某种方式检索包含的缓冲区?
在Windows上运行
如何find使用DrawText在Windows中呈现的文本的EXACT像素高度
Mongodb的Windows设置“pipe理员控制台正在等待28017端口上的连接”错误
Windows在c ++中读取快捷方式文件的目标
'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] 举报,一经查实,本站将立刻删除。