如何定制一款12306抢票浏览器——用户界面
用户界面
我不打算写个Windows界面。因为这个软件的全部就是个浏览器。我准备将”浏览器“进行到底,所以我选择使用html作为我们的用户界面。我也并不打算从头开始写一个浏览器,我使用了《内嵌IE网页窗口中消除IE默认脚本设置影响的方法》中基于WTL的浏览器代码。(转载请指明出于breaksoftware的csdn博客)界面如下
我观察了下12306的页面,它预留了5个乘客信息,所以我也就预留了5个乘客信息。因为我不会写HTML和javascript,我就从12306中copy出相应的页面元素,并加以修改。在此感谢下12306网页设计同学,帮我完成了不少我不会的东西。
一般来说,我们可能一次性不会购买5个人的票。所以在上面的界面中,你想填多少人信息就填多少人信息,我会在代码中读取这些人的信息。当我们填完乘客信息后,我们要输入车次信息。然后我们要点击一下确定,我会在代码中捕获点击确定的操作,并将已经填写的信息读入内存。在之后的抢票过程中,我们将使用到这些信息。最后,我们就要点击最下面那个超链接,跳转到12306这个页面,开始我们真正的抢票工作。
我们来看一下源代码。首先是界面的,我列一个人的信息代码出来:
<tr class="passenger_class" id="passenger_1"><td style="width: 6%"><div id="passenger_1_index">第1位</div></td><td id="seat"><select><option value="1">硬座</option><option value="2">软座</option><option value="3">硬卧</option><option value="4">软卧</option><option value="6">高级软卧</option><option value="M">一等座</option><option value="O">二等座</option><option value="P">特等座</option><option value="9">商务座</option></select> </td><td style="width: 20%"><label><strong>请确认所选车次有该坐席</strong> </label></td><td id="ticket"><select><option value="1">成人票</option><option value="2">儿童票</option><option value="3">学生票</option><option value="4">残军票</option></select></td><td id="name"><input name="passenger_1_name" type="text" id="passenger_1_name" size="12" maxlength="20" class="input_20txt" value=""/></td><td id="cardtype"><select><option value="1">二代身份证</option><option value="2">一代身份证</option><option value="C">港澳通行证</option><option value="G">台湾通行证</option><option value="B">护照</option></select></td><td id="cardno"><input name="passenger_1_cardno" type="text" id="passenger_1_cardno" size="20" maxlength="35" style="text-transform: uppercase;" class="input_20txt" value=""/></td><td id="mobileno"><input name="passenger_1_mobileno" type="text" id="passenger_1_mobileno" size="11" maxlength="20" class="input_20txt" value=""/></td>
</tr>
因为我并不知道用户选择的车次有什么类型的座位,所以我将所有的座位都列了出来。
<select><option value="1">硬座</option><option value="2">软座</option><option value="3">硬卧</option><option value="4">软卧</option><option value="6">高级软卧</option><option value="M">一等座</option><option value="O">二等座</option><option value="P">特等座</option><option value="9">商务座</option></select>
这儿要特别注意下所有option的value字段,这些值不是我乱取的。而是我检查了12306页面的很多火车信息后收集到的。我们会在之后记录用户所选席别时,记录这些值,因为这些值将在操作12306页面时派上用场。
其他元素应该没什么可以解释的,只是要注意所有Select下的Option的Value值和12306上对应的元素的Value值一致。
我们保存单个用户的结构体是
struct StSinglePassengerInfo{ListCString ListSeat;CString cstrTicket;CString cstrName;CString cstrCardtype;CString cstrCardNo;CString cstrMobileNo;
};
注意一下ListSeat这个字段,这个字段保存的一个CString的队列。它记录着一系列席别代码。在我最开始设计这个软件时,我是希望用户可以选择一系列可以接受的席别,同时是按优先级关系排列。这样可以最大程度上满足用户的需求。但是我已无心把这个功能继续做下去,所以设计界面时,只能让用户选择一个席别。
还有一个需要我们关注的是“确定”超链接的代码
<td><a style="width: 60px;" href="http://settingok">确定</a>
</td>
我们点击“确定”按钮后,页面理论上要跳转到“http://settingok”这个页面。而实际上,我们只是利用“跳转”这个操作,让我们的C++代码中捕获到用户已经设置OK了。我们并不希望页面真的发生跳转。所以我们对BeforeNavigate2消息映射函数做了处理,让跳转到“http://settingok”的请求终止,并读取用户设置的乘客信息和车次信息。
void CBrowserHost::BeforeNavigate2(IDispatch *pDisp, VARIANT *url,VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData,VARIANT *Headers, VARIANT_BOOL *Cancel)
{do {if ( NULL != url ) {CString cstrUrl((LPWSTR)(url->bstrVal));if ( 0 == cstrUrl.CompareNoCase(SETTINGOK) ) {*Cancel = VARIANT_TRUE;CComPtr<IWebBrowser2> spWeb;HRESULT hr = pDisp->QueryInterface(IID_IWebBrowser2, (LPVOID*)&spWeb);CHECKHRPOINTER(hr, spWeb);CComPtr<IDispatch> dispDoc;hr = spWeb->get_Document(&dispDoc);CHECKHRPOINTER(hr, dispDoc);CComPtr<IHTMLDocument2> spDoc;hr = dispDoc->QueryInterface( IID_IHTMLDocument2, (LPVOID*)&spDoc);CHECKHRPOINTER(hr, spDoc);StTrainNoPassengerInfo stTrainPassenger;hr = m_dealSettingPage.GetTrainNoPassengersInSettingPage(spDoc, stTrainPassenger);hr = m_AutoMan.SetTrainNoPassengers(stTrainPassenger);}……}……} while (0);
}
上面代码中m_dealSettingPage是我处理页面的类CDeal12306WebPage的对象。GetTrainNoPassengersInSettingPage将解析网页保存乘客和车次信息。m_AutoMan是我们之前说的“人”线程,此时我们将告诉该线程所有信息,让它准备开始工作。
HRESULT CDeal12306WebPage::GetTrainNoPassengersInSettingPage( CComPtr<IHTMLDocument2> & spDoc,StTrainNoPassengerInfo & stTrainPassenger )
{HRESULT hr = E_FAIL;do {CComPtr<IHTMLElement> spBody;hr = spDoc->get_body(&spBody);CHECKHRPOINTER(hr, spBody);CComPtr<IHTMLElement> spTable;hr = GetElementByID(spBody, L"passengertable", spTable);CHECKHRPOINTER(hr, spTable);CComPtr<IHTMLElement> spTBody;hr = GetElementByIndex( spTable, 0, spTBody);CHECKHRPOINTER(hr, spTBody);for ( int i = 0; i < MAXPASSENGERCOUNT; i++ ) {CString cstrTrID;cstrTrID.Format(PASSENGERID, i + 1);CComPtr<IHTMLElement> spTr;hr = GetElementByID( spTBody, cstrTrID, spTr);CHECKHRPOINTER(hr, spTr);StSinglePassengerInfo stSinglePassenger;hr = GetPassengerInfo(spTr, stSinglePassenger);CHECKHR(hr);if ( FALSE == stSinglePassenger.cstrName.IsEmpty() &&FALSE == stSinglePassenger.cstrTicket.IsEmpty() &&FALSE == stSinglePassenger.cstrCardNo.IsEmpty() &&FALSE == stSinglePassenger.cstrCardtype.IsEmpty() &&FALSE == stSinglePassenger.cstrMobileNo.IsEmpty() &&0 != stSinglePassenger.ListSeat.size()) {stTrainPassenger.vecPassengerInfo.push_back(stSinglePassenger);}}hr = GetTrainNoInSettingPage(spDoc, stTrainPassenger.cstrTrainNo);} while (0);return hr;
}
这段代码大致意思是在“设置”页面中,找到id为passengertable的元素spTable,然后找到spTable下第一个元素spTBody。spTBody下保存着每个乘客的信息,其中第一个乘客信息保存在id是“passenger_1”的元素下,第二个保存在“passenger_2”元素下……当单个乘客所有信息都不为空时,将其保存在一个stTrainPassenger.vecPassengerInfo中。最后我们要获取火车车次的信息,将其保存在stTrainPassenger.cstrTrainNo中。
上面的函数大部分是经过封装的。其中几个经常用的函数是
HRESULT GetElementCollection(CComPtr & spElem,CComPtr & spElemCollection );enum EQUERYTYPE {EID,ETAGNAME,ECLASSNAME,};// 通过ID获取指定节点下第一个ID为cstrID的子节点HRESULT GetElementByID(CComPtr<IHTMLElement> & spElem, const CString & cstrID,CComPtr<IHTMLElement> & spResElem);// 通过ClassName获取指定节点下第一个class为cstrClassName的子节点HRESULT GetElementByClassName(CComPtr<IHTMLElement> & spElem, const CString & cstrClassName,CComPtr<IHTMLElement> & spResElem);// 通过TagName获取指定节点下第一个tag为cstrTagName的子节点HRESULT GetElementByTagsName(CComPtr<IHTMLElement> & spElem, const CString & cstrTagName,CComPtr<IHTMLElement> & spResElem);// 通过ID获取指定节点下第lindex子节点HRESULT GetElementByIndex(CComPtr<IHTMLElement> & spElem, LONG lIndex,CComPtr<IHTMLElement> & spResElem);HRESULT GetElement(CComPtr & spElem, EQUERYTYPE eType, const CString & cstrValue,CComPtr & spResElem);& spElem,CComPtr & spElemCollection );enum EQUERYTYPE {EID,ETAGNAME,ECLASSNAME,};// 通过ID获取指定节点下第一个ID为cstrID的子节点HRESULT GetElementByID(CComPtr<IHTMLElement> & spElem, const CString & cstrID,CComPtr<IHTMLElement> & spResElem);// 通过ClassName获取指定节点下第一个class为cstrClassName的子节点HRESULT GetElementByClassName(CComPtr<IHTMLElement> & spElem, const CString & cstrClassName,CComPtr<IHTMLElement> & spResElem);// 通过TagName获取指定节点下第一个tag为cstrTagName的子节点HRESULT GetElementByTagsName(CComPtr<IHTMLElement> & spElem, const CString & cstrTagName,CComPtr<IHTMLElement> & spResElem);// 通过ID获取指定节点下第lindex子节点HRESULT GetElementByIndex(CComPtr<IHTMLElement> & spElem, LONG lIndex,CComPtr<IHTMLElement> & spResElem);HRESULT GetElement(CComPtr & spElem, EQUERYTYPE eType, const CString & cstrValue,CComPtr & spResElem);
对应的实现代码是
HRESULT CDeal12306WebPage::GetElementCollection( CComPtr<IHTMLElement> & spElem, CComPtr<IHTMLElementCollection> & spElemCollection )
{HRESULT hr = S_FALSE;do {CComPtr<IDispatch> spDispatch;hr = spElem->get_children(&spDispatch);CHECKHR(hr);hr = spDispatch->QueryInterface( IID_IHTMLElementCollection, (LPVOID*)&spElemCollection);CHECKHR(hr);} while (0);return hr;
}HRESULT CDeal12306WebPage::GetElementByID( CComPtr<IHTMLElement> & spElem, const CString & cstrID, CComPtr<IHTMLElement> & spResElem )
{return GetElement( spElem, EID, cstrID, spResElem );
}HRESULT CDeal12306WebPage::GetElementByClassName( CComPtr<IHTMLElement> & spElem, const CString & cstrClassName, CComPtr<IHTMLElement> & spResElem )
{return GetElement( spElem, ECLASSNAME, cstrClassName, spResElem );
}HRESULT CDeal12306WebPage::GetElementByTagsName( CComPtr<IHTMLElement> & spElem, const CString & cstrTagName, CComPtr<IHTMLElement> & spResElem )
{return GetElement( spElem, ETAGNAME, cstrTagName, spResElem );
}HRESULT CDeal12306WebPage::GetElementByIndex( CComPtr<IHTMLElement> & spElem, LONG lIndex, CComPtr<IHTMLElement> & spResElem )
{HRESULT hr = E_FAIL;do {CComPtr<IHTMLElementCollection> spElemCollecion;hr = GetElementCollection( spElem, spElemCollecion);CHECKHR(hr);LONG lCollecionCount = 0;hr = spElemCollecion->get_length(&lCollecionCount);CHECKHR(hr);if ( lCollecionCount < lIndex + 1) {break;}CComVariant VarIndex = lIndex;CComPtr<IDispatch> spDisp;hr = spElemCollecion->item(VarIndex, VarIndex, &spDisp);CHECKHRPOINTER(hr,spDisp);hr = spDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&spResElem);} while (0);return hr;
}HRESULT CDeal12306WebPage::GetElement( CComPtr<IHTMLElement> & spElem, EQUERYTYPE eType, const CString & cstrValue, CComPtr<IHTMLElement> & spResElem )
{HRESULT hr = E_FAIL;do {CComPtr<IHTMLElementCollection> spElemCollection;hr = GetElementCollection( spElem, spElemCollection);CHECKHRPOINTER(hr,spElemCollection);LONG lCollecionCount = 0;hr = spElemCollection->get_length(&lCollecionCount);CHECKHR(hr);for ( long i = 0; i < lCollecionCount; i++ ) {CComVariant VarIndex = i;CComPtr<IDispatch> spDispatchElem;hr = spElemCollection->item( VarIndex, VarIndex, &spDispatchElem );CHECKHRPOINTER(hr,spDispatchElem);CComPtr<IHTMLElement> spElem;hr = spDispatchElem->QueryInterface(IID_IHTMLElement, (LPVOID*)& spElem );CHECKHRPOINTER(hr, spElem);CComBSTR bstrValue;switch (eType) {case EID: {hr = spElem->get_id(&bstrValue);}break;case ETAGNAME: {hr = spElem->get_tagName(&bstrValue);}break;case ECLASSNAME: {hr = spElem->get_className(&bstrValue);}break;default:break;}CString cstrV((LPWSTR)bstrValue);if ( 0 == cstrV.CompareNoCase( cstrValue )) {spResElem = spElem;break;}}} while (0);return hr;
}
在获取乘客和车次信息时用到的其他封装函数的实现是
HRESULT CDeal12306WebPage::GetPassengerInfo( CComPtr<IHTMLElement> & spElem, StSinglePassengerInfo & stSinglePassenger )
{HRESULT hr = E_FAIL;do {CString cstrSeat;hr = GetOptionValueHelper(spElem, L"seat", cstrSeat);CHECKHR(hr);stSinglePassenger.ListSeat.push_back(cstrSeat);hr = GetOptionValueHelper(spElem, L"ticket", stSinglePassenger.cstrTicket );CHECKHR(hr);hr = GetOptionValueHelper(spElem, L"cardtype", stSinglePassenger.cstrCardtype);CHECKHR(hr);hr = GetInputValueHelper(spElem, L"name", stSinglePassenger.cstrName);CHECKHR(hr);hr = GetInputValueHelper(spElem, L"cardno", stSinglePassenger.cstrCardNo);CHECKHR(hr);hr = GetInputValueHelper(spElem, L"mobileno", stSinglePassenger.cstrMobileNo);} while (0);return hr;
}HRESULT CDeal12306WebPage::GetOptionValueHelper( CComPtr<IHTMLElement> & spElem, const CString& cstrID, CString& cstrValue )
{HRESULT hr = E_FAIL;do {CComPtr<IHTMLElement> spTd;hr = GetElementByID(spElem, cstrID, spTd);CHECKHRPOINTER(hr, spTd);CComPtr<IHTMLElement> spSel;hr = GetElementByIndex(spTd, 0, spSel);CHECKHRPOINTER(hr, spSel);CComPtr<IHTMLSelectElement> spSelect;hr = spSel->QueryInterface(IID_IHTMLSelectElement, (LPVOID*)&spSelect);CHECKHRPOINTER(hr, spSelect);CComBSTR bstrValue;hr = spSelect->get_value(&bstrValue);CHECKHR(hr);cstrValue = bstrValue;} while (0);return hr;
}HRESULT CDeal12306WebPage::GetInputValueHelper( CComPtr<IHTMLElement> & spElem,const CString& cstrID, CString & cstrValue )
{HRESULT hr = E_FAIL;do {CComPtr<IHTMLElement> spTd;hr = GetElementByID(spElem, cstrID, spTd);CHECKHRPOINTER(hr, spTd);CComPtr<IHTMLElement> spInput;hr = GetElementByIndex(spTd, 0, spInput);CHECKHRPOINTER(hr, spInput);CComPtr<IHTMLInputElement> spInputElem;hr = spInput->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&spInputElem);CHECKHRPOINTER(hr, spInputElem);CComBSTR bstrValue;hr = spInputElem->get_value(&bstrValue);CHECKHR(hr);cstrValue = bstrValue;} while (0);return hr;
}HRESULT CDeal12306WebPage::GetTrainNoInSettingPage( CComPtr<IHTMLDocument2> & spDoc, CString & cstrValue )
{HRESULT hr = E_FAIL;do {CComPtr<IHTMLElement> spBody;hr = spDoc->get_body(&spBody);CHECKHRPOINTER(hr, spBody);CComPtr<IHTMLElement> spTable;hr = GetElementByID(spBody, L"trainnotable", spTable);CHECKHRPOINTER(hr, spTable);CComPtr<IHTMLElement> spTBody;hr = GetElementByIndex( spTable, 0, spTBody);CHECKHRPOINTER(hr, spTBody);CComPtr<IHTMLElement> spTr;hr = GetElementByIndex(spTBody, 0, spTr);CHECKHRPOINTER(hr, spTr);CComPtr<IHTMLElement> spTd;hr = GetElementByID(spTr, L"trainno", spTd);CHECKHRPOINTER(hr, spTd);CComPtr<IHTMLElement> spInput;hr = GetElementByIndex(spTd, 0, spInput);CHECKHRPOINTER(hr, spInput);CComPtr<IHTMLInputElement> spInputElem;hr = spInput->QueryInterface(IID_IHTMLInputElement, (LPVOID*)&spInputElem);CHECKHRPOINTER(hr, spInputElem);CComBSTR bstrValue;hr = spInputElem->get_value(&bstrValue);CHECKHR(hr);cstrValue = bstrValue;} while (0);return hr;
}
相关文章:

Study on Android【四】--显示控件使用
Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多&#x…

修改Vim配色方案
1. 查看备选的配色方案/usr/share/vim/vim74/colors2. 查看当前使用的配色方案在命令模式下输入 :colorscheme可见当前使用的配色方案为ron3.选择和设置配色方法编辑 ~/.vimrc文件,如选择ron.vim对应的配色方案,则添加 colorscheme ron4. 设置某项颜色--…

如何定制一款12306抢票浏览器——启动“人”线程
启动“人”线程 在《如何定制一款12306抢票浏览器——构架》一文中,我们提到“人”线程。对于熟悉Window编程的同学来说,线程间通信和信息传递不是难题。但是由于浏览器和我们“人”线程之间传递的是COM对象,这个过程就没有那么简单了。&…

看看你是《老朋友》(青春六人行)里的哪一个
(点击“which friends character are you?”连接可以进入问卷页面) Which Friends Character Are You? You are Rachel. Youre very selfish and pay great attention to image. Spoiled when you were young, you were always the popular and sn…

360金融沈赟:只有适配实践的技术才能实现价值掘金
金融科技应用的新场景、新需求层出不穷,已成为创新技术的理想“试验田”。然而当“创新”浪潮褪去,行业回归审慎与冷静后不难发现,并非所有创新技术都会深入金融土壤。对此,360金融首席数据科学家沈赟认为,只有适配实践的技术才能…

swift(一)基础变量类型
import Foundationprintln("Hello, World!")/*int a; */ var a 10 //隐式类型转换 a 9 println(a)let b 10 println(b)/* 类型标注 *///var x:Int //x 10.3不支持隐式转换let x: Int 10/* 名称不用在符合标示符的规范 */ let 常量 10/* 基本数据类型࿱…

如何定制一款12306抢票浏览器——实现自动查询和预订功能
检查是否进入订票页面 判断是否进入订票页面,我是确定了两个标准:(转载请指明出于breaksoftware的csdn博客) 1 网址是否为http://www.12306.cn/mormhweb/kyfw/ 2 该页面否有查询按钮 BOOL CDeal12306WebPage::IsQueryPage( CComPt…

以数据为中心,立足六大技术支柱,英特尔推动神经拟态计算、量子计算前沿探索
近日,英特尔中国研究院院长宋继强围绕 “英特尔如何构建技术基石,驱动未来计算”为主题做了演讲。他阐述了英特尔将坚持“以数据为中心”的目标,并指出依托于XPU产品组合,英特尔通过异构整合和oneAPI软件平台来推动实现超异构计算…

Fedora 7 播放器totem
说实话,我喜欢这个东东,简约而不简单。我以前一直用mplayer,不过还是喜欢totem的长相。很多人说不能播放,可以这么做,让它支持全部(用mplayer的codecs):(1)首先将系统已有的totem移去 # yum remove totem(2…

如何定制一款12306抢票浏览器——处理预订页面和验证码自动识别功能
判断是否进入预订页面我们先看一下预订页面的结构(转载请指明出于breaksoftware的csdn博客)可以见得,这个页面也是嵌入了两个IFrame。关于IFrame的跨域问题,我已经在前一篇文章中讲述了解决办法。我判断是否是预订页面是通过两个依…
利用MTCNN和FaceNet实现人脸检测和人脸识别 | CSDN博文精选
作者 | pan_jinquan来源 | CSDN博文精选(*点击阅读原文,查看作者更多文章)人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用MTCNN和FaceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单,…

[导入]郁闷`````[原]
阅读全文 类别:职场生涯 查看评论文章来源:http://hi.baidu.com/huqing7002/blog/item/b69a27082063fbd263d98619.html转载于:https://www.cnblogs.com/huqing7002/archive/2007/12/14/1007049.html

code标签的妙用
code标签的秒用是: 当你写了一大版的css或者html或者其他代码,想要去掉代码中多余的空格和换行从而达到压缩的目的的时候,可以新建一个html文件,然后把想要压缩的代码段放到code标签里,保存,浏览器浏览&…

如何定制一款12306抢票浏览器——完结篇
差不多花了一个星期的业余时间去完成了相关的编码。最后也只是使用了5篇文章将整个大题流程和使用的关键技术介绍了一下。其中有很多酸甜苦辣,其中记忆最为深刻的就是我对图像做了处理后,tesseract-ocr对验证码识别的准确度提升非常大。当我还沉浸子在这片喜悦之中时,12306将…

所有各数据库或文件的连接串定义CHM文件.
从www.connectionstrings.com 中制作生成/Files/margiex/DotnetConn.rar
钢铁侠“变身”AI布道师?小罗伯特·唐尼这次推出一部AI科普纪录片
作者 | 若名出品 | AI科技大本营(ID:rgznai100)穿着一身运动便服,脱去了铠甲的“钢铁侠”托尼斯塔克最近出现在荧屏上,他正与身后的AI助手互动,一本正经讲解着“机器学习”、“算法”这些词汇。不过,这个AI…

Wireshark数据抓包教程之Wireshark的基础知识
Wireshark数据抓包教程之Wireshark的基础知识 Wireshark的基础知识 在这个网络信息时代里,计算机安全始终是一个让人揪心的问题,网络安全则有过之而无不及。Wireshark作为国际知名的网络数据抓包和分析工具,可以广泛地应用各种领域࿰…

WMI技术介绍和应用——查询快捷方式、映射磁盘和虚拟内存信息
本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。(转载请指明出于breaksoftware的csdn博客) 因为将要介绍的三个模块都比较简单,故将这三…
不要痴迷蓝牙耳机了,出门选这个准没错,99W+人的选择
01有一种耳机啊它是真的不适合在长途火车上使用那就蓝牙耳机除非你带充电宝还有一种耳机啊它是真的不适合丢那就是带有充电仓的耳机因为充电仓丢了这个耳机基本上就废了02这不,我就经历了,活生生的例子出差的路上在火车上把耳机充电仓给弄丢了只剩孤零零…

结构化文件存取
纲要:AssignFile: 关联Rewrite: 创建并打开一个新文件, 如已存在则覆盖Reset: 打开已存在的文件; 追加也要用它先打开, 然后再移动指针; Append 是文本文件专用的CloseFile: 关闭FileSize: 记录数FilePos: 返回文件的当前位置Seek: 把文件指针移到指定位置(只用于结构化文件)Eo…

_00021 尼娜抹微笑伊拉克_谁的的最离奇的异常第二阶段 Jedis pool.returnResource(jedis)...
笔者博文:妳那伊抹微笑博客地址:http://blog.csdn.net/u012185296博文标题:_00021 妳那伊抹微笑_谁的异常最诡异第二期之 Jedis pool.returnResource(jedis)个性签名:世界上最遥远的距离不是天涯,也不是海角࿰…

WMI技术介绍和应用——查询系统信息
本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。(转载请指明出于breaksoftware的csdn博客) 本机主要知识点是Win32_ComputerSystem类。通过该类我们…
利用OpenCV实现抖音最强变脸术 | CSDN原力计划
作者 | 亓斌来源 | CSDN原力计划获奖作品(*点击阅读原文,查看作者更多文章)最近一个“最强变脸术”又火爆抖音啦,还不知道的朋友建议先打开抖音,搜索“最强变脸术”看个十来个视频再回来看这篇文章。视频看起来炫酷&am…

思科PIX防火墙的实际应用配置
PIX:一个合法IP完成inside、outside和dmz之间的访问 现有条件:100M宽带接入,分配一个合法的IP(222.134.135.98)(只有1个静态IP是否够用?);PiX515e-r-DMZ-BUN1台ÿ…

CommonJS 的 AMD 规范
异步模块定义(Asynchronous Module Definition,简称 AMD)API 描述了一种定义模块的机制,模块及其依赖模块可以通过这种机制进行加载。该机制特别适用于浏览器。 本规范曾被称为 Modules Transport/C,但本规范主要不是用…
易观的大数据中台之路
作者 | 易观CTO郭炜出品 | AI科技大本营(ID:rgznai100)本文为CSDN即将推出的《新战场:决胜中台》专刊的第 2 篇文章。什么是数据中台?中台的定义来自于投资银行,简单说来,投行当中前台是赚钱的、后台是做支…

WMI技术介绍和应用——查询系统信息和补丁包信息
本文使用了《 WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。( 转载请指明出于breaksoftware的csdn博客)本文主要知识点是Win32_OperatingSystem和Win32_Quick…

Winform与Webform中的对话框
参考MSDNDialogResult result MessageBox.Show("见过打劫的没?", "打、打、打劫", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);switch (result){case DialogResult.OK:MessageBox.Show("你按了确定…
启动Genymotion时报错Failed to initialize backend EGL display
在启动Genymotion的时候报错: video card说的是显卡,你的显卡可能不支持 OpenGL2.0,或者你装的驱动有问题。解决办法:将驱动重新安装一下。可直接下载一个如“驱动人生“一样的驱动软件,把你的显卡驱动更新一下。转载…

新年新方向-斩获新职位
^_^上个星期斩获公司内部竞聘职位:项目管理部总经理,高兴,发展方向变了,以后我会多写一些项目管理的文章和大家分享。WPF的学习和分享也不会停下来,我要全面发展,做社会主义的接班人!YE!项目管理部总经理职…