Страница: 1 |
Страница: 1 |
Вопрос: MemSet
Добавлено: 25.08.04 16:59
Автор вопроса: Lister | ICQ: 298621256
В сях есть функция memset
Чем её можно заменить в VB?
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 25.08.04 17:48
Если у тебя строка, то ты сможешь зарезервировать в ней место с пом.:
str = String$(NumOfBytes, bCharacter)
Если байтовый массив, то это тубе ReDim btArray(numOfByte)
А вообще, люби АПИ и работай с ними ))
HeapAlloc, HeapReAlloc, HeapFree, вот
Номер ответа: 2
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #2
Добавлено: 25.08.04 18:03
Так я и пытаюсь найти аналог в апях.
Использовал CopyMemory - вылетел VB
Вот этот код:
Private Type ButtonIcon
himl As Long
margin As RECT
uAlign As Long
End Type
--
Dim bi As ButtonIcon
Dim lLenght As Long
lLenght = Len(bi)
CopyMemory bi, ByVal 0&, lLenght
В Си он выглядит так:
struct
{
HIMAGELIST himl; // Index: Normal, hot, pushed, disabled, focused.
RECT margin; // Margin around icon.
UINT uAlign;
} bi;
memset(&bi, 0, sizeof(bi));
Может из меня переводчик никудышный
Номер ответа: 3
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #3
Добавлено: 25.08.04 18:03
P.S. Пытаюсь добавить иконку на кнопку
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 25.08.04 18:43
пропускай эту строку...
можешь написать за место ее: dim bi as ButtonIcon, и дельше работать...
Надо будет взять указатель, используй VarPtr(bi)
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 25.08.04 19:01
Немного уточню: в Си &bi - это указатель на структуру. В VB указателем будет retval от VarPtr. Т.е. в CopyMemory надо передавать адрес переменной в памяти (указатель на её начало).
Номер ответа: 6
Автор ответа:
Lister
ICQ: 298621256
Вопросов: 57
Ответов: 304
Профиль | | #6
Добавлено: 25.08.04 22:53
Что-то ничего не получается у меня.
Перевел с си код, который должен добавлять ImageList с картинками к кнопке - а результат нулевой...
Посмотрите, кому не лень - что не так?
Public Function Button_SetIcon( _
ByVal hButton As Long, _
ByVal hModule As Long, _
ByVal szIcon As String, _
Optional cx As Integer = 32, _
Optional cy As Integer = 32, _
Optional fuLoad As Long = LR_DEFAULTCOLOR) As Boolean
 im bi As ButtonIcon
 im hIconBlend As Long, hIcon As Long
 im lRetval As Long
Button_SetIcon = False
hIcon = LoadImage(App.hInstance, "c:\1.ico", IMAGE_ICON, cx, cy, LR_LOADFROMFILE)
bi.himl = ImageList_Create(cx, cy, ILC_COLOR16 Or ILC_MASK, 4, 0)
bi.uAlign = 4
lRetval = ImageList_Add(bi.himl, hIcon, 0)
lRetval = ImageList_Add(bi.himl, hIcon, 0)
lRetval = ImageList_Add(bi.himl, hIcon, 0)
hIconBlend = ImageList_GetIcon(bi.himl, 0, ILD_BLEND50 Or ILD_TRANSPARENT)
lRetval = ImageList_Add(bi.himl, hIconBlend, fuLoad)
lRetval = DestroyIcon(hIconBlend)
hIconBlend = ImageList_GetIcon(bi.himl, 3, ILD_BLEND50 Or ILD_TRANSPARENT)
lRetval = ImageList_Remove(bi.himl, 3)
lRetval = ImageList_Add(bi.himl, hIconBlend, 0)
lRetval = DestroyIcon(hIconBlend)
lRetval = ImageList_Add(bi.himl, hIcon, 0)
lRetval = SendMessage(hButton, BCM_FIRST Or BCM_SETIMAGELIST, ByVal 0&, bi)
If lRetval = 0 Then
lRetval = ImageList_Destroy(bi.himl)
lRetval = SendMessage(hButton, BM_SETIMAGE, IMAGE_ICON, hIcon)
Else
lRetval = DestroyIcon(hIcon)
lRetval = SetWindowText(hButton, ""
End If
Button_SetIcon = lRetval
End Function
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 25.08.04 23:52
>CopyMemory bi, ByVal 0&, lLenght
Ты неправильно CopyMemory использовал.
У тебя адрес источника ноль, а должно быть имя источника или ByVal его адреса.
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 26.08.04 00:01
пробуй ZoroMemory если хочешь очистить и без того чистую память )
Номер ответа: 9
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #9
Добавлено: 26.08.04 08:01
А строки-то в Unicode, поэтому numOfBytes<>numOfChars, а в первом
параметре функии String укаазывается именно количество символов.
В Си из-за таких ошибок разные пакости вроде переполнения буфера
бывают, слава богу VB от этого защищен изначально
Номер ответа: 10
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #10
Добавлено: 26.08.04 08:13
Мое последнее сообщение - в ответ на первый ответ от sne.
Номер ответа: 11
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #11
Добавлено: 26.08.04 10:06
2Павел, при работе с АПИ (с отличительным значком "A" NOT "W", создается ANSI строка, копия нашей...
Номер ответа: 12
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #12
Добавлено: 26.08.04 10:38
А причем здесь АПИ?
Я вот о чем: ты подразумеваешь, что в numOfBytes - кол-во байт, судя
по названию переменной. Однако, вот такой код:
Dim Str As String
Dim numOfBytes As Integer
numOfBytes=5
Str = String$(numOfBytes, " ")
MsgBox LenB(Str)
сообщит нам, что на самом деле длина строкив байтах в 2 раза больше,
чем numOfBytes.
Номер ответа: 13
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #13
Добавлено: 26.08.04 22:50
А при том что попробуй скопировать в байтовый массив строку, примерно таким способом:
redim bt (len(str) - vbnull)
Call CopyMemory(bt(0), byval str, len(str))
А потом скажи мне, неужели тебе скопируется только половина строки, а все остальное запишется в незарезервированную обл. памяти, и вызовет ошибку ?
Ты будешь не прав Проверено
То что в VB в реале строки это wchar'ы, это я знаю, но при обращении к АПИ, формируется обычная строчка...