Вопрос о SysFreeString

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Йода
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 99
Зарегистрирован: 06.01.2008 (Вс) 21:04
Откуда: Московская область

Вопрос о SysFreeString

Сообщение Йода » 17.07.2009 (Пт) 1:20

Здравствуйте. Вобщем в shlwapi.dll есть такая функция PathCanonicalize, которая принимает относительный путь типа "C:\A\B\.." и заполняет подготовленный строковый буфер абсолютным. Как оказалось в буфер пишется не "C:\A\", а "C:\A & Chr$(0) & B\", то есть по сути функция просто заменяет предпоследний слеш на символ окончания строки. Для выделения нужной части строки была написана функция:
Код: Выделить всё
Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (ByVal bStr As String, ByVal len_Bstr As Long) As String
Private Declare Function SysStringByteLen Lib "oleaut32.dll" (ByVal bStr As Long) As Long
Private Declare Sub GetMem2 Lib "msvbvm60.dll" (ByRef Source As Any, ByRef Destination As Any)

Private Function SelectString(strIn As String) As String

    Dim lng_PtrStart                             As Long
    Dim lng_PtrPos                               As Long
    Dim lng_PtrEnd                               As Long
    Dim intTmpChr                               As Integer

    lng_PtrStart = StrPtr(strIn)
    lng_PtrEnd = lng_PtrStart + SysStringByteLen(ByVal lng_PtrStart)

    For lng_PtrPos = lng_PtrStart To lng_PtrEnd Step 2
   
        Call GetMem2(ByVal lng_PtrPos, intTmpChr)
       
        If intTmpChr = 0 Then
            SelectString = SysAllocStringByteLen(strIn, (lng_PtrPos - lng_PtrStart) \ 2)
            Exit For
        End If
       
    Next lng_PtrPos
   
End Function

Собственно вопрос: Нужно ли вызывать SysFreeString после SysAllocStringByteLen(strIn, (lng_PtrPos - lng_PtrStart) \ 2) ?
Если не нужно то почему?
Если нужно, то что передавать в SysFreeString?

Заранее благодарен за потраченное на мой вопрос время.
Sub or Function not defined

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос о SysFreeString

Сообщение Хакер » 17.07.2009 (Пт) 1:37

В данном случае нет смысла, потому что не поможет, но (возможно) нужно, потому что (возможно) утечка памяти.

Дело в том, что VB конвертирует строку (возвращённую SysAllocString) обратно в юникод. Вероятно, исходную строку он не считает за BSTR и не делает для неё Free.

Так что для той строки, которая возвращается функцией обёрткой (т.к. она As String) вызывать Free нет смысла (и так вызывается силами VB), а для той строки, которая вызывается оригинальной SysAllocString — нужно, то никак не получится.

Решение: объявить SysAllocString в TLB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Вопрос о SysFreeString

Сообщение arthur2 » 13.03.2010 (Сб) 8:45

Хакер писал(а):Так что для той строки, которая возвращается функцией обёрткой (т.к. она As String) вызывать Free нет смысла (и так вызывается силами VB), а для той строки, которая вызывается оригинальной SysAllocString — нужно, то никак не получится.

Хакер писал(а):Решение: объявить SysAllocString в TLB.

А в таком случае что передавать в SysFreeString?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос о SysFreeString

Сообщение Хакер » 13.03.2010 (Сб) 10:40

SysFreeString вообще не надо вызывать в этом случае.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 106

    TopList