天天看點

C#中實作WebBrowser控件的HTML源代碼讀寫

C#中實作WebBrowser控件的HTML源代碼讀寫

<a href="http://www.blogcn.com/user8/flier_lu/index.html?id=1125200&amp;run=.0D9CAA6">http://www.blogcn.com/user8/flier_lu/index.html?id=1125200&amp;run=.0D9CAA6</a>

趁周末想折騰一下嵌入ASP.NET的WinForm程式

 需要用到WebBrowser控件的HTML源碼讀寫

 就把以前的一些代碼片斷移值到C#下

 順便發個文章備忘,呵呵

 思路其實很簡單,直接通過document.documentElement.outerHTML

 或者使用IPersistStreamInit接口直接對流進行處理

 前者我就不廢話了,後者實作方法如下

 首先是寫入HTML到已初始化的WebBrowser控件

 初始化可以通過Navigate("about:blank")完成

 必須確定WebBrowser.Document != null

 否則應該推遲到DocumentComplete事件再讀寫

C#中實作WebBrowser控件的HTML源代碼讀寫

UCOMIStream stream = null;

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 CreateStreamOnHGlobal(Marshal.StringToHGlobalUni(value), true, out stream);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 if(stream != null)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

{

C#中實作WebBrowser控件的HTML源代碼讀寫

   IPersistStreamInit persistentStreamInit =

C#中實作WebBrowser控件的HTML源代碼讀寫

     (IPersistStreamInit)WebBrowser.Document;

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   persistentStreamInit.InitNew();

C#中實作WebBrowser控件的HTML源代碼讀寫

   persistentStreamInit.Load(stream);

C#中實作WebBrowser控件的HTML源代碼讀寫

   persistentStreamInit = null;

C#中實作WebBrowser控件的HTML源代碼讀寫

 }

C#中實作WebBrowser控件的HTML源代碼讀寫

 UCOMIStream是COM中IStream的CLR版本

 CreateStreamOnHGlobal函數從一個字元串的位址

 建立一個IStream供使用

C#中實作WebBrowser控件的HTML源代碼讀寫

 [DllImport("ole32.dll", PreserveSig=false)]

C#中實作WebBrowser控件的HTML源代碼讀寫

 static extern void CreateStreamOnHGlobal(IntPtr hGlobal,

C#中實作WebBrowser控件的HTML源代碼讀寫

   Boolean fDeleteOnRelease, [Out] out UCOMIStream pStream);

 然後就是通過IPersistStreamInit接口初始化并載入HTML源碼,

 IPersistStreamInit接口CLR預設沒有導入,定義如下

C#中實作WebBrowser控件的HTML源代碼讀寫

 [ComVisible(true), ComImport(), Guid("7FD52380-4E07-101B-AE2D-08002B2EC713"),

C#中實作WebBrowser控件的HTML源代碼讀寫

  InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]

C#中實作WebBrowser控件的HTML源代碼讀寫

 public interface IPersistStreamInit

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   void GetClassID([In, Out] ref Guid pClassID);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   [return: MarshalAs(UnmanagedType.I4)] [PreserveSig]

C#中實作WebBrowser控件的HTML源代碼讀寫

   int IsDirty();

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   void Load([In, MarshalAs(UnmanagedType.Interface)] UCOMIStream pstm);

C#中實作WebBrowser控件的HTML源代碼讀寫

   void Save([In, MarshalAs(UnmanagedType.Interface)] UCOMIStream pstm,

C#中實作WebBrowser控件的HTML源代碼讀寫

             [In, MarshalAs(UnmanagedType.I4)] int fClearDirty);

C#中實作WebBrowser控件的HTML源代碼讀寫

   void GetSizeMax([Out, MarshalAs(UnmanagedType.LPArray)] long pcbSize);

C#中實作WebBrowser控件的HTML源代碼讀寫

   void InitNew();

C#中實作WebBrowser控件的HTML源代碼讀寫

 讀取HTML也是類似思路,将HTML源碼寫到一個IStream中

 然後轉換成字元串供C#代碼使用,不過實作方式比較麻煩

 比較簡單的方法還是使用ole32.dll提供的函數

 重建流,但這需要預先設定流的長度,如

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 CreateStreamOnHGlobal(Marshal.AllocHGlobal(4096), true, out stream);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 IPersistStreamInit persistentStreamInit =

C#中實作WebBrowser控件的HTML源代碼讀寫

   (IPersistStreamInit)WebBrowser.Document;

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 persistentStreamInit.Save(stream, 0);

C#中實作WebBrowser控件的HTML源代碼讀寫

 persistentStreamInit = null;

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 IntPtr pStr;

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 GetHGlobalFromStream(stream, out pStr);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 return Marshal.PtrToStringAnsi(pStr);

 然後使用GetHGlobalFromStream函數和

 Marshal.PtrToStringAnsi将流轉換為字元串

 另外一種方法是自行實作一個支援IStream接口的類

 通過流的方式靈活完成讀取操作,我比較喜歡這種 

C#中實作WebBrowser控件的HTML源代碼讀寫

 using(MemoryStream stream = new MemoryStream())

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   ComStreamAdapter adapter = new ComStreamAdapter(stream);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   persistentStreamInit.Save(adapter, 0);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   stream.Seek(0, SeekOrigin.Begin);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

   using(StreamReader reader = new StreamReader(stream))

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

     return reader.ReadToEnd();

C#中實作WebBrowser控件的HTML源代碼讀寫

   }

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

 這裡的ComStreamAdapter是一個使用了adapter模式的類

 将普通的System.IO.Stream轉換為IStream支援的類

C#中實作WebBrowser控件的HTML源代碼讀寫

  public class ComStreamAdapter : UCOMIStream

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       private Stream _stream;

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public ComStreamAdapter(Stream stream)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         _stream = stream;

C#中實作WebBrowser控件的HTML源代碼讀寫

       }

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       UCOMIStream Members#region UCOMIStream Members

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void Commit(int grfCommitFlags)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void Clone(out UCOMIStream ppstm)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         ppstm = null;

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void CopyTo(UCOMIStream pstm, long cb, System.IntPtr pcbRead, Syste

C#中實作WebBrowser控件的HTML源代碼讀寫

 m.IntPtr pcbWritten)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void Revert()

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void LockRegion(long libOffset, long cb, int dwLockType)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void UnlockRegion(long libOffset, long cb, int dwLockType)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void Seek(long dlibMove, int dwOrigin, System.IntPtr plibNewPositio

C#中實作WebBrowser控件的HTML源代碼讀寫

 n)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         _stream.Seek(dlibMove, (SeekOrigin)dwOrigin);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         if(plibNewPosition != IntPtr.Zero)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

           Marshal.WriteInt32(plibNewPosition, (int)_stream.Position);

C#中實作WebBrowser控件的HTML源代碼讀寫

         }

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void Read(byte[] pv, int cb, System.IntPtr pcbRead)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         int size = _stream.Read(pv, (int)_stream.Position, cb);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         if(pcbRead != IntPtr.Zero)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

           Marshal.WriteInt32(pcbRead, size);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void Write(byte[] pv, int cb, System.IntPtr pcbWritten)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         _stream.Write(pv, 0, cb);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         if(pcbWritten != IntPtr.Zero)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

           Marshal.WriteInt32(pcbWritten, cb);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void SetSize(long libNewSize)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         _stream.SetLength(libNewSize);

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       public void Stat(out STATSTG pstatstg, int grfStatFlag)

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

         pstatstg = new STATSTG ();

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

       #endregion

C#中實作WebBrowser控件的HTML源代碼讀寫

     }

C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫
C#中實作WebBrowser控件的HTML源代碼讀寫

繼續閱讀