Есть ли системная DLL, которая не остается загруженной в памяти после использования?

Как получить пример использования динамических библиотек, который будет нагляден и не будет приводить к зафиксированному состоянию библиотеки в памяти? Может ли кто-нибудь порекомендовать системную библиотеку, которая соответствует этим критериям, или мне следует написать свою собственную DLL?
  • 23 октября 2023 г. 16:08
Ответы на вопрос 2
Существует несколько способов загрузки и выгрузки динамических библиотек в память.

Один из способов - использовать функцию `LoadLibrary` для загрузки библиотеки и `FreeLibrary` для ее выгрузки. При использовании этого метода библиотека будет оставаться загруженной в памяти до тех пор, пока нет счетчика ссылок на нее. Счетчик ссылок увеличивается при каждом вызове функции `LoadLibrary` и уменьшается при каждом вызове функции `FreeLibrary`. Пока счетчик ссылок на библиотеку не станет равным нулю, она останется загруженной в памяти.

Если вам нужно использовать функции из DLL только на короткое время и не хранить ее в памяти после использования, вы можете использовать функцию `LoadLibraryEx` с флагом `LOAD_LIBRARY_AS_DATAFILE`. Это позволит загрузить DLL в адресное пространство вашего процесса, но не выполнить инициализацию кода библиотеки. Затем вы можете использовать функцию `GetProcAddress` для получения адреса функций из DLL и вызывать их. После завершения использования DLL вы можете вызвать функцию `FreeLibrary` для выгрузки DLL из памяти.

Пример кода на языке C++:

```cpp
#include <windows.h>
#include <iostream>

int main()
{
    HMODULE hLib = LoadLibraryEx(L"path\\to\\your\\library.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
    if (hLib)
    {
        // Получение адреса функции
        FARPROC pFunc = GetProcAddress(hLib, "YourFunction");
        if (pFunc)
        {
            // Вызов функции из DLL
            ((void(*)(void))pFunc)(); // Пример вызова функции без аргументов и возвращаемого значения
            // ...другие вызовы функций из DLL...
        }

        // Выгрузка DLL из памяти
        FreeLibrary(hLib);
    }   

    return 0;
}
```

Обратите внимание, что данный код не содержит обработку ошибок и предполагает, что ваша DLL содержит функцию с именем "YourFunction". Вы должны заменить "path\\to\\your\\library.dll" на путь к вашей собственной DLL.
Возможно, здесь не применяются никакие сложные методы для остания в памяти. Программа просто использует уже имеющуюся библиотеку. Функция LoadLibrary только увеличивает счетчик использования, а функция FreeLibrary уменьшает его, без загрузки или выгрузки чего-либо. Вы можете попробовать найти DLL-файл, который не отображается в начальном списке.
Похожие вопросы