String<-->long

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

String<-->long

Сообщение Alexanbar » 29.01.2006 (Вс) 21:14

Есть такой тип, существующий в *.tlb:

Код: Выделить всё
Private Type mSTATURL
    cbSize As Long
    dwFlags As STATURLFLAGS
    ftExpires As FILETIME
    ftLastUpdated As FILETIME
    ftLastVisited As FILETIME
    pwcsTitle As long
    pwcsUrl As long
End Type



Переменные этого типа передаются ByRef в одном из методов.

Проблема вот в чём. Когда я извлекаю строковые данные

pwcsTitle, pwcsUrl с помощью вот такой функции:

Код: Выделить всё
Public Function GetStrFromPtrA(ByVal lpszA As Long) As String

   GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0)
   Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
   
End Function


строки получаются укороченными - pwcsUrl содержит только один символ, pwcsTitle - одно слово (букв 5).

Как я понял, перед использованием этой переменной, нужно сделать буферы для строковых переменных (объявленных как long), чтобы туда поместить результат.

Вот только как это сделать?

Кстати, исходники TLB есть.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 29.01.2006 (Вс) 22:55

Ну, вроде чуть-чуть появился свет в тонеле. Оказывается, как раз вноваты ф-ции lstrlenA и lstrcpyA. Нужно использовать их аналоги lstrlenW и lstrcpy. Вот только почему-то отрубание началось.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 29.01.2006 (Вс) 23:23

Отруб, как оказалось, делает ф-я lstrlenW. Сделал резервирование заведомо большего места:

Код: Выделить всё
Public Function GetStrFromPtrA(ByVal lpszA As Long) As String

   GetStrFromPtrA = String$(2048, 0)
   Call lstrcpyW(ByVal GetStrFromPtrA, ByVal lpszA)
   
End Function

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.01.2006 (Пн) 4:15

Гы гы...
Дык надо же это... гы гы гы...

GetStrFromPtrW = String$(lstrlenW(lpszW), 0)
CopyMemory byval strptr(GetStrFromPtrW), byval lpszW, len(GetStrFromPtrW)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

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

    TopList  
cron