在上文《常见的打印方法》一文中,我们已经说过,我们要自己开发一个B/S下的打印控件(主要是IE下的)。首先我们要对IE的架构进行一个了解。

学0D网12页57J5网(http://www.xwangye.com)

学0D网12页57J5网(http://www.xwangye.com)

IExplore.exe位于最上层,他是一个很少的应用程序,当IE 装载的时候他被实例化。这个可执行程序使用IE的各种组件来执行导航,历史记录维护,收藏夹维护,HTML解析和渲染等,同时为独立的浏览器提供工具栏和框架。Iexplore是Shdocvw.dll组件的直接宿主。

学0D网12页57J5网(http://www.xwangye.com)

Shdocvw.dll依次寄宿Mshtml.dll,当有其他的活动文档组件(例如:MS Office应用),当用户导航到这些特定的文档的时候,可以就地装入浏览器。Shdocvw.dll提供这些和导航联系在一些的功能:就地链接、收藏夹和历史记录管理、PICS支持。该动态链接库也向其宿主暴露了一些接口,以允许这些宿主可以把他当作ActiveX控件而分别寄宿。

学0D网12页57J5网(http://www.xwangye.com)

在Shdocvw.dll中有一个接口叫做IWebBrowser2,我们所见到的IE,其实基本上就是对该接口的一个包装。他有一个很重要的成员函数"ExecWB"其原型如下:

以下是示例代码:
HRESULT ExecWB(      
    OLECMDID cmdID,
    OLECMDEXECOPT cmdexecopt,
    VARIANT *pvaIn,
    VARIANT *pvaOut
);

学0D网12页57J5网(http://www.xwangye.com)

通过给这个函数的cmdID和cmdexecopt参数指定适当的值,我们几乎可以做IE界面上所做的所有事情。下面举例说明如何在JS中调用该函数。

学0D网12页57J5网(http://www.xwangye.com)

以下是示例代码:
<OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT>
      <input type=”button” value=”直接打印” onclick=”browser.ExecWB(6,1);”/>
      <input type=”button” value=”打印预览” onclick=”browser.ExecWB(7,1);”/>
      <input type=”button” value=”页面设置” onclick=”browser.ExecWB(8,1);”/>

然后单击3个button,IE就会相应的执行打印,打印预览,页面设置3个动作。

学0D网12页57J5网(http://www.xwangye.com)

大家是不是觉得与上一篇文章中说介绍有点眼熟呀?实际上是一样的。

学0D网12页57J5网(http://www.xwangye.com)

 

学0D网12页57J5网(http://www.xwangye.com)

这个"ExecWB"的命令实际上就是调用IOleCommandTarget接口的Exec函数,该函数的原型如下:

学0D网12页57J5网(http://www.xwangye.com)

以下是示例代码:
HRESULT Exec(
        const GUID *pguidCmdGroup,  // Pointer to command group
          DWORD nCmdID,               // Identifier of command to execute
          DWORD nCmdExecOpt,         // Options for executing the command
          VARIANTARG *pvaIn,           // Pointer to input arguments
          VARIANTARG *pvaOut          // Pointer to command output
       );         

学0D网12页57J5网(http://www.xwangye.com)

如果我能获得一个IWebBrowser2的实际,并且把他转换为IOleCommandTarget接口,然后给Exec函数赋予适当的值,就可以实现我们想要的结果。

学0D网12页57J5网(http://www.xwangye.com)

这个函数的对于打印来说,第四个参数至关重要。这个参数指定的打印时使用的打印模板。

学0D网12页57J5网(http://www.xwangye.com)