博文

C# WebBrowser 编程 使用mshtml读取网页内容(2010-06-25 17:00:00)

摘要:首先需要引用Microsoft.mshtml,AxInterop.SHDocVw
一些方法: webBrowser.ScriptErrorsSuppressed = true;//允许脚本调试
webBrowser.WebBrowserShortcutsEnabled = true;//允许快捷键 /*********************一些事件的处理*******************/ webBrowser.CanGoForwardChanged += new EventHandler(webBrowser_CanGoForwardChanged);
webBrowser.CanGoBackChanged += new EventHandler(webBrowser_CanGoBackChanged);
webBrowser.StatusTextChanged += new EventHandler(webBrowser1_StatusTextChanged);
webBrowser.Navigating += new WebBrowserNavigatingEventHandler(webBrowser1_Navigating);
webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);
webBrowser.DocumentTitleChanged += new EventHandler(webBrowser1_DocumentTitleChanged);
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
webBrowser.Disposed += new EventHandler(webBrowser1_Disposed);
(webBrowser.ActiveXInstance as SHDocVw.WebBrowser).NewW......

阅读全文(12348) | 评论:4

Remoting模式下的通讯(2008-10-17 22:21:00)

摘要:         使用C#下的Remoting有一段时间了,感觉开始的时候理解比较困难,不过了解了其工作模式后也相对觉得容易多了,现在将一些心得体会记录一下。          Remoting原理:Remoting实际上就是在服务器与客户端之间利用一个对象(RemoteObject)进行通讯,服务器端产生这个对象,客户端远程获取这个对象并利用对象的属性和方法操作服务器端的数据。Remoting的通讯协议可以是IPC、HTTP或者TCP。从性能上讲,IPC信道的通讯性能最佳,但客户端服务器端只能存在于同一个域中;HTTP性能最差,但是HTTP协议几乎能穿越所有的防火墙,所以在远程访问中使用HTTP的情况较多;TCP性能介于前两者之间。           Remoting模式的通讯省去了编写大量通讯协议的过程,将数据与方法用面向对象的方式进行的封装,大大加快了开发进度。          下面,将举例开发一对简单的Remoting通讯的例子程序。           第一步:创建公共对象类(CommProxyClass),公共对象类必须继承于MarshalByRefObject;           public class CommProxyClass:MarshalByRefObject{};          第二步:为这个公共对象添加一个方法:          public int GetProcessCount() {      ......

阅读全文(4129) | 评论:0

Hashtable 的多线程自同步测试(2008-03-03 22:14:00)

摘要:以前多线程使用Hashtable的时候,都是使用lock(Hashtable)的方式进行同步,那天在网上忽然查到一个资料,就是Hashtable 对于多线程是安全的,可以实现自同步,也就是不需要lock也能实现同步,于是写了段代码测试:
private Hashtable mObjectHash = null;//定义一个哈希表 private int mMaxCount = 50000;//定义最大对象数
///定义的测试对象类
private class mShowObject
{
public int ID=-1;
public String Name;
public override string ToString()
{ return String.Format("{0}\t{1}", this.ID, this.Name); } } ///定义的一些变量,用于计数 long threadAccess = 0; int deleteObjectcount = 0;
int addobjectCount = 0;
int editobjectcount = 0;
DateTime startTime = DateTime.Now;//启动时间
bool mActive = false;
int mChangeThreadCount = 0;
Random rnd = null;
//构造函数
public Form1()
{ InitializeComponent();
mObjectHash = Hashtable.Synchronized(new Hashtable(mMaxCount));//初始化一个具有自同步属性的哈希表
rnd = new Random((int)DateTime.Now.Ticks);
}
private void AddObject(mShowObject obj)
{ if (obj == null) return;
lock (mObjectHash)
{
%%%%    if (mObjectHash.ContainsKey(obj......

阅读全文(5827) | 评论:0

C# 在listview中添加进度条(2007-11-05 22:16:00)

摘要:今天写了一个可以显示进度条的ListView控件,代码如下: /// <summary>
 /// ListViewEx 的摘要说明。
 /// </summary>
 public class ListViewEx : System.Windows.Forms.ListView
 {
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;   private String mProgressColumnText = String.Empty;
  /// <summary>
  /// 需要设置为进度条的列标头文字,根据这些文字判断所在列是否为进度条显示列
  /// </summary>
  private String ProgressColumnText
  {
   get
   {
    return mProgressColumnText;
   }
   set
   {
    mProgressColumnText = value;
   }
  }
  private Color mProgressColor = Color.Red;
  public Color ProgressColor
 &n......

阅读全文(8362) | 评论:0

C#做媒体播放器(2007-10-31 11:51:00)

摘要:  参考网上一些类似代码写的,写的比较仓促,没有做较好的完善,以后再搞了!   下载地址: http://upload.programfan.com/upfile/200710311146704.rar  ......

阅读全文(2525) | 评论:0

C#下用GDI绘制城墙线波浪线等线型(2007-10-31 11:37:00)

摘要:调用的API: [DllImport("gdi32.dll", EntryPoint="LineDDA")]
  public static extern int LineDDA (
   int   nXStart,         //   线条起点的X坐标  
       int   nYStart,         //   线条起点的Y坐标  
   int   nXEnd,          //   线条终点的X坐标  
   int   nYEnd,          //   线条终点的Y坐标  
   LineDDAProcHandle  lpLineDDAProc,
   IntPtr lParam
   );
  public delegate void    LineDDAProcHandle(  
   int   X, //   被求值点的X坐标  
   int   Y, //   被求值点的Y坐标  
   ref DrawStruct   lpData );
  private void    LineDDAProc(  
&......

阅读全文(8804) | 评论:2

尚未解决:服务器端异步方式的异常-不执行回调(2007-10-22 20:52:00)

摘要:单位上一个用于通讯的服务器上的程序出了问题: 服务器程序使用UDP服务端,用的是异步Socket模式,服务器刚搭建好的时候没什么问题,最近由于通讯客户端增多(da大概1500个左右)后,出现这样的问题: mySocket.Bind(ipe);
    mySocket.BeginReceiveFrom(obj.buffer,0,UdpTranslateObj.BUFFER_SIZE,SocketFlags.None,
     ref obj.endPoint,new AsyncCallback(ReceiveCallBack),obj); private void ReceiveCallBack(IAsyncResult ar)
  {
   UdpTranslateObj obj = (UdpTranslateObj)ar.AsyncState;
   try
   {
    int k = obj.udpSock.EndReceiveFrom(ar,ref obj.endPoint);
    if(k > 0)
    {
     ReceiveEventArgs e = new ReceiveEventArgs();
     e._ReceiveBytes = new byte[k];
     Array.Copy(obj.buffer,0,e._ReceiveBytes,0,k);
     e._RemoteEndPoint = obj.endPoint;
     OnReceive(e)......

阅读全文(3272) | 评论:0

用ODBC导出数据到Excel中(2007-10-19 09:44:00)

摘要:数据导出到Excel不一定要用Office的COM,利用ODBC也可以做到!   定义一个连接Excel文件的连接字符串: String excelSql = @"Driver={Microsoft Excel Driver (*.xls)};READONLY=FALSE;DriverId=790;Dbq={0};DefaultDir=c:\;" ; 其中的{0}要实际替换为目标文件的路径和全名. this.saveFileDialog1.Filter = "Excel文件.xls | *.xls"; string saveFileName  = "";
   DialogResult dr = this.saveFileDialog1.ShowDialog();
   if(dr != DialogResult.Cancel)
   {
    saveFileName = saveFileDialog1.FileName;
    if(File.Exists(saveFileName))
    {
     File.Delete(saveFileName);//删除目标文件
    }
      File.Copy("Book1.xls",saveFileName,true);//复制母板文件为目标文件 } else {  return;//保存文件对话框中选择了'取消' }
 String conSql =excelSql.Replace("{0}",saveFileName);//替换连接字符串中的占位符
 OdbcConnection cnn = new OdbcConnection(conSql); try{ cnn.Open();//打开连接 } ......

阅读全文(4311) | 评论:0

C#通讯编程步步高(一)(2007-05-29 21:35:00)

摘要:  2. UDP UDP协议是一种无连接的,不可靠的通讯模式,所谓不可靠,即它不保证数据能准确的发送到对方,因此使用它的时候必须考虑数据包丢失的情况. 使用UDP的场合一般是对数据包能否到达对方没有严格要求,只在乎数据能快速的到达对方.据我使用UDP协议编程的经验,UDP传输对服务器的压力最低,也就是服务器的开销最少,这对于需要处理海量连接的服务器而言,优势不言而喻. 由于UDP协议的无连接传输,也就是UDP协议在发送数据包之前不需要和对方建立连接,所以在使用UDP协议传输数据时要考虑数据确认的问题,因为发送方并不清楚目的计算机是否接收到了数据,或是数据包在传输过程中被丢弃. UDP协议的通讯过程十分简单:发送方直接将数据发送到目标计算机的地址和端口即可.在C#中,UDP Socket在发送数据之前需要绑定一个本地端口或者用Connect方法连接目标计算机端口(事实上,这个方法并没有进行连接,它只是决定之后用这个Socket发送时是否需要提供远程主机的地址端口). 二.C#中的与Socket通讯相关的命名空间和类 1.System.Net命名空间: 这个命名空间提供了通讯协议的接口. .Net Framwork SDK文档对这个命名空间的描述:System.Net 命名空间为当前网络上使用的多种协议提供了简单的编程接口。WebRequest 和 WebResponse 类形成了所谓的可插接式协议的基础。可插接式协议是网络服务的一种实现,它使您能够开发出使用 Internet 资源的应用程序,而不必考虑各种不同协议的具体细节。 2.System.Net.Sockets命名空间: 这个命名空间提供了构造Socket需要的类. .Net Framwork SDK文档对这个命名空间的描述: System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。 TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息。 3.Socket编程常用的类: (1) IPAddress类: IPAddress类实现对IP地址的对象化封装. 常用方法和常量: a.Pars......

阅读全文(4106) | 评论:4

C#通讯编程步步高(序)(2007-05-27 22:46:00)

摘要:在C#中,通讯编程是十分容易的一件事情.以前在C++中很长的代码能完成的事情,在C#中几句代码就能解决,这得益于.net框架提供的高度封装的类库.学习C#3年了,觉得应该把自己的心得写出来,供别人也供自己以后学习. 注:以下内容纯粹属于随笔,没有目录.可能内容中有些错误,欢迎指正. 另:这里所说的通讯编程指Windows系统下的通讯编程. 一.网络通讯 网络通讯最主要的方法就是Socket通讯,所以我也只学习了Socket TCP/UDP通讯,至于什么命名管道啊什么的通讯我没有去学习,不是不值得学,而是因为自己精力有限,把所有的精力都放到了Socket TCP/UDP通讯上. 二.通讯协议 1.TCP TCP通讯协议是基于IP协议之上的一种面向可靠连接的通讯协议,在它之上有类似很多的比如http,ftp等协议都是我们熟悉的.它的优点是传输可靠,能够保证数据完整的正确的发送到接收方,在对数据正确性和完整性比较高的场合,TCP通讯是我的选择. TCP协议的通讯过程:首先,必须先建立和接收方的通讯链接(Connect),接收方响应链接(Accept);然后才是发送数据(Send),接收方接收数据(Receive);最后双方拆除链接(Disconnect). 上面的通讯过程是我们具体使用TCP协议进行编程时的操作,实际上对于底层通讯,在链接建立和数据通讯的过程中,通讯双方的Socket实际要做很多事情,当然,这些不是我们关心的,我们也无须控制它,除非我们熟知通讯双方的网络状况,我们才可以调整Socket在通讯过程中的一些配置参数(SetSocketOptions),参数非常之多,我也没具体了解过,不过可以参考<TCP/IP协议详解>和<Windows网络编程>等书. 使用TCP/IP协议编程务必了解NG算法.NG算法是一种排队算法,通俗的讲,因为TCP/IP的传输效率问题(TCP协议的数据头比UDP协议的数据头要大),它采用一种算法,使网络上一次数据交互能够最大可能的传输数据,也就是在一定时间内,调用Send方法发送数据的时候,TCP并非立即发送,而是等待缓冲区到一定水位后再进行发送,除非等待的时间到达,否则TCP会一直等待缓冲区内有更多的数据. NG算法能解决TCP/IP通讯效率的问题,但是也给我们编程带来了一定的难度,其中最......

阅读全文(4534) | 评论:0