Получение цели ярлыков URL (какой код быстрее?) - VB

Узнай цену своей работы

Формулировка задачи:

Приветствую! Воспользовался интерфейсом IUniformResourceLocatorW. Задача - получить цель нескольких ярлыков URL и в идеале, чтобы не уничтожать объект InternetShortcut для возможности повторно использовать этот экземпляр класса, работая со всеми файлами *.URL. Но при попытке дважды вызвать метод Load интерфейса IPersistFile получаю ошибку "Automation error. Unspecified Error 80004005". В примерах MSDN для освобождения ресурсов использовался метод Release, но в интерфейсе IPersistFile я такого не нашел (да и в описании нет) и не факт, что это решит проблему (подключал Edanmo OLE libs). Написал 2 рабочих примера: 1) через создание экземпляра класса InternetShortcut
Листинг программы
  1. Option Explicit
  2. Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszGuid As Long, pGuid As UUID) As Long
  3. Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
  4. Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynW" (ByVal lpString1 As Long, ByVal lpString2 As Long, ByVal iMaxLength As Long) As Long
  5. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  6. Dim IID_IURLW As UUID
  7. Private Sub Form_Load()
  8. IURL_Init
  9. Debug.Print GetUrlTargetW("c:\1\HDTunePro.url")
  10. Debug.Print GetUrlTargetW("c:\1\010Editor.url")
  11. Unload Me
  12. End Sub
  13. Sub IURL_Init()
  14. Const IIDSTR_IURLW = "{CABB0DA0-DA57-11CF-9974-0020AFD79762}"
  15. ' Заполняем структуру UUID
  16. CLSIDFromString StrPtr(IIDSTR_IURLW), IID_IURLW
  17. End Sub
  18. ' Получить цель из ярлыка URL
  19. Public Function GetUrlTargetW(URLpathW As String) As String
  20. Dim IURL As IUniformResourceLocatorW
  21. Dim IPF_URL As IPersistFile
  22. Dim oIS As InternetShortcut 'IURL CoClass
  23. Dim strLen As Long
  24. Dim ptr As Long
  25. Dim URLtarget As String
  26. Set oIS = New InternetShortcut
  27. ' Получаем указатель на интерфейс IUniformResourceLocatorW
  28. oIS.QueryInterface IID_IURLW, IURL
  29. ' Работаем с объектом URL через интерфейс IPersistFile
  30. Set IPF_URL = IURL
  31. ' Загружаем ярлык URL
  32. IPF_URL.Load URLpathW, STGM_READ
  33. ' Получаем указатель на строку с URL
  34. ptr = IURL.GetUrl
  35. strLen = lstrlen(ptr)
  36. URLtarget = Space(strLen)
  37. lstrcpyn StrPtr(URLtarget), ptr, strLen + 1
  38. ' Освобождаем указатель
  39. GlobalFree ptr
  40. Set IPF_URL = Nothing
  41. IURL.Release
  42. Set IURL = Nothing
  43. Set oIS = Nothing
  44. GetUrlTargetW = URLtarget
  45. End Function
2) через CoCreateInstance
Листинг программы
  1. Option Explicit
  2. Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszGuid As Long, pGuid As UUID) As Long
  3. Private Declare Function CoCreateInstance Lib "ole32" (rclsid As Any, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, riid As Any, pvarResult As Object) As Long
  4. Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
  5. Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynW" (ByVal lpString1 As Long, ByVal lpString2 As Long, ByVal iMaxLength As Long) As Long
  6. Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  7. Dim IID_IURLW As UUID
  8. Dim CLSID_InternetShortcut As UUID
  9. Private Sub Form_Load()
  10. IURL_Init
  11. Debug.Print GetUrlTargetW("c:\1\HDTunePro.url")
  12. Debug.Print GetUrlTargetW("c:\1\010Editor.url")
  13. Unload Me
  14. End Sub
  15. Sub IURL_Init()
  16. Const CLSIDSTR_InternetShortcut As String = "{FBF23B40-E3F0-101B-8488-00AA003E56F8}"
  17. Const IIDSTR_IURLW As String = "{CABB0DA0-DA57-11CF-9974-0020AFD79762}"
  18. CLSIDFromString StrPtr(IIDSTR_IURLW), IID_IURLW
  19. CLSIDFromString StrPtr(CLSIDSTR_InternetShortcut), CLSID_InternetShortcut
  20. End Sub
  21. ' Получить цель из ярлыка URL
  22. Public Function GetUrlTargetW(URLpathW As String) As String
  23. Dim IURL As IUniformResourceLocatorW
  24. Dim IPF_URL As IPersistFile
  25. Dim strLen As Long
  26. Dim ptr As Long
  27. Dim URLtarget As String
  28. CoCreateInstance CLSID_InternetShortcut, 0&, CLSCTX_INPROC_SERVER, IID_IURLW, IURL
  29. Set IPF_URL = IURL
  30. ' Загружаем ярлык URL
  31. IPF_URL.Load URLpathW, STGM_READ
  32. ' Получаем указатель на строку с URL
  33. ptr = IURL.GetUrl
  34. strLen = lstrlen(ptr)
  35. URLtarget = Space(strLen)
  36. lstrcpyn StrPtr(URLtarget), ptr, strLen + 1
  37. ' Освобождаем ресурсы
  38. GlobalFree ptr
  39. Set IPF_URL = Nothing
  40. IURL.Release
  41. Set IURL = Nothing
  42. GetUrlTargetW = URLtarget
  43. End Function
Наверное, по принципу работы и скорости не будут отличаться. Можете посоветовать, как добиться максимальной скорости пакетной обработки?

Решение задачи: «Получение цели ярлыков URL (какой код быстрее?)»

textual
Листинг программы
  1. Set IURL = oIS

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы