Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Dmitriy
Зарегистрирован: 26.07.2006 Сообщения: 14 Откуда: Тюмень
|
Добавлено: Чт Июл 27, 2006 7:50 am Заголовок сообщения: UserAttributeDATA |
|
|
Вопрос о Пользовательских атрибутах.
На любой элемент есть возможность навесть атрибуты
В VBA:
AddUserAttributeData
В MDL:
mdlElmdscr_appendAttributes
Так вот, если записывать атрибуты в MDL, то функцией mdlElmdscr_extractAttributes можно прекрассно их считать.
В VBA эту функцию использовать нельзя(или я не знаю как), так как бэйсик не работает с указателями.
Можно ли как-либо считать в VBA атрибуты записаные из MDL?! |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Июл 27, 2006 9:39 am Заголовок сообщения: |
|
|
MDL функции можно использовать в VBA, и указатель передавать можно, используя перед аргументом ByRef. Здесь подобная проблема уже обсуждалась в теме про разборку конуса.
А функция GetUserAttributeData() не берет эти атрибуты, добавленные в MDL? |
|
Вернуться к началу |
|
|
Dmitriy
Зарегистрирован: 26.07.2006 Сообщения: 14 Откуда: Тюмень
|
Добавлено: Чт Июл 27, 2006 12:00 pm Заголовок сообщения: |
|
|
Что GetUserAttributeData их не берет я понял с самого начала...
Да, атрибуты добавлены в MDL.
Declare Sub mdlElmdscr_extractAttributes Lib "stdmdlbltin.dll" ( ByRef length As Long , ByRef attributes As Long , ByVal elDscr As Long )
С певым и третим параметрами все вполне понятно, а вот со вторым...
В MDL, атрибуты были записаны следующим образом:
Код: |
short attrib[MAX_ATTRIBSIZE];
int len_attr=0;
.........
mdlElmdscr_appendAttributes(&newpipeElmDS,len_attr,attrib); |
|
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Чт Июл 27, 2006 4:30 pm Заголовок сообщения: |
|
|
Можно попробовать так
Код: |
Declare Sub mdlElmdscr_extractAttributes Lib "stdmdlbltin.dll" (ByRef length As Long, ByRef attributes() As Byte, ByVal elDscr As Long)
Dim attr(MAX_ATTRIBSIZE) As Byte
....
mdlElmdscr_extractAttributes length, attr, elDescrP
|
|
|
Вернуться к началу |
|
|
Dmitriy
Зарегистрирован: 26.07.2006 Сообщения: 14 Откуда: Тюмень
|
Добавлено: Пт Июл 28, 2006 8:52 am Заголовок сообщения: |
|
|
Так я уже тоже пробовал...
Все класно, даже иногда длину правильно считывает... (Бывает что Микрашка просто падает, это она любит )
Но в любом случае массив остается пустым...
Что делать, ума не приложу... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пт Июл 28, 2006 10:05 am Заголовок сообщения: |
|
|
Да... задачка интересная
Решил ее все-таки разгрызть
Вот что получилось...
В элементе записан атрибут:
Код: |
MSWChar attrib[10];
short* s_attrib;
wcscpy(attrib, L"123456789");
s_attrib = (short*)attrib;
mdlElmdscr_appendAttributes(&ed, length, s_attrib);
|
Вот такой код в VB у меня его взял:
Код: |
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (Destination As Any, _
Source As Any, ByVal Length As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" _
(ByVal hHeap As Long, ByVal dwFlags As Long, _
ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" _
(ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Dim oElEnum As ElementEnumerator
Dim oEl As element
Dim elDescrP As Long
Dim Length As Long
Dim ptr As Long
Dim hHeap As Long
Dim I As Integer
Dim attrSymbol As Integer
hHeap = GetProcessHeap()
' alloc memory
ptr = HeapAlloc(hHeap, 0, 2 * 650) 'an integer in Visual Basic is 2 bytes
Set oElEnum = ActiveModelReference.GetSelectedElements
oElEnum.Reset
While oElEnum.MoveNext
Set oEl = oElEnum.Current
elDescrP = oEl.MdlElementDescrP
If ptr <> 0 Then 'memory was allocated
mdlElmdscr_extractAttributes Length, ptr, elDescrP
For I = 0 To (Length - 1) * 2 Step 2 ' I - offset
CopyMemory attrSymbol, ByVal ptr + I, 2 ' an intger is two bytes
Debug.Print Chr(attrSymbol)
Next I
End If
Wend
' free memory
HeapFree GetProcessHeap(), 0, ptr
|
|
|
Вернуться к началу |
|
|
Dmitriy
Зарегистрирован: 26.07.2006 Сообщения: 14 Откуда: Тюмень
|
Добавлено: Пт Июл 28, 2006 12:34 pm Заголовок сообщения: |
|
|
Дааааа...
Как я понял mdlElmdscr_extractAttributes ты объявил все три параметра Long.
При этом, возвращается длина неимоверных размеров... Не пашет одним словом... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Пт Июл 28, 2006 1:00 pm Заголовок сообщения: |
|
|
Забыл про эту функцию...
Все параметры Long, первый - длина атррибута - по ссылке, остальные ByVal
Код: |
Declare Sub mdlElmdscr_extractAttributes Lib "stdmdlbltin.dll" (ByRef Length As Long, ByVal attributes As Long, ByVal elDscr As Long)
|
Length у меня для моего случая все время возвращает 9
Должно работать, все чисто... |
|
Вернуться к началу |
|
|
Dmitriy
Зарегистрирован: 26.07.2006 Сообщения: 14 Откуда: Тюмень
|
Добавлено: Вт Авг 01, 2006 7:12 am Заголовок сообщения: |
|
|
Если записано вот так:
Код: | short attrib[MAX_ATTRIBSIZE];
int len_attr=0;
.........
mdlElmdscr_appendAttributes(&newpipeElmDS,len_attr,attrib); |
То ни чего не читается...
Проблема в том, что приходится читать атрибуты записаные другой программой(она очень давно используется, менять нельзя)...
P.S. Может по почте свяжемся?! |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Вт Авг 01, 2006 11:42 am Заголовок сообщения: |
|
|
Я изначально понял, что проблема в считывании атрбибутов,
а оказывается - в их записи
Конечно при записи надо определять их длину,
если длина равна 0, то ничего записано не будет... |
|
Вернуться к началу |
|
|
Dmitriy
Зарегистрирован: 26.07.2006 Сообщения: 14 Откуда: Тюмень
|
Добавлено: Вт Авг 01, 2006 12:07 pm Заголовок сообщения: |
|
|
Изначально ты все понял правильно...
Аттрибуты записанные MDL'ем (тем способом что я написал), в VBA не читаются, даже так как ты написал...
При записи все Ок. Записывается MDL'ем и им же читается. Из VBA прочитать не могу...
Извиняюсь если запутал... |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Вт Авг 01, 2006 4:23 pm Заголовок сообщения: |
|
|
Я действительно малеха не въезжаю, потому что никогда не пробовал записывать атрибуты с нулевой длиной,
потому что не понимаю - какой смысл...
В твоем файле мой код прочитал, что в элементе есть атрибут с длиной Length=8,
значение массива атрибутов, если брать Integer, такие
18768
17744
11824
...
То есть, этому коду все равно - есть там атрибуты или нет, он просто читает память. А уж есть там атрибуты, или нет - это проблемы того кто их туда записывает...
Что там в атрибутах хоть быть должно?...
Какой формат данных? |
|
Вернуться к началу |
|
|
Dmitriy
Зарегистрирован: 26.07.2006 Сообщения: 14 Откуда: Тюмень
|
Добавлено: Ср Авг 02, 2006 7:31 am Заголовок сообщения: |
|
|
Спасибо!!! Твой код делает все что надо... Это я "немоного" тормозил .
Записаны они были не с нулевой длиной.
Записано там было PIPE0.80.
18768 = HEX(4950) = IP
17744 = HEX(4550) = EP
и т.д.
Еще раз Огромный спасиб! |
|
Вернуться к началу |
|
|
|