Windows API?

Компьютеры. программирование, бытовая техника

Модератор: Саша З.

Аватара пользователя
Alexandra
Участник со стажем
Сообщения: 754
Зарегистрирован(а): 18 дек 2002, 10:12
Откуда: Кочую по Израилю
Контактная информация:

Windows API?

Сообщение Alexandra » 20 окт 2005, 15:21

А интересно здесь кто-нибудь в Windows API разбирается? А то очень надо...... :39:

BAD
Участник со стажем
Сообщения: 851
Зарегистрирован(а): 14 янв 2002, 02:00
Откуда: Beer Sheva

Сообщение BAD » 20 окт 2005, 15:50

А по конкретнее...
Я не знаю что вы принимаете от головы :19: , но вам это не помогает :13:

Аватара пользователя
Борис Бердичевский
Ветеран интернета
Сообщения: 29353
Зарегистрирован(а): 17 ноя 2001, 02:00
Откуда: Израиль, Беэр-Шева, которой ~3700 лет
Контактная информация:

Сообщение Борис Бердичевский » 20 окт 2005, 17:10

Это функции Windows, которые в MSDN справочнике входят в топик Windows Client SDK. Например, ShowWindow, SelectObject, BitBlt и т.п.
Так?
Если об этом речь, я в этом неплохо разбираюсь.
Меня зовут Барух Борис. Ани маамин бэ эмуна шлема...
Про «палестинцев»: «Они ревность Мою вызывали небогом... Я в них ревность вызову ненародом»
Мы -- здесь, они -- там! Мы здесь, в Израиле, они там, в арабских странах! | http://www.borisba.com

Аватара пользователя
Dodik
Участник со стажем
Сообщения: 518
Зарегистрирован(а): 08 июн 2004, 17:30
Откуда: Израиль

Сообщение Dodik » 20 окт 2005, 17:49

Сразу видно, что Борис программирует что-то графическое. Мои ассоциации с WinAPI - CreateFile или WaitForSingleObject. :37: :)

Аватара пользователя
Борис Бердичевский
Ветеран интернета
Сообщения: 29353
Зарегистрирован(а): 17 ноя 2001, 02:00
Откуда: Израиль, Беэр-Шева, которой ~3700 лет
Контактная информация:

Сообщение Борис Бердичевский » 20 окт 2005, 18:17

Мистер Бин,
я обычно делаю Gui. Это не только графика, но и диалоги, листы, таблицы и всё прочее. :ic1:
Меня зовут Барух Борис. Ани маамин бэ эмуна шлема...
Про «палестинцев»: «Они ревность Мою вызывали небогом... Я в них ревность вызову ненародом»
Мы -- здесь, они -- там! Мы здесь, в Израиле, они там, в арабских странах! | http://www.borisba.com

Аватара пользователя
Dodik
Участник со стажем
Сообщения: 518
Зарегистрирован(а): 08 июн 2004, 17:30
Откуда: Израиль

Сообщение Dodik » 20 окт 2005, 18:30

Я так и понял, просто несколько обобщил. А я, в основном, больше по "внутренностям" програмным. :ic1:

Аватара пользователя
Alexandra
Участник со стажем
Сообщения: 754
Зарегистрирован(а): 18 дек 2002, 10:12
Откуда: Кочую по Израилю
Контактная информация:

Сообщение Alexandra » 20 окт 2005, 21:43

Есть функция в Lotus Notes написанная на Лотус скрипте (похож на VbScript). Функция считывает некую информацию в память, используя внутренний Lotus API. После чего при помощи CopyMemory и CopyMemoryString считывает из памяти части этой информации и в дальнейшем их обрабатывает. Но память не очищается и в результате память используемая процессом лотуса увеличивается и увеличивается. Пока полностью не "сжирает" всю память. После этого начинается swap на диск и т.д. Функция Lotus API память не очищает. Я пробовала использовать функцию Windows API - GlobalFree ( с хэндлером на объект в памяти ), но при этом программа просто зависает и процесс приходится "убивать" через Task Manager. Как же мне все-таки решить эту проблему? :27:

Аватара пользователя
Alexandra
Участник со стажем
Сообщения: 754
Зарегистрирован(а): 18 дек 2002, 10:12
Откуда: Кочую по Израилю
Контактная информация:

Сообщение Alexandra » 20 окт 2005, 21:44

Борис Бердичевский писал(а):Это функции Windows, которые в MSDN справочнике входят в топик Windows Client SDK. Например, ShowWindow, SelectObject, BitBlt и т.п.
Так?
Если об этом речь, я в этом неплохо разбираюсь.

Про MSDN я знаю и постоянно к нему обращаюсь.

Аватара пользователя
Dodik
Участник со стажем
Сообщения: 518
Зарегистрирован(а): 08 июн 2004, 17:30
Откуда: Израиль

Сообщение Dodik » 20 окт 2005, 23:42

Ну и причём тут WinAPI? :13: Если аллокация производилась через Lotus API, то и освобождать надо через него-же. Неуж-то функции Lotus возвращают настоящие виндосовские хендлеры? Ни в жисть не поверю. Что значит -
Функция считывает некую информацию в память, используя внутренний Lotus API.
- это аллокация? Значит должно быть и FreeMemory.

Аватара пользователя
Alexandra
Участник со стажем
Сообщения: 754
Зарегистрирован(а): 18 дек 2002, 10:12
Откуда: Кочую по Израилю
Контактная информация:

Сообщение Alexandra » 21 окт 2005, 08:23

Dodik писал(а):Ну и причём тут WinAPI? :13: Если аллокация производилась через Lotus API, то и освобождать надо через него-же. Неуж-то функции Lotus возвращают настоящие виндосовские хендлеры? Ни в жисть не поверю. Что значит -
Функция считывает некую информацию в память, используя внутренний Lotus API.
- это аллокация? Значит должно быть и FreeMemory.


Конечно Лотус настоящие хэндлеры не возвращает. Это же скрипты, тут как известно пойнтеров нет.
Насколько я поняла при детальном изучении вопроса, все происходит так:
Лотус считывает информацию в память - то есть тут происходит аллокация памяти.
Потом при помощи CopyMemory и CopyMemoryString части этой памяти копируются и обрабатываются. Эти операции увеличивают количество используемой памяти. И программа пока что никак скопированные части не очищает.
В конце при помощи Lotus API память очищается, но только первый блок, оригинальный, а не переписанные через CopyMemory.

(Кажется я поняла что еще можно попробовать......Но это будет только в воскресенье). А пока что любые идеи принимаются.

Аватара пользователя
Dodik
Участник со стажем
Сообщения: 518
Зарегистрирован(а): 08 июн 2004, 17:30
Откуда: Израиль

Сообщение Dodik » 21 окт 2005, 12:10

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

Удачи Вам в этом нелёгком деле. :)

qwerty
Ветеран мега-форума
Сообщения: 12080
Зарегистрирован(а): 22 июл 2002, 11:34
Откуда: Israel

Сообщение qwerty » 24 окт 2005, 11:28

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.

Аватара пользователя
Alexandra
Участник со стажем
Сообщения: 754
Зарегистрирован(а): 18 дек 2002, 10:12
Откуда: Кочую по Израилю
Контактная информация:

Сообщение Alexandra » 25 окт 2005, 13:45

Спасибо за совет. Я попробовала сама разобраться, но что-то у меня не очень получается.
Вроде бы делаю все как в этой статье объясняют (там внизу где 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))

Аватара пользователя
Dodik
Участник со стажем
Сообщения: 518
Зарегистрирован(а): 08 июн 2004, 17:30
Откуда: Израиль

Сообщение Dodik » 25 окт 2005, 15:13

Alexandra, CopyMemory не может "съедать память" в принципе. Проверте откуда берётся puActivityEntry и куда потом девается.

Аватара пользователя
Alexandra
Участник со стажем
Сообщения: 754
Зарегистрирован(а): 18 дек 2002, 10:12
Откуда: Кочую по Израилю
Контактная информация:

Сообщение Alexandra » 25 окт 2005, 17:41

Dodik писал(а):Alexandra, CopyMemory не может "съедать память" в принципе. Проверте откуда берётся puActivityEntry и куда потом девается.

puActivityEntry определена так:

Код: Выделить всё

Dim puActivityEntry As DBACTIVITY_ENTRY


Это локальная переменная в функции и по идее Лотус сам чистит память от локальных переменных.

Аватара пользователя
Dodik
Участник со стажем
Сообщения: 518
Зарегистрирован(а): 08 июн 2004, 17:30
Откуда: Израиль

Сообщение Dodik » 25 окт 2005, 19:20

Alexandra, А W32_OSUnlockObject и W32_OSMemFree где-нибудь присутсвуют в коде?

Аватара пользователя
Alexandra
Участник со стажем
Сообщения: 754
Зарегистрирован(а): 18 дек 2002, 10:12
Откуда: Кочую по Израилю
Контактная информация:

Сообщение Alexandra » 25 окт 2005, 20:38

Присутствуют
Call OSUnlockObject(Me.retUserInfo)
в конце функции, а
Call W32_OSMemFree(Me.retUserInfo)
в дестракторе.

Аватара пользователя
Dodik
Участник со стажем
Сообщения: 518
Зарегистрирован(а): 08 июн 2004, 17:30
Откуда: Израиль

Сообщение Dodik » 25 окт 2005, 23:51

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
Откуда: Кочую по Израилю
Контактная информация:

Сообщение Alexandra » 26 окт 2005, 08:14

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 остается "пустой".

PeshaShulc
Участник со стажем
Сообщения: 271
Зарегистрирован(а): 11 янв 2004, 19:12

Сообщение PeshaShulc » 26 окт 2005, 11:26

коллеги!
не имею никакого понятия о Лотусе больше 10 лет.
Но может мои пять копеек помогут. Нет ли в вашем script engine GC (garbage collection)
может вам аккурастно прибить ссылки на блок памяти, а потом запустить сборщик мусора.


Вернуться в «Наука и техника»




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

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