在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
System.Type _ObjType = System.Type.GetTypeFromProgID(ComName); 然后通过这个类型来创建一个对象接口 object ComInstance= System.Activator.CreateInstance(_ObjType); 之后,对该对象方法的调用都要通过type的InvokeMember方法来进行比如: return ComType.InvokeMember(MethodName,System.Reflection.BindingFlags.InvokeMethod,null,ComInstance,args); 哎!写起来的代码量还真是有点大呢!于是,产生了一个想法,将这个COM对象后期绑定的玩意封装起来做一个公共的,能省多少代码就省多少代码,尽量的减少代码量:
/* * Created by SharpDevelop. * User: Administrator * Date: 2009-12-2 * Time: 23:26 * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; namespace DxComOperate { /// <summary> /// COM对象的后期绑定调用类库 /// </summary> public class DxComObject { private System.Type _ObjType; private object ComInstance; /*public DxComObject() { throw new }*/ public DxComObject(string ComName) { //根据COM对象的名称创建COM对象 _ObjType = System.Type.GetTypeFromProgID(ComName); if(_ObjType==null) throw new Exception("指定的COM对象名称无效"); ComInstance = System.Activator.CreateInstance(_ObjType); } public System.Type ComType { get{return _ObjType;} } //执行的函数 public object DoMethod(string MethodName,object[] args) { return ComType.InvokeMember(MethodName,System.Reflection.BindingFlags.InvokeMethod,null,ComInstance,args); } //获得属性与设置属性 public object this[string propName] { get { return _ObjType.InvokeMember( propName, System.Reflection.BindingFlags.GetProperty, null, ComInstance, null ); } set { _ObjType.InvokeMember( propName, System.Reflection.BindingFlags.SetProperty, null, ComInstance, new object[] {value} ); } } } /// <summary> /// WinHttp对象库 /// </summary> public class DxWinHttp { private DxComObject HttpObj; private string _ContentType; public DxWinHttp() { //构建WinHttp对象 HttpObj = new DxComObject("WinHttp.WinHttpRequest.5.1"); } //设置Content-Type属性 public string ContentType { get{return _ContentType;} set { if (_ContentType.CompareTo(value)!=0) { _ContentType = value; object[] args = new object[2]; args[0] = "Content-Type";args[1] = value; HttpObj.DoMethod("SetRequestHeader",args); } } } } }
代码写的也不复杂,就这么几句,但是我想应该看起来更加明亮化了。 比如,我现在通过这个封装操作库来通过ip138查询手机号码的归属地
void Button1Click(object sender, EventArgs e) { if (textBox1.Text.Length == 0) { MessageBox.Show("请输入一个手机号"); return; } DxComObject WinHttp = new DxComObject("WinHttp.WinHttpRequest.5.1"); string PostData = "http://www.ip138.com:8080/search.asp"; object[] args = new object[3];//指定参数 args[0] = "GET";args[1] = PostData;args[2] = false; WinHttp.DoMethod("Open",args);//执行Open方法 PostData = "action=mobile&mobile="+this.textBox1.Text; args = new object[2]; args[0] = "Content-Length";args[1] = PostData.Length; WinHttp.DoMethod("SetRequestHeader",args); args = new object[2]; args[0] = "Content-Type";args[1] = "application/x-www-form-urlencoded"; WinHttp.DoMethod("SetRequestHeader",args); args = new object[2]; args[0] = "User-Agent";args[1] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"; WinHttp.DoMethod("SetRequestHeader",args); args = new object[1]; args[0] = PostData; WinHttp.DoMethod("Send",args); DxComObject AdoStream = new DxComObject("Adodb.Stream"); AdoStream["Type"] = 1; AdoStream["Mode"] = 3; args = new object[]{}; AdoStream.DoMethod("Open",args); args = new object[1]{WinHttp["ResponseBody"]}; AdoStream.DoMethod("Write",args); AdoStream["Position"] = 0; AdoStream["Type"] = 2; AdoStream["Charset"] = "GB2312"; string Result = AdoStream["ReadText"].ToString(); Info.mobileNo = GetReturnValue(DxValueType.DxPhone,Result); Info.City = GetReturnValue(DxValueType.DxPhoneCity,Result); Info.CardType = GetReturnValue(DxValueType.DxCardType,Result); Info.CityCode = GetReturnValue(DxValueType.DxCityCode,Result); this.propertyGrid1.Refresh(); } //可见现在这个代码就已经很明显很明白了,但是写的代码量还是有些大,如果反复使用的话,就不爽了还是要写比较多的代码,于是开始着手对WinHttp这个COM对象进行封装
/// <summary> /// WinHttp对象库 /// </summary> public class DxWinHttp { private DxComObject HttpObj; private string _ContentType; private int _ContentLength; private bool _Active; private System.Collections.ArrayList PostDataList;//提交的数据字段 public DxWinHttp() { //构建WinHttp对象 HttpObj = new DxComObject("WinHttp.WinHttpRequest.5.1"); _ContentType = "application/x-www-form-urlencoded"; _ContentLength = 0; PostDataList = new System.Collections.ArrayList(); } //提交参数信息的个数 public int PostDataCount { get{return PostDataList.Count;} } //设置Content-Type属性 public string ContentType { get{return _ContentType;} set { if(!_Active) _ContentType = value; else if(_ContentType.CompareTo(value)!=0) { _ContentType = value; SetRequestHeader("Content-Type",_ContentType); } } } //对象是否是打开状态 public bool Active { get{return _Active;} } //设置Send数据的长度 public int ContentLength { get{return _ContentLength;} set { if(!_Active) _ContentLength = value; else if(_ContentLength != value) { _ContentLength = value; HttpObj.DoMethod("SetRequestHeader",new object[2]{"Content-Length",value}); } } } //执行之后返回的结果 public string ResponseBody { get { if(_Active) { DxComObject AdoStream = new DxComObject("Adodb.Stream"); AdoStream["Type"] = 1; AdoStream["Mode"] = 3; AdoStream.DoMethod("Open",new object[]{}); AdoStream.DoMethod("Write",new object[1]{HttpObj["ResponseBody"]}); AdoStream["Position"] = 0; AdoStream["Type"] = 2; AdoStream["Charset"] = "GB2312"; return AdoStream["ReadText"].ToString(); } else return ""; } } //设定请求头 public string SetRequestHeader(string Header,object Value) { object obj; obj = HttpObj.DoMethod("SetRequestHeader",new object[]{Header,Value}); if(obj != null) return obj.ToString(); else return "True"; } //打开URL执行OpenMethod方法,Async指定是否采用异步方式调用,异步方式不会阻塞 public string Open(string OpenMethod,string URL,bool Async) { object obj; obj = HttpObj.DoMethod("Open",new object[]{OpenMethod,URL,Async}); if (obj != null) { _Active = false; return obj.ToString(); } else { SetRequestHeader("Content-Type",_ContentType); SetRequestHeader("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); if (_ContentLength != 0) SetRequestHeader("Content-Length",_ContentLength); _Active = true; return "True"; } } //发送数据 public string Send(string body) { if(!_Active) return "False"; object obj; obj = HttpObj.DoMethod("Send",new object[1]{body}); if(obj != null) return obj.ToString(); else return "True"; } public void ClearPostData() { this.PostDataList.Clear(); } //增加提交数据信息 public void AddPostField(string FieldName,object Value) { this.PostDataList.Add(FieldName+"="+Value.ToString()); } //通过参数指定提交 public string DxPost() { if(!_Active) { return "False"; } string st=""; for(int i=0;i<this.PostDataList.Count;i++) { if(st != "") st = st + "&"+ PostDataList[i].ToString(); else st = PostDataList[i].ToString(); } this.ContentLength = st.Length; return Send(st); } //设置等待超时等 public string SetTimeouts(long ResolveTimeout,long ConnectTimeout,long SendTimeout,long ReceiveTimeout) { object obj; obj = HttpObj.DoMethod("SetTimeouts",new object[4]{ResolveTimeout,ConnectTimeout,SendTimeout,ReceiveTimeout}); if(obj != null) return obj.ToString(); else return "True"; } //等待数据提交完成 public string WaitForResponse(object Timeout,out bool Succeeded) { if(!_Active) {Succeeded = |
请发表评论