Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

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

16.12.2014, 13:35. Показов 1637. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Воспользовался интерфейсом IUniformResourceLocatorW.
Задача - получить цель нескольких ярлыков URL и в идеале, чтобы не уничтожать объект InternetShortcut
для возможности повторно использовать этот экземпляр класса, работая со всеми файлами *.URL.
Но при попытке дважды вызвать метод Load интерфейса IPersistFile получаю ошибку "Automation error. Unspecified Error 80004005".
В примерах MSDN для освобождения ресурсов использовался метод Release, но в интерфейсе IPersistFile я такого не нашел (да и в описании нет) и не факт, что это решит проблему (подключал Edanmo OLE libs).

Написал 2 рабочих примера:
1) через создание экземпляра класса InternetShortcut

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Option Explicit
 
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszGuid As Long, pGuid As UUID) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynW" (ByVal lpString1 As Long, ByVal lpString2 As Long, ByVal iMaxLength As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
 
Dim IID_IURLW As UUID
 
Private Sub Form_Load()
    
    IURL_Init
    
    Debug.Print GetUrlTargetW("c:\1\HDTunePro.url")
    Debug.Print GetUrlTargetW("c:\1\010Editor.url")
    
    Unload Me
End Sub
 
Sub IURL_Init()
    Const IIDSTR_IURLW = "{CABB0DA0-DA57-11CF-9974-0020AFD79762}"
    ' Заполняем структуру UUID
    CLSIDFromString StrPtr(IIDSTR_IURLW), IID_IURLW
End Sub
 
' Получить цель из ярлыка URL
Public Function GetUrlTargetW(URLpathW As String) As String
    Dim IURL      As IUniformResourceLocatorW
    Dim IPF_URL   As IPersistFile
    Dim oIS       As InternetShortcut   'IURL CoClass
    Dim strLen    As Long
    Dim ptr       As Long
    Dim URLtarget As String
    
    Set oIS = New InternetShortcut
    ' Получаем указатель на интерфейс IUniformResourceLocatorW
    oIS.QueryInterface IID_IURLW, IURL
    ' Работаем с объектом URL через интерфейс IPersistFile
    Set IPF_URL = IURL
    ' Загружаем ярлык URL
    IPF_URL.Load URLpathW, STGM_READ
    ' Получаем указатель на строку с URL
    ptr = IURL.GetUrl
    strLen = lstrlen(ptr)
    URLtarget = Space(strLen)
    lstrcpyn StrPtr(URLtarget), ptr, strLen + 1
    ' Освобождаем указатель
    GlobalFree ptr
    Set IPF_URL = Nothing
    IURL.Release
    Set IURL = Nothing
    Set oIS = Nothing
    
    GetUrlTargetW = URLtarget
End Function


2) через CoCreateInstance
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Option Explicit
 
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszGuid As Long, pGuid As UUID) As Long
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
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynW" (ByVal lpString1 As Long, ByVal lpString2 As Long, ByVal iMaxLength As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
 
Dim IID_IURLW               As UUID
Dim CLSID_InternetShortcut  As UUID
 
Private Sub Form_Load()
    
    IURL_Init
    
    Debug.Print GetUrlTargetW("c:\1\HDTunePro.url")
    Debug.Print GetUrlTargetW("c:\1\010Editor.url")
        
    Unload Me
End Sub
 
Sub IURL_Init()
    Const CLSIDSTR_InternetShortcut As String = "{FBF23B40-E3F0-101B-8488-00AA003E56F8}"
    Const IIDSTR_IURLW              As String = "{CABB0DA0-DA57-11CF-9974-0020AFD79762}"
  
    CLSIDFromString StrPtr(IIDSTR_IURLW), IID_IURLW
    CLSIDFromString StrPtr(CLSIDSTR_InternetShortcut), CLSID_InternetShortcut
End Sub
 
' Получить цель из ярлыка URL
Public Function GetUrlTargetW(URLpathW As String) As String
    Dim IURL        As IUniformResourceLocatorW
    Dim IPF_URL     As IPersistFile
    Dim strLen      As Long
    Dim ptr         As Long
    Dim URLtarget   As String
    
    CoCreateInstance CLSID_InternetShortcut, 0&, CLSCTX_INPROC_SERVER, IID_IURLW, IURL
    Set IPF_URL = IURL
    
    ' Загружаем ярлык URL
    IPF_URL.Load URLpathW, STGM_READ
    ' Получаем указатель на строку с URL
    ptr = IURL.GetUrl
    strLen = lstrlen(ptr)
    URLtarget = Space(strLen)
    lstrcpyn StrPtr(URLtarget), ptr, strLen + 1
    ' Освобождаем ресурсы
    GlobalFree ptr
    Set IPF_URL = Nothing
    IURL.Release
    Set IURL = Nothing
    
    GetUrlTargetW = URLtarget
End Function


Наверное, по принципу работы и скорости не будут отличаться.

Можете посоветовать, как добиться максимальной скорости пакетной обработки?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2014, 13:35
Ответы с готовыми решениями:

Определить какой код будет исполняться быстрее
С точки зрения быстроты исполнения, какой из 2-х вариантов будет лучше? from datetime import timedelta print(- timedelta( ...

Сравнение строк или какой код быстрее работает ?
пример strcmp(AnsiString(DBGrid1->Columns->Items->FieldName).c_str(), AnsiString(Main->IndexFieldNames).c_str()); есть ещё ...

Программное создание ярлыков на URL страницы
Помогите, пожалуйста! Нужно чтобы Билдер создавал на рабочем столе ярлыки на определенные сайты

6
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
16.12.2014, 13:43  [ТС]
На всякий случай вкладываю часть IDL-файлов:
IUniformResourceLocatorW

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[
    odl,
    uuid(CABB0DA0-DA57-11CF-9974-0020AFD79762),
    helpstring("IUniformResourceLocator - Unicode version")
]
interface IUniformResourceLocatorW: IUnknown {
 
    [helpstring("Sets an object's URL")]
    HRESULT SetURL(
        [in] LPWSTR pcszURL,
        [in] IURL_SETURL_FLAGS dwInFlags);
 
    [helpstring("Gets an object's URL")]
    HRESULT GetURL(
        [out, retval] LONG *ppszURL);
 
    [helpstring("Invokes a command on an object's URL.")]
    HRESULT InvokeCommand(
        [in] URLINVOKECOMMANDINFO *purlici);
};
 
[
    uuid(FBF23B40-E3F0-101B-8488-00AA003E56F8)
]
coclass InternetShortcut {
    [default] interface IUniformResourceLocatorW;
    interface IUniformResourceLocatorA;
    interface IPersistFile;
    interface IPropertySetStorage;
    interface IObjectWithSite;
}

IPersistFile

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
    [
        odl,
        uuid(0000010c-0000-0000-C000-000000000046)
    ]
    interface IPersist : stdole.IUnknown {
 
        HRESULT GetClassID(
            [in, out] UUID *pClassID);
    }
 
    [
        odl,
        uuid(00000109-0000-0000-C000-000000000046),
    ]
    interface IPersistStream : IPersist {
 
        LONG IsDirty(void);
 
        HRESULT Load(
            [in] IStream *pStm);
 
        HRESULT Save(
            [in] IStream *pStm,
            [in] BOOL fClearDirty);
 
        HRESULT GetSizeMax(
            [out, retval] CURRENCY *pcbSize);
 
    }
 
    [
        odl,
        uuid(7FD52380-4E07-101B-AE2D-08002B2EC713),
        helpstring("IPersistStreamInit interface")
    ]
    interface IPersistStreamInit : IPersist {
 
        HRESULT IsDirty();
 
        HRESULT Load(
            [in] IStream *pStm);
 
        HRESULT Save(
            [in] IStream *pStm,
            [in] BOOL fClearDirty);
 
        HRESULT GetSizeMax(
            [out, retval] CURRENCY *pCbSize);
 
        HRESULT InitNew();
 
    }
 
    [
        odl,
        uuid(0000010b-0000-0000-C000-000000000046),
    ]
    interface IPersistFile : IPersist {
 
        LONG IsDirty();
 
        HRESULT Load(
            [in] LPWSTR pszFileName,
            [in] STGM dwMode);
 
        HRESULT Save(
        [in] LPWSTR pszFileName,
        [in] BOOL fRemember);
 
        HRESULT SaveCompleted(
            [in] LPWSTR pszFileName);
 
        HRESULT GetCurFile(
            [out, retval] LONG *ppszFileName);
    }
 
    [
        odl,
        uuid(0000010a-0000-0000-C000-000000000046),
    ]
    interface IPersistStorage : IPersist {
 
        LONG IsDirty();
 
        HRESULT InitNew(
            [in] IStorage *pStg);
 
        HRESULT Load(
            [in] IStorage *pStg);
 
        HRESULT Save(
            [in] IStorage *pStgSave,
            [in] BOOL fSameAsLoad);
 
        HRESULT SaveCompleted(
            [in] IStorage *pStgNew);
 
        HRESULT HandsOffStorage();
 
    }
 
    [
        odl,
        uuid(37D84F60-42CB-11CE-8135-00AA004BB851),
        helpstring("IPersistPropertyBag interface")
    ]
    interface IPersistPropertyBag : IPersist {
 
        HRESULT InitNew();
 
        HRESULT Load(
            [in] IPropertyBag *pPropBag,
            [in] IErrorLog *pErrorLog);
 
        HRESULT Save(
            [in] IPropertyBag *pPropBag,
            [in] LONG fClearDirty,
            [in] LONG fSaveAllProperties);
    }
 
    [
        odl,
        uuid(22F55881-280B-11d0-A8A9-00A0C90C2004),
    ]
    interface IPersistPropertyBag2 : IPersist {
 
        HRESULT InitNew(void);
 
        HRESULT Load(
            [in] IPropertyBag2 * pPropBag,
            [in] IErrorLog * pErrLog);
 
        HRESULT Save(
            [in] IPropertyBag2 * pPropBag,
            [in] BOOL fClearDirty,
            [in] BOOL fSaveAllProperties);
 
        LONG IsDirty(void);
 
    }
 
    [
        odl,
        uuid(BD1AE5E0-A6AE-11CE-BD37-504200C10000),
    ]
    interface IPersistMemory : IPersist {
 
        LONG IsDirty(void);
 
        HRESULT Load(
            [in] void *pMem,
            [in] LONG cbSize);
 
        HRESULT Save(
            [out] void *pMem,
            [in] BOOL fClearDirty,
            [in] LONG cbSize);
 
        HRESULT GetSizeMax(
            [out, retval] LONG *pCbSize);
 
        HRESULT InitNew(void);
 
    }
 
    [
        odl,
        uuid(0000000f-0000-0000-C000-000000000046),
    ]
    interface IMoniker : IPersistStream {
 
        // system moniker types; returned from IsSystemMoniker.
        typedef enum MKSYS {
            MKSYS_NONE = 0,
            MKSYS_GENERICCOMPOSITE = 1,
            MKSYS_FILEMONIKER = 2,
            MKSYS_ANTIMONIKER = 3,
            MKSYS_ITEMMONIKER = 4,
            MKSYS_POINTERMONIKER = 5,
            MKSYS_URLMONIKER = 6,
            MKSYS_CLASSMONIKER = 7,
            MKSYS_OBJREFMONIKER = 8,
            MKSYS_SESSIONMONIKER = 9
        } MKSYS;
 
        typedef enum MKREDUCE {
            MKRREDUCE_ONE           =   0x30,
            MKRREDUCE_TOUSER        =   0x20,
            MKRREDUCE_THROUGHUSER   =   0x10,
            MKRREDUCE_ALL           =   0
        } MKRREDUCE;
 
        HRESULT BindToObject(
            [in] IBindCtx *pbc,
            [in] IMoniker *pmkToLeft,
            [in] UUID *riidResult,
            [in, out] void *ppvResult);
 
        HRESULT BindToStorage(
            [in] IBindCtx *pbc,
            [in] IMoniker *pmkToLeft,
            [in] UUID *riid,
            [in, out] void *ppvObj);
 
        HRESULT Reduce(
            [in] IBindCtx *pbc,
            [in] LONG dwReduceHowFar,
            [in, out] IMoniker **ppmkToLeft,
            [out, retval] IMoniker **ppmkReduced);
 
        HRESULT ComposeWith(
            [in] IMoniker *pmkRight,
            [in] BOOL fOnlyIfNotGeneric,
            [out, retval] IMoniker **ppmkComposite);
 
        HRESULT Enum(
            [in] BOOL fForward,
            [out, retval] IEnumMoniker **ppenumMoniker);
 
        LONG IsEqual(
            [in] IMoniker *pmkOtherMoniker);
 
        HRESULT Hash(
            [out, retval] LONG *pdwHash);
 
        LONG IsRunning(
            [in] IBindCtx *pbc,
            [in] IMoniker *pmkToLeft,
            [in] IMoniker *pmkNewlyRunning);
 
        HRESULT GetTimeOfLastChange(
            [in] IBindCtx *pbc,
            [in] IMoniker *pmkToLeft,
            [out, retval] CURRENCY *pFileTime);
 
        HRESULT Inverse(
            [out, retval] IMoniker **ppmk);
 
        HRESULT CommonPrefixWith(
            [in] IMoniker *pmkOther,
            [out, retval] IMoniker **ppmkPrefix);
 
        HRESULT RelativePathTo(
            [in] IMoniker *pmkOther,
            [out, retval] IMoniker **ppmkRelPath);
 
        HRESULT GetDisplayName(
            [in] IBindCtx *pbc,
            [in] IMoniker *pmkToLeft,
            [out, retval] LONG *ppszDisplayName);
 
        HRESULT ParseDisplayName(
            [in] IBindCtx *pbc,
            [in] IMoniker *pmkToLeft,
            [in] LPWSTR pszDisplayName,
            [out, defaultvalue(0)] LONG *pchEaten,
            [out, retval] IMoniker **ppmkOut);
 
        HRESULT IsSystemMoniker(
            [out, retval] LONG *pdwMksys);
    }
 
    [
        odl,
        uuid(79eac9c9-baf9-11ce-8c82-00aa004ba90b),
    ]
    interface IPersistMoniker : stdole.IUnknown {
 
        HRESULT GetClassID(
            [out] UUID *pClassID);
 
        LONG IsDirty(void);
 
        HRESULT Load(
            [in] BOOL fFullyAvailable,
            [in] IMoniker *pimkName,
            [in] IBindCtx *pibc,
            [in] LONG grfMode);
 
        HRESULT Save(
            [in] IMoniker *pimkName,
            [in] IBindCtx *pbc,
            [in] BOOL fRemember);
 
        HRESULT SaveCompleted(
            [in] IMoniker *pimkName,
            [in] IBindCtx *pibc);
 
        HRESULT GetCurMoniker(
            [out, retval] IMoniker ** ppimkName);
 
    }
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
16.12.2014, 19:06
Лучший ответ Сообщение было отмечено Апострофф как решение

Решение

Привет.
Вызывать QueryInterface не нужно, VB6 сам это делает.
Можешь писать так:
Visual Basic
1
Set IURL = oIS
Насчет ошибки, проверить не могу пока, попробуй передать флаги STGM_DELETEONRELEASE и STGM_READWRITE, а вообще скинь проект сюда и файлы чтобы можно было потестировать.
Цитата Сообщение от Dragokas Посмотреть сообщение
метод Release
Это метод интерфейса IUnknown, его наследуют все COM интерфейсы. Для вызоваэтого метода нужно просто выполнить присвоение объектной ссылки значения Nothing:
Visual Basic
1
Set IURL = Nothing
Освобождать ресурсы нужно через объект с интерфейсом IMalloc, который можно получить например через вызов SHGetMalloc, или же вызывать CoTaskMemFree.
Цитата Сообщение от Dragokas Посмотреть сообщение
Можете посоветовать, как добиться максимальной скорости пакетной обработки?
Максимальная скорость будет, если ты создашь один объект один раз и дальше будешь загружать состояние для него через методы IPersist*
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.12.2014, 13:47  [ТС]
The trick, спасибо за ответ.

Я подготовил проект по твоим рекомендациям и пару ярлыков для теста,
правда, я не знаю какой указатель передавать в CoTaskMemFree.

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Option Explicit
 
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynW" (ByVal lpString1 As Long, ByVal lpString2 As Long, ByVal iMaxLength As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long)
 
Dim IURL      As IUniformResourceLocatorW
Dim IPF_URL   As IPersistFile
Dim oIS       As InternetShortcut   'IURL CoClass
Dim IM_URL    As IMalloc
 
Private Sub Form_Load()
    IURL_Init
    Debug.Print GetUrlTargetW(App.Path & "\HDTunePro.url")
    Debug.Print GetUrlTargetW(App.Path & "\010Editor.url")
    IURL_Release
    Unload Me
End Sub
 
Sub IURL_Init()
    Set oIS = New InternetShortcut      ' IShellLinkW : IUnknown
    Set IURL = oIS                      ' IShellLinkW -> IUniformResourceLocatorW
    Set IPF_URL = oIS                   ' IShellLinkW -> IPersistFile
End Sub
 
' Получить цель из ярлыка URL
Public Function GetUrlTargetW(URLpathW As String) As String
    Dim strLen    As Long
    Dim ptr       As Long
    Dim URLtarget As String
    
    ' Загружаем ярлык URL
    IPF_URL.Load URLpathW, STGM_READ
    ' Получаем указатель на строку с URL
    ptr = IURL.GetUrl
    strLen = lstrlen(ptr)
    URLtarget = Space(strLen)
    lstrcpyn StrPtr(URLtarget), ptr, strLen + 1
    ' Освобождаем указатель
    GlobalFree ptr
    
    ' DeAlloc memory block
    'IM_URL.Free PV     'pv - ???
    'CoTaskMemFree pv
    
    GetUrlTargetW = URLtarget
End Function
 
Sub IURL_Release()
    Set IPF_URL = Nothing
    Set IURL = Nothing
    Set oIS = Nothing
End Sub


Посмотри, пожалуйста.
Вложения
Тип файла: zip VB6_ResourceLocator.zip (625.2 Кб, 7 просмотров)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
22.12.2014, 21:02
Цитата Сообщение от Dragokas Посмотреть сообщение
я не знаю какой указатель передавать в CoTaskMemFree.
Visual Basic
1
CoTaskMemFree ptr
Небольшой внутренний анализ выявил что объект InternetShortcut не поддерживает повторную загрузку через IPersistFile.Load. Проверяется, загружался ли файл до этого и если да, то сразу генерируется HRESULT = 0x80004005. Грязный хак, который возможно работает только на моем компе:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
' Получить цель из ярлыка URL
Public Function GetUrlTargetW(URLpathW As String) As String
    Dim strLen    As Long
    Dim ptr       As Long
    Dim URLtarget As String
    
    ' Загружаем ярлык URL
    IPF_URL.Load URLpathW, 0 ' STGM_SIMPLE
    ' Получаем указатель на строку с URL
    ptr = IURL.GetUrl
    strLen = lstrlen(ptr)
    URLtarget = Space(strLen)
    lstrcpyn StrPtr(URLtarget), ptr, strLen + 1
    ' Освобождаем указатель
    CoTaskMemFree ptr
    ' Хак
    GetMem4 0&, ByVal ObjPtr(IPF_URL) + &H64
    
    GetUrlTargetW = URLtarget
End Function
Возможно есть какие-нибудь другие методы, для этого нужно глубже рыть.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
22.12.2014, 21:19  [ТС]
The trick, спасибо. Главное, что теперь нет утечек памяти.
Цитата Сообщение от The trick Посмотреть сообщение
Грязный хак, который возможно работает только на моем компе:
Так и есть. Ну и не страшно.

Можешь, пожалуйста, посмотреть более критическую часть - обработка LNK ?
Здесь все работает хорошо. Но мало ли, может, опять очистку неверно написал.

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Option Explicit
 
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszGuid As Long, pGuid As UUID) As Long
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
Private Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameW" (ByVal lpFileName As Long, ByVal nBufferLength As Long, ByVal lpBuffer As Long, ByVal lpFilePart As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
 
Const MAX_PATH_W As Long = 32767&
 
Dim oPFile          As IPersistFile
Dim oSLink          As IShellLinkW
 
Private Sub Form_Load()
    Dim sLinkName   As String
    Dim sURLName    As String
    Dim Arg         As String
    
    ISL_Init oPFile, oSLink
  
    NameFromLinkW App.Path & "\drweb5.exe.lnk", sLinkName, Arg
    Debug.Print sLinkName; Arg
    
    NameFromLinkW App.Path & "\ie.lnk", sURLName, Arg
    Debug.Print sURLName; Arg
    
    ISL_Release
    Unload Me
End Sub
 
Sub ISL_Init(oPFile As IPersistFile, oSLink As IShellLinkW)
    Dim CLSID_ShellLink As UUID
    Dim IID_IUnknown    As UUID
    Dim oUnknown        As IUnknown
 
    CLSIDFromString StrPtr(CLSIDSTR_ShellLink), CLSID_ShellLink
    CLSIDFromString StrPtr(IIDSTR_IUnknown), IID_IUnknown
    CoCreateInstance CLSID_ShellLink, 0&, CLSCTX_INPROC_SERVER, IID_IUnknown, oUnknown
 
    Set oPFile = oUnknown
    Set oSLink = oUnknown
End Sub
 
Sub ISL_Release()
    Set oPFile = Nothing
    Set oSLink = Nothing
End Sub
 
Private Sub NameFromLinkW(LinkFileName As String, Target As String, Arguments As String)
    On Error GoTo ErrorHandler
    Dim fd              As WIN32_FIND_DATAW
    Dim buf             As String
    
    oPFile.Load LinkFileName, STGM_READ
    
    buf = Space(MAX_PATH_W)
    oSLink.GetPath buf, MAX_PATH_W, fd, SLGP_UNCPRIORITY
    Target = GetFullPath(Left$(buf, lstrlen(StrPtr(buf))))
    
    buf = Space(MAX_PATH_W)
    oSLink.GetArguments buf, MAX_PATH_W
    Arguments = Left$(buf, lstrlen(StrPtr(buf)))
ErrorHandler:
End Sub
 
Function GetFullPath(sFileName As String) As String
    Dim Cnt        As Long
    Dim sFullName  As String
    
    sFullName = Space(MAX_PATH_W)
    Cnt = GetFullPathName(StrPtr(sFileName), MAX_PATH_W, StrPtr(sFullName), 0&)
    If Cnt Then
        GetFullPath = Left$(sFullName, Cnt)
    Else
        Stop
        GetFullPath = sFileName
    End If
End Function
Вложения
Тип файла: zip VB6_ShellLink2.zip (10.2 Кб, 5 просмотров)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
22.12.2014, 21:53
Dragokas, вроде все нормально.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2014, 21:53
Помогаю со студенческими работами здесь

Извлечь все ссылки из ярлыков .url и сохранить в текстовый файл
Доброго времени суток Ребята, помогите пожалуйста извлечь все ссылки из ярлыков .url и сохранить ссылки (по одной на строку) в текстовый...

Получение цели ярлыка Microsoft Installer (юникод)
Здравствуйте ! Помогите, пожалуйста, перевести эту функцию в юникодную версию. Private Declare Function MsiGetShortcutTarget Lib...

Анкоры с опечатками - для какой цели?
Вот уже который месяц наш сайт болтается по ключевым запросам в двадцатке вместо десятки. Продвигает его одна SEO-компания. Сегодня...

Подскажите, какой ноутбук купить? Цели использования: AutoCAD и так далее
Приветствую всех) Помогите с выбором производителя и характеристик( Цели использования: AutoCAD и так далее. Судя по требованиям...

Какой быстрее
Подскажите какой процессор лучше Intel Pentium Dual-Core E6300 или amd athlon ii x2 250


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru