Windows API?
Модератор: Саша З.
- Alexandra
- Участник со стажем
- Сообщения: 754
- Зарегистрирован(а): 18 дек 2002, 10:12
- Откуда: Кочую по Израилю
- Контактная информация:
Windows API?
А интересно здесь кто-нибудь в Windows API разбирается? А то очень надо......
- Борис Бердичевский
- Ветеран интернета
- Сообщения: 29353
- Зарегистрирован(а): 17 ноя 2001, 02:00
- Откуда: Израиль, Беэр-Шева, которой ~3700 лет
- Контактная информация:
Это функции Windows, которые в MSDN справочнике входят в топик Windows Client SDK. Например, ShowWindow, SelectObject, BitBlt и т.п.
Так?
Если об этом речь, я в этом неплохо разбираюсь.
Так?
Если об этом речь, я в этом неплохо разбираюсь.
Меня зовут Барух Борис. Ани маамин бэ эмуна шлема...
Про «палестинцев»: «Они ревность Мою вызывали небогом... Я в них ревность вызову ненародом»
Мы -- здесь, они -- там! Мы здесь, в Израиле, они там, в арабских странах! | http://www.borisba.com
Про «палестинцев»: «Они ревность Мою вызывали небогом... Я в них ревность вызову ненародом»
Мы -- здесь, они -- там! Мы здесь, в Израиле, они там, в арабских странах! | http://www.borisba.com
- Борис Бердичевский
- Ветеран интернета
- Сообщения: 29353
- Зарегистрирован(а): 17 ноя 2001, 02:00
- Откуда: Израиль, Беэр-Шева, которой ~3700 лет
- Контактная информация:
Мистер Бин,
я обычно делаю Gui. Это не только графика, но и диалоги, листы, таблицы и всё прочее.
я обычно делаю Gui. Это не только графика, но и диалоги, листы, таблицы и всё прочее.
Меня зовут Барух Борис. Ани маамин бэ эмуна шлема...
Про «палестинцев»: «Они ревность Мою вызывали небогом... Я в них ревность вызову ненародом»
Мы -- здесь, они -- там! Мы здесь, в Израиле, они там, в арабских странах! | http://www.borisba.com
Про «палестинцев»: «Они ревность Мою вызывали небогом... Я в них ревность вызову ненародом»
Мы -- здесь, они -- там! Мы здесь, в Израиле, они там, в арабских странах! | http://www.borisba.com
- Alexandra
- Участник со стажем
- Сообщения: 754
- Зарегистрирован(а): 18 дек 2002, 10:12
- Откуда: Кочую по Израилю
- Контактная информация:
Есть функция в Lotus Notes написанная на Лотус скрипте (похож на VbScript). Функция считывает некую информацию в память, используя внутренний Lotus API. После чего при помощи CopyMemory и CopyMemoryString считывает из памяти части этой информации и в дальнейшем их обрабатывает. Но память не очищается и в результате память используемая процессом лотуса увеличивается и увеличивается. Пока полностью не "сжирает" всю память. После этого начинается swap на диск и т.д. Функция Lotus API память не очищает. Я пробовала использовать функцию Windows API - GlobalFree ( с хэндлером на объект в памяти ), но при этом программа просто зависает и процесс приходится "убивать" через Task Manager. Как же мне все-таки решить эту проблему?
- Alexandra
- Участник со стажем
- Сообщения: 754
- Зарегистрирован(а): 18 дек 2002, 10:12
- Откуда: Кочую по Израилю
- Контактная информация:
Борис Бердичевский писал(а):Это функции Windows, которые в MSDN справочнике входят в топик Windows Client SDK. Например, ShowWindow, SelectObject, BitBlt и т.п.
Так?
Если об этом речь, я в этом неплохо разбираюсь.
Про MSDN я знаю и постоянно к нему обращаюсь.
Ну и причём тут WinAPI? Если аллокация производилась через Lotus API, то и освобождать надо через него-же. Неуж-то функции Lotus возвращают настоящие виндосовские хендлеры? Ни в жисть не поверю. Что значит -
- это аллокация? Значит должно быть и FreeMemory.Функция считывает некую информацию в память, используя внутренний Lotus API.
- Alexandra
- Участник со стажем
- Сообщения: 754
- Зарегистрирован(а): 18 дек 2002, 10:12
- Откуда: Кочую по Израилю
- Контактная информация:
Dodik писал(а):Ну и причём тут WinAPI? Если аллокация производилась через Lotus API, то и освобождать надо через него-же. Неуж-то функции Lotus возвращают настоящие виндосовские хендлеры? Ни в жисть не поверю. Что значит -- это аллокация? Значит должно быть и FreeMemory.Функция считывает некую информацию в память, используя внутренний Lotus API.
Конечно Лотус настоящие хэндлеры не возвращает. Это же скрипты, тут как известно пойнтеров нет.
Насколько я поняла при детальном изучении вопроса, все происходит так:
Лотус считывает информацию в память - то есть тут происходит аллокация памяти.
Потом при помощи CopyMemory и CopyMemoryString части этой памяти копируются и обрабатываются. Эти операции увеличивают количество используемой памяти. И программа пока что никак скопированные части не очищает.
В конце при помощи Lotus API память очищается, но только первый блок, оригинальный, а не переписанные через CopyMemory.
(Кажется я поняла что еще можно попробовать......Но это будет только в воскресенье). А пока что любые идеи принимаются.
Alexandra, Ясненько. Функции CopyMemory и CopyMemoryString принимают по 3 параметра - destination , source и length . С source, как я понял проблем нет. Теперь самый главный вопрос - а что есть у Вас destination? Это должен быть Ваш собственный массив - аллокация до вызова этих функций и освобождение после использования. Пример:
Удачи Вам в этом нелёгком деле.
Dim ptr As Long
Dim hHeap As Long
hHeap = GetProcessHeap()
ptr = HeapAlloc(hHeap, 0, 2)
If ptr <> 0 Then
Dim i As Integer
i = 10
CopyMemoryWrite ptr, i, 2
Dim j As Integer
CopyMemoryRead j, ptr, 2
MsgBox "The adress of ptr is " & CStr(ptr) & _
vbCrLf & "and the value is " & CStr(j)
HeapFree GetProcessHeap(), 0, ptr
End If
Удачи Вам в этом нелёгком деле.
Aleksandra:
Конечно Лотус настоящие хэндлеры не возвращает. Это же скрипты, тут как известно пойнтеров нет.
...
Xэндл к пoйнтерaм не имеют oднoшения. В VB нет пoинтерoв, нo с xэндлaми мoжнo рaбoтaть - см. пример Дoдикa выше.
Чтoбы пoлучить сoвет, Вaм лучше зaпoстить чaсть кoдa - будет гoрaздo яснее. Xaг сaмеax.
Конечно Лотус настоящие хэндлеры не возвращает. Это же скрипты, тут как известно пойнтеров нет.
...
Xэндл к пoйнтерaм не имеют oднoшения. В VB нет пoинтерoв, нo с xэндлaми мoжнo рaбoтaть - см. пример Дoдикa выше.
Чтoбы пoлучить сoвет, Вaм лучше зaпoстить чaсть кoдa - будет гoрaздo яснее. Xaг сaмеax.
- Alexandra
- Участник со стажем
- Сообщения: 754
- Зарегистрирован(а): 18 дек 2002, 10:12
- Откуда: Кочую по Израилю
- Контактная информация:
Спасибо за совет. Я попробовала сама разобраться, но что-то у меня не очень получается.
Вроде бы делаю все как в этой статье объясняют (там внизу где linked list), но все равно в результате получаю 0, а не нужное значение.
Вот код:
А вот оригинальный код, в котором CopyMemory съедает память и который я пытаюсь заменить.
Вроде бы делаю все как в этой статье объясняют (там внизу где linked list), но все равно в результате получаю 0, а не нужное значение.
Вот код:
Код: Выделить всё
Type TIMEDATE
Innard(1) As Long
End Type
Type DBACTIVITY_ENTRY
Time As TIMEDATE
Reads As Integer
Writes As Integer
UserNameOffset As Long
End Type
Declare Function GetProcessHeap Lib "kernel32" () As Long
Declare Function HeapAlloc Lib "kernel32" (Byval hHeap As Long, Byval dwFlags As Long, Byval dwBytes As Long) As Long
Declare Function HeapFree Lib "kernel32" (Byval hHeap As Long, Byval dwFlags As Long, lpMem As Any) As Long
Declare Sub CopyMemoryPut Lib "kernel32" Alias "RtlMoveMemory" (Byval Destination As Long, Source As Any, Byval Length As Long)
Declare Sub CopyMemoryRead Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Byval Source As Long, Byval Length As Long)
...................
puActivity = W32_OSLockObject(Me.retUserInfo)
StructureOffset = puActivity + (Lenb(puActivityEntry) * lEntry)
ptr = HeapAlloc(GetProcessHeap(), 0, Lenb(puActivityEntry))
If ptr <> 0 Then
CopyMemoryPut ptr, StructureOffset, Lenb(puActivityEntry)
CopyMemoryRead puActivityEntry, ptr, Lenb(puActivityEntry)
Msgbox "puActivityEntry.Reads= " &
Cstr(puActivityEntry.Reads) & Chr(10) &_
"puActivityEntry.Writes= " & Cstr(puActivityEntry.Writes) & Chr(10) &_
"puActivityEntry.UserNameOffset= " & Cstr(puActivityEntry.UserNameOffset)
HeapFree GetProcessHeap(), 0, ptr
End If
А вот оригинальный код, в котором CopyMemory съедает память и который я пытаюсь заменить.
Код: Выделить всё
puActivity = W32_OSLockObject(Me.retUserInfo)
StructureOffset = puActivity + (Lenb(puActivityEntry) * lEntry)
Call CopyMemory (puActivityEntry, StructureOffset, Len(puActivityEntry))
- Alexandra
- Участник со стажем
- Сообщения: 754
- Зарегистрирован(а): 18 дек 2002, 10:12
- Откуда: Кочую по Израилю
- Контактная информация:
Dodik писал(а):Alexandra, CopyMemory не может "съедать память" в принципе. Проверте откуда берётся puActivityEntry и куда потом девается.
puActivityEntry определена так:
Код: Выделить всё
Dim puActivityEntry As DBACTIVITY_ENTRY
Это локальная переменная в функции и по идее Лотус сам чистит память от локальных переменных.
Alexandra, Я абсолютно ничего не знаю о Лотус API, но исходя из примеров, найденных в сети, Ваш код мог-бы выглядеть так:
puActivity = W32_OSLockObject(Me.retUserInfo)
StructureOffset = puActivity + (Lenb(puActivityEntry) * lEntry)
Call CopyMemory (puActivityEntry, StructureOffset, Len(puActivityEntry))
Call OSUnlockObject(Me.retUserInfo)
Call W32_OSMemFree(Me.retUserInfo)
- Alexandra
- Участник со стажем
- Сообщения: 754
- Зарегистрирован(а): 18 дек 2002, 10:12
- Откуда: Кочую по Израилю
- Контактная информация:
Dodik писал(а):Alexandra, Я абсолютно ничего не знаю о Лотус API, но исходя из примеров, найденных в сети, Ваш код мог-бы выглядеть так:puActivity = W32_OSLockObject(Me.retUserInfo)
StructureOffset = puActivity + (Lenb(puActivityEntry) * lEntry)
Call CopyMemory (puActivityEntry, StructureOffset, Len(puActivityEntry))
Call OSUnlockObject(Me.retUserInfo)
Call W32_OSMemFree(Me.retUserInfo)
Так он и выглядит. Поверьте мне, я его не сама писала, а просто скопировала именно оттуда где вы его нашли.
И если проверять с дебаггером, то видно что память съедается как раз при использовании CopyMemory. И это вроде бы понятно, потому что нет правильной аллокации памяти используемой этой функцией. Я пыталась заменить вышеприведенный код на :
Код: Выделить всё
puActivity = W32_OSLockObject(Me.retUserInfo)
StructureOffset = puActivity + (Lenb(puActivityEntry) * lEntry)
ptr = HeapAlloc(GetProcessHeap(), 0, Lenb(puActivityEntry))
If ptr <> 0 Then
CopyMemoryPut ptr, StructureOffset, Lenb(puActivityEntry)
CopyMemoryRead puActivityEntry, ptr, Lenb(puActivityEntry)
HeapFree GetProcessHeap(), 0, ptr
End If
Call OSUnlockObject(Me.retUserInfo)
Call W32_OSMemFree(Me.retUserInfo)
но puActivityEntry остается "пустой".
-
- Участник со стажем
- Сообщения: 271
- Зарегистрирован(а): 11 янв 2004, 19:12
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей