DataObjectWB.cls
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:13k
源码类别:

浏览器

开发平台:

Visual Basic

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "DataObjectWB"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '*********************************************************************************************
  15. '
  16. ' Customizing the WebBrowser control
  17. '
  18. ' WB Customizer DataObject
  19. '
  20. '*********************************************************************************************
  21. '
  22. ' Author: Eduardo Morcillo
  23. ' E-Mail: edanmo@geocities.com
  24. ' Web Page: http://www.domaindlx.com/e_morcillo
  25. '
  26. ' Created: 03/25/2000
  27. '
  28. '*********************************************************************************************
  29. Option Explicit
  30. Private Const cfhtml_Tag_Start$ = "<!--StartFragment-->"
  31. Private Const cfhtml_Tag_End$ = "<!--EndFragment-->"
  32. Private Const cfhtml_Tag_SourceURL$ = "SourceURL:"
  33. Dim m_DragDropDataObject As IDataObject
  34. '
  35. ' pvStringFromhGlobal
  36. '
  37. ' Returns a string from a global memory handle
  38. '
  39. Private Function pvStringFromhGlobal(ByVal hGlobal As Long) As String
  40. Dim PtrStr As Long
  41.    PtrStr = GlobalLock(hGlobal)
  42.    pvStringFromhGlobal = String$(lstrlen(PtrStr), 0)
  43.    MoveMemory ByVal pvStringFromhGlobal, ByVal PtrStr, Len(pvStringFromhGlobal)
  44.    GlobalUnlock hGlobal
  45. End Function
  46. '
  47. ' GetText
  48. '
  49. ' Returns the dragged URL/Text
  50. '
  51. Public Function GetText() As String
  52. Dim rtn$
  53. Dim FMT As FORMATETC, STM As STGMEDIUM
  54. 'Dim Enm As IEnumFORMATETC
  55.    ' Format is IGNORED!!!!
  56.    With FMT
  57.       .cfFormat = CF_URL
  58.       .TYMED = TYMED_HGLOBAL
  59.       .dwAspect = DVASPECT_CONTENT
  60.       .lindex = -1
  61.    End With
  62.    ' Try to get the URL (this will fail with
  63.    ' files dragged to the control)
  64.    If m_DragDropDataObject.GetData(FMT, STM) = 0 Then
  65.       ' The user is dragging a link
  66.       ' Get the URL from the
  67.       ' global handle
  68.       rtn = StrConv(pvStringFromhGlobal(STM.Data), vbUnicode)
  69.       ReleaseStgMedium STM
  70.    Else
  71.       With FMT
  72.          .cfFormat = vbCFText
  73.          .TYMED = TYMED_HGLOBAL
  74.          .dwAspect = DVASPECT_CONTENT
  75.          .lindex = -1
  76.       End With
  77.       If m_DragDropDataObject.GetData(FMT, STM) = 0 Then
  78.          ' The user is dragging text
  79.          ' Get the text from the
  80.          ' global handle
  81.          rtn = StrConv(pvStringFromhGlobal(STM.Data), vbUnicode)
  82.          ReleaseStgMedium STM
  83.       End If
  84.    End If
  85. If rtn <> "" Then
  86.     If Asc(Right(rtn, 1)) = 0 Then
  87.         rtn = Left(rtn, Len(rtn) - 1)
  88.     End If
  89. End If
  90. GetText = rtn
  91. End Function
  92. '
  93. ' Files
  94. '
  95. ' Returns a collection filled with
  96. ' the dragged file names
  97. '
  98. Public Property Get Files() As Collection
  99. Dim STM As STGMEDIUM, FMT As FORMATETC
  100. Dim lMaxIdx As Long, lIdx As Long
  101. Dim sFile As String, lLen As Long
  102.    ' Create a mew collection
  103.    Set Files = New Collection
  104.    ' Fill the FORMATETC struct
  105.    ' to retrieve the filename
  106.    ' data in CF_HDROP format
  107.    With FMT
  108.       .cfFormat = CF_HDROP
  109.       .TYMED = TYMED_HGLOBAL
  110.       .dwAspect = DVASPECT_CONTENT
  111.       .lindex = -1
  112.    End With
  113.    ' Get the data from IDataObject
  114.    ' This call will fill the STM
  115.    ' struct with a pointer to
  116.    ' the DROPFILES struct
  117.    If m_DragDropDataObject.GetData(FMT, STM) = 0 Then
  118.       ' Get file name count
  119.       lMaxIdx = DragQueryFile(STM.Data, -1, vbNullString, 0)
  120.       ' Get filenames
  121.       For lIdx = 0 To lMaxIdx - 1
  122.          sFile = String$(260, 0)
  123.          ' Get the file name
  124.          lLen = DragQueryFile(STM.Data, lIdx, sFile, Len(sFile))
  125.          sFile = StrConv(Left$(sFile, lLen), vbNarrow)
  126.          ' Add the file name to the
  127.          ' collection
  128.          Files.Add sFile
  129.       Next
  130.       ' Release memory used by
  131.       ' STM.Data
  132.       ReleaseStgMedium STM
  133.    End If
  134. End Property
  135. '
  136. ' IDataObject
  137. '
  138. ' Sets the IDataObject that contains the data
  139. Friend Property Set IDataObject(ByVal IDO As IDataObject)
  140.    Set m_DragDropDataObject = IDO
  141. End Property
  142. '---------------------------------------------------------------------------------------
  143. ' Procedure : GetImageUrl
  144. ' DateTime  : 2005-5-9 23:46
  145. ' Author    : Lingll
  146. ' Purpose   : 获得img的url,供外部使用
  147. '---------------------------------------------------------------------------------------
  148. Public Function GetImageUrl() As String
  149. Dim tHtml$, tFrag$, tSUrl$
  150. Dim tPos&
  151. tHtml = GetCFHtml()
  152. tFrag = GetFragment(tHtml)
  153. tSUrl = GetSourceURL(tHtml)
  154. tPos = IsImageDrop(tFrag)
  155. If tPos > 0 Then
  156.     GetImageUrl = GetImgUrl(tSUrl, tFrag)
  157. End If
  158. End Function
  159. '---------------------------------------------------------------------------------------
  160. ' Procedure : GetImgUrl
  161. ' DateTime  : 2005-5-10 15:55
  162. ' Author    : Lingll
  163. ' Purpose   : 获得img的url,供内部使用
  164. '---------------------------------------------------------------------------------------
  165. Private Function GetImgUrl(vUrl$, vHtml$) As String
  166. On Error Resume Next
  167.     Dim tPos1&, tPos2&, tPos3&
  168.     Dim tOrgSrc$
  169.     
  170.     tPos1 = InStr(1, vHtml, "<IMG ", vbTextCompare)
  171.     If tPos1 > 0 Then
  172.         tPos1 = InStr(tPos1 + 1, vHtml, "src=", vbTextCompare)
  173.         tPos3 = InStr(tPos1, vHtml, ">", vbTextCompare)
  174.         If tPos1 > 0 Then
  175.             Select Case Mid$(vHtml, tPos1 + 4, 1)
  176.                 Case "'"
  177.                     tPos2 = InStr(tPos1 + 5, vHtml, "'")
  178.                     If tPos2 > 0 And tPos2 < tPos3 Then
  179.                         tOrgSrc = Mid$(vHtml, tPos1 + 5, tPos2 - tPos1 - 5)
  180.                     End If
  181.                 Case """"
  182.                     tPos2 = InStr(tPos1 + 5, vHtml, """")
  183.                     If tPos2 > 0 And tPos2 < tPos3 Then
  184.                         tOrgSrc = Mid$(vHtml, tPos1 + 5, tPos2 - tPos1 - 5)
  185.                     End If
  186.                 Case Else
  187.                     tPos2 = InStr(tPos1 + 1, vHtml, " ")
  188.                     If tPos2 <= 0 Or tPos2 > tPos3 Then
  189.                         tPos2 = tPos3
  190.                     End If
  191.                     tOrgSrc = Mid$(vHtml, tPos1 + 4, tPos2 - tPos1 - 4)
  192.             End Select
  193.             
  194.             If tOrgSrc <> vbNullString Then
  195.                 GetImgUrl = GetRealUrl(vUrl, tOrgSrc)
  196.             End If
  197.         End If
  198.     End If
  199. End Function
  200. '---------------------------------------------------------------------------------------
  201. ' Procedure : GetRealUrl
  202. ' DateTime  : 2005-5-10 16:21
  203. ' Author    : Lingll
  204. ' Purpose   :
  205. '---------------------------------------------------------------------------------------
  206. Private Function GetRealUrl(ByVal vSrcUrl$, ByVal vOrgUrl$) As String
  207. Dim tPos1&, tPos1Pre&, tPos2&, tPosStart&
  208. If InStr(1, vOrgUrl, "://") > 0 Then
  209.     GetRealUrl = vOrgUrl
  210. ElseIf InStr(1, vOrgUrl, ":") > 0 Then
  211.     GetRealUrl = vOrgUrl
  212. Else
  213.     vOrgUrl = Replace(vOrgUrl, "", "/")
  214.     vSrcUrl = Replace(vSrcUrl, "", "/")
  215.     If Right$(vSrcUrl, 1) <> "/" Then
  216.         tPos1 = InStrRev(vSrcUrl, "/")
  217.         If tPos1 > 0 Then
  218.             vSrcUrl = Left$(vSrcUrl, tPos1)
  219.         End If
  220.     End If
  221.     tPosStart = InStr(1, vSrcUrl, "://")
  222.     tPos1 = InStr(1, vOrgUrl, "../")
  223.     tPos1Pre = 0
  224.     tPos2 = Len(vSrcUrl)
  225.     While tPos1 > 0
  226.         tPos2 = InStrRev(vSrcUrl, "/", tPos2 - 1)
  227.         
  228.         tPos1Pre = tPos1
  229.         tPos1 = InStr(tPos1 + 1, vOrgUrl, "../")
  230.     Wend
  231.     If tPos1Pre > 0 Then
  232.         GetRealUrl = Left$(vSrcUrl, tPos2) & Replace(Mid$(vOrgUrl, tPos1Pre + 3), "./", "")
  233.     ElseIf tPos1Pre = 0 Then
  234.         GetRealUrl = vSrcUrl & Replace(vOrgUrl, "./", "")
  235.     End If
  236. End If
  237. End Function
  238. ''---------------------------------------------------------------------------------------
  239. '' Procedure : GetUrlFolder
  240. '' DateTime  : 2005-5-10 17:04
  241. '' Author    : Lingll
  242. '' Purpose   : 获取url中/分隔的部分(此函数为反向顺序)
  243. ''---------------------------------------------------------------------------------------
  244. 'Private Function GetUrlFolderRev(ByVal vUrl$, vPos&) As String
  245. 'Dim tPosStart&
  246. 'Dim tPos1&
  247. 'Dim tArr() As String
  248. '
  249. 'If Right$(vUrl, 1) = "/" Then
  250. '    vUrl = Left$(vUrl, Len(vUrl) - 1)
  251. 'End If
  252. '
  253. 'tPosStart = InStr(1, vUrl, "://")
  254. 'If tPosStart > 0 Then
  255. '    tPosStart = tPosStart + 3
  256. 'Else
  257. '    tPosStart = 1
  258. 'End If
  259. '
  260. 'tPos1 = InStr(tPosStart, vUrl, "/")
  261. 'If tPos1 > 0 Then
  262. '    tArr = Split(Mid$(vUrl, tPos1 + 1), "/")
  263. '    Select Case vPos
  264. '        Case Is <= UBound(tArr) + 1
  265. '            GetUrlFolderRev = tArr(UBound(tArr) + 1 - vPos) & "/"
  266. '        Case UBound(tArr) + 2
  267. '            GetUrlFolderRev = Left$(vUrl, tPos1 - 1) & "/"
  268. '        Case Else
  269. '            GetUrlFolderRev = ""
  270. '    End Select
  271. 'Else
  272. '    If vPos = 1 Then
  273. '        GetUrlFolderRev = vUrl & "/"
  274. '    Else
  275. '        GetUrlFolderRev = ""
  276. '    End If
  277. 'End If
  278. '
  279. 'End Function
  280. '---------------------------------------------------------------------------------------
  281. ' Procedure : GetCFHtml
  282. ' DateTime  : 2005-5-10 15:50
  283. ' Author    : Lingll
  284. ' Purpose   :
  285. '---------------------------------------------------------------------------------------
  286. Public Function GetCFHtml() As String
  287.     Dim tArr() As Byte
  288.     Dim tstr$
  289.     Dim FMT As FORMATETC, STM As STGMEDIUM
  290.     With FMT
  291.        .cfFormat = CF_HTML
  292.        .TYMED = TYMED_HGLOBAL
  293.        .dwAspect = DVASPECT_CONTENT
  294.        .lindex = -1
  295.     End With
  296.    
  297.     If m_DragDropDataObject.GetData(FMT, STM) = 0 Then
  298.        'GetCFHtml = StrConv(pvStringFromhGlobal(STM.Data), vbUnicode)
  299.        tArr = pvStringFromhGlobal(STM.Data)
  300.        GetCFHtml = UTF8_Decode(tArr)
  301.        ReleaseStgMedium STM
  302.     End If
  303. End Function
  304. '---------------------------------------------------------------------------------------
  305. ' Procedure : GetFragment
  306. ' DateTime  : 2005-5-9 23:52
  307. ' Author    : Lingll
  308. ' Purpose   : 获得在 "<!--StartFragment-->","<!--EndFragment-->"之间的东西
  309. '---------------------------------------------------------------------------------------
  310. Public Function GetFragment(vHtml$) As String
  311.     Dim tPos1&, tPos2&
  312.     
  313.     tPos1 = InStr(1, vHtml, cfhtml_Tag_Start, vbTextCompare)
  314.     If tPos1 > 0 Then
  315.         tPos2 = InStr(tPos1, vHtml, cfhtml_Tag_End, vbTextCompare)
  316.         If tPos2 > 0 Then
  317.             GetFragment = Mid$(vHtml, tPos1 + Len(cfhtml_Tag_Start), tPos2 - tPos1 - Len(cfhtml_Tag_Start))
  318.         End If
  319.     End If
  320. End Function
  321. '---------------------------------------------------------------------------------------
  322. ' Procedure : GetSourceURL
  323. ' DateTime  : 2005-5-10 16:02
  324. ' Author    : Lingll
  325. ' Purpose   :
  326. '---------------------------------------------------------------------------------------
  327. Private Function GetSourceURL(vHtml$) As String
  328.     Dim tPos1&, tPos2&
  329.     tPos1 = InStr(1, vHtml, cfhtml_Tag_SourceURL, vbTextCompare)
  330.     If tPos1 > 0 Then
  331.         tPos2 = InStr(tPos1, vHtml, vbNewLine)
  332.         If tPos2 > 0 Then
  333.             GetSourceURL = Mid$(vHtml, tPos1 + Len(cfhtml_Tag_SourceURL), tPos2 - tPos1 - Len(cfhtml_Tag_SourceURL))
  334.         End If
  335.     End If
  336. End Function
  337. '---------------------------------------------------------------------------------------
  338. ' Procedure : IsImageDrop
  339. ' DateTime  : 2005-5-9 23:57
  340. ' Author    : Lingll
  341. ' Purpose   :
  342. '---------------------------------------------------------------------------------------
  343. Public Function IsImageDrop(vImghtml$) As Long
  344. Dim FMT As FORMATETC
  345.     With FMT
  346.        .cfFormat = vbCFDIB
  347.        .TYMED = TYMED_HGLOBAL
  348.        .dwAspect = DVASPECT_CONTENT
  349.        .lindex = -1
  350.     End With
  351.     If m_DragDropDataObject.QueryGetData(FMT) = 0 Then
  352.         IsImageDrop = InStr(1, vImghtml, "<IMG ", vbTextCompare)
  353.     Else
  354.         IsImageDrop = 0
  355.     End If
  356. End Function
  357. '---------------------------------------------------------------------------------------
  358. ' Procedure : GetHtmlTag
  359. ' DateTime  : 2005-5-10 18:38
  360. ' Author    : Lingll
  361. ' Purpose   : url,text,img
  362. '---------------------------------------------------------------------------------------
  363. Public Function GetHtmlDragDropType() As String
  364. Dim FMT As FORMATETC
  365. Dim isHtml As Boolean, isDIB As Boolean, isUrl As Boolean, isText As Boolean
  366. With FMT
  367.    .TYMED = TYMED_HGLOBAL
  368.    .dwAspect = DVASPECT_CONTENT
  369.    .lindex = -1
  370. End With
  371. FMT.cfFormat = CF_HTML
  372. isHtml = (m_DragDropDataObject.QueryGetData(FMT) = 0)
  373. FMT.cfFormat = vbCFDIB
  374. isDIB = (m_DragDropDataObject.QueryGetData(FMT) = 0)
  375. FMT.cfFormat = CF_URL
  376. isUrl = (m_DragDropDataObject.QueryGetData(FMT) = 0)
  377. FMT.cfFormat = vbCFText
  378. isText = (m_DragDropDataObject.QueryGetData(FMT) = 0)
  379. If isHtml And isDIB Then
  380.     GetHtmlDragDropType = "img"
  381. ElseIf isUrl Then
  382.     GetHtmlDragDropType = "url"
  383. ElseIf isText Then
  384.     GetHtmlDragDropType = "text"
  385. End If
  386. End Function