powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Эксперементы с DLL (тем кто интересовался)
6 сообщений из 6, страница 1 из 1
Эксперементы с DLL (тем кто интересовался)
    #34222754
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Недавно были вопросы типа "Не вредно ли часто вызывать DECLARE DLL?"
На днях разбирался с ньюансами использования WinAPI. Точнее с работой DLL в win. Итого следующее:
на уровне WinAPI вызов функции DLL из фокса происходит так:
LoadLibrary() - загрузка DLL в адресное пространство процесса
Func = GetProcAddress("имя функции") - получение точки входа в функцию
Func() - вызов функции
FreeLibrary() - выгрузка DLL из адресного пространства процесса (по выходу или CLEAR DLL)

Результаты экспериментов VFP6SP5:
1. DECLARE DLL - фокс сохраняет описание функции где-то у себя в памяти
2. при первом вызове функции происходит загрузка DLL (LoadLibrary), если DLL уже загружена, то повторно ее загрузить не дает Windows (LoadLibrary возвращает указатель на уже загруженный экземпляр)
3. CLEAR DLL - очищает список описаний, выгружает загруженные пользовательские DLL

Выводы:
1. DECLARE DLL для одной функции можно делать сколько угодно раз, маловероятно что разработчики фокса сделали тупое добавление без проверки что описание этой функции уже есть. Код
Код: plaintext
1.
2.
do while .t.
	DECLARE integer fnTestDll in TestDLL.DLL
enddo
не приводит к увеличению объема памяти VFP
2. Реальная проверка существования DLL и нужной функции в ней происходит при первой попытке вызова этой функции
3. Как правило используются функции ядра Win (KERNEL32.DLL) их даже убирать не надо, т.к. KERNEL32.DLL используется самим фоксом и все равно остается загруженной после CLEAR DLL
4. Реально CLEAR DLL для одной функции невозможно - она может уйти из списка описаний, а DLL подцепляется целиком, а не по одной функции.
...
Рейтинг: 0 / 0
Эксперементы с DLL (тем кто интересовался)
    #34222787
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У любой DLL'ки которая загрущается по LoadLibrary есть счечик usage который показывает сколько раз она была загружена процессами, после обнуления этого счетчика она физичиски выгружается из памяти
...
Рейтинг: 0 / 0
Эксперементы с DLL (тем кто интересовался)
    #34222800
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос это поднимал и я в том числе, но уже давно (с подсказки ВладимирМ) выяснил, что DECLARE DLL одной и той же функции можно делать сколько угодно раз (во всяком случае, для VFP 9.0). Для проверки справедливости этого факта достаточно использовать функцию ADLLS.

С уважением, Алексей
...
Рейтинг: 0 / 0
Эксперементы с DLL (тем кто интересовался)
    #34222970
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pivaУ любой DLL'ки которая загрущается по LoadLibrary есть счечик usage который показывает сколько раз она была загружена процессами, после обнуления этого счетчика она физичиски выгружается из памяти
Это касается загрузки DLL в win (как операционку) Код DLL в память загружается единожды. Счетчик считает количество процессов спроецировавших код DLL в свое адресное пространство.
В адресное пространство процесса DLL проецируется единожды по вызову LoadLibrary(), повторные вызовы возвращают указатель на уже спроецированный модуль.
После любого количества вызовов LoadLibrary(), один вызов FreeLibrary() убирает проекцию из адресного пространства процесса.
...
Рейтинг: 0 / 0
Эксперементы с DLL (тем кто интересовался)
    #34226160
oleg_km
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DECLARE integer fnTestDll in TestDLL.DLL

Единственно, я обнаружил (в VFP 6 SP5), что вызов DECLARE занимает очень много времени, больше чем сам вызов функции. Попробуйте в профилере:

for i = 1 to 10000
DECLARE integer fnTestDll in TestDLL.DLL
fnTestDll()
endfor

и

DECLARE integer fnTestDll in TestDLL.DLL
for i = 1 to 10000
fnTestDll()
endfor

У меня была ощутимая разница (в разы)
может в новых версиях изменилось
...
Рейтинг: 0 / 0
Эксперементы с DLL (тем кто интересовался)
    #34226662
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_kmDECLARE integer fnTestDll in TestDLL.DLL

Единственно, я обнаружил (в VFP 6 SP5), что вызов DECLARE занимает очень много времени, больше чем сам вызов функции. Попробуйте в профилере:

for i = 1 to 10000
DECLARE integer fnTestDll in TestDLL.DLL
fnTestDll()
endfor

и

DECLARE integer fnTestDll in TestDLL.DLL
for i = 1 to 10000
fnTestDll()
endfor

У меня была ощутимая разница (в разы)
может в новых версиях изменилось
Действительно медленно. Но в VFP9.1 еще медленней (в 3 раза). Похоже MS решила хоронить фокс другим способом: надобавлять столько чтобы работал фокс со скоростью .NET и жрал столько же.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Эксперементы с DLL (тем кто интересовался)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]