为了帮助网上订单配送人员从繁琐的库存检查工作中摆脱出来,我制作了一个嵌入网页的ActiveX控件。目标程序是一个内嵌网页的C/S程序,我用DOM的方法获得指定页面上的药品编码的数据,并不需要有任何下载到数据库再读取的操作。读到的药品编号和自己单位的编码匹配,然后再检查有无库存,如果没有就直接在网页的改行记录上标注鲜艳的颜色并且勾中复选按钮。这部分的代码是C++写的:
......
IHTMLElement* pElem;
pDisp->QueryInterface(IID_IHTMLElement,(LPVOID*)&pElem);
IHTMLOptionButtonElement * pStatus;
hr=pDisp->QueryInterface(IID_IHTMLOptionButtonElement,(void **)&pStatus);
//上面4行是找到枚举出的页面上的复选按钮的其中一个和它对应的元素指针
if(SUCCEEDED(hr))
{
BSTR bstr;
CString strTag;
pStatus->get_type(&bstr);
strTag=bstr;
if(strTag.MakeUpper()=="CHECKBOX")
{
pStatus->get_value(&bstr);
strTag=bstr;
if(strTag==OrderID)
{
//如果这个复选框的文本和订单号相同,则选中
VARIANT_BOOL bCheck=TRUE;
pStatus->put_checked(bCheck);
IHTMLElement * pChoiceTD;
IHTMLElement * pChoiceTR;
//找到复选框对应的元素指针的父元素指针,即<TD></TD>
pElem->get_parentElement(&pChoiceTD);
//找到复选框对应的元素指针的祖父元素指针,即<TR></TR>
pChoiceTD->get_parentElement(&pChoiceTR);
IHTMLTableRow* pTableRow=NULL;
//找到祖父指针对应的TableRow,赋颜色
pChoiceTR->QueryInterface(IID_IHTMLTableRow,(LPVOID*)&pTableRow);
CString strBgColor(strCheckColor);
BSTR bstrBgColor = strBgColor.AllocSysString();
VARIANT varBgColor;
VariantInit(&varBgColor);
varBgColor.vt = VT_BSTR;
varBgColor.bstrVal = bstrBgColor;
pTableRow->put_bgColor(varBgColor);
}
}
pStatus->Release();
......
代码编译成ZKTOOL.DLL(进程内的COM服务器),由VB写的具有操作界面的ActiveX控件引用,再放入ASP.NET页面中。这里要说的一点,当ZKTOOL.DLL有更新后,第二次打入CAB的安装包中(安装ActiveX控件会自动注册ZKTOOL.DLL),在网页安装的时候,最好让客户端删掉前一版本的ZKTOOL.DLL,它应该在C:/WINDOWS/SYSTEM32目录下。
关于网页中加载ActiveX,可以访问:ActiveX控件在Web应用中的问题