Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: MemSet Добавлено: 25.08.04 16:59  

Автор вопроса:  Lister | ICQ: 298621256 
В сях есть функция memset

Чем её можно заменить в VB?

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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
  
  ;Dim bi As ButtonIcon
  ;Dim hIconBlend As Long, hIcon As Long
  ;Dim 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-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 25.08.04 23:52
>CopyMemory bi, ByVal 0&, lLenght
 Ты неправильно CopyMemory использовал.
 У тебя адрес источника ноль, а должно быть имя источника или ByVal его адреса.

Ответить

Номер ответа: 8
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #8
Добавлено: 26.08.04 00:01
пробуй ZoroMemory если хочешь очистить и без того чистую память :))

Ответить

Номер ответа: 9
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #9
Добавлено: 26.08.04 08:01
А строки-то в Unicode, поэтому numOfBytes<>numOfChars, а в первом
параметре функии String укаазывается именно количество символов.

В Си из-за таких ошибок разные пакости вроде переполнения буфера
бывают, слава богу VB от этого защищен изначально :)

Ответить

Номер ответа: 10
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #10
Добавлено: 26.08.04 08:13
Мое последнее сообщение - в ответ на первый ответ от sne.

Ответить

Номер ответа: 11
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #11
Добавлено: 26.08.04 10:06
2Павел, при работе с АПИ (с отличительным значком "A" NOT "W";), создается ANSI строка, копия нашей...

Ответить

Номер ответа: 12
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #13
Добавлено: 26.08.04 22:50
А при том что попробуй скопировать в байтовый массив строку, примерно таким способом:

redim bt (len(str) - vbnull)
Call CopyMemory(bt(0), byval str, len(str))

А потом скажи мне, неужели тебе скопируется только половина строки, а все остальное запишется в незарезервированную обл. памяти, и вызовет ошибку ?

Ты будешь не прав ;) Проверено :)

То что в VB в реале строки это wchar'ы, это я знаю, но при обращении к АПИ, формируется обычная строчка...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам