dll — C ++: кроссплатформенный способ получения списка общих библиотек

Можно ли программным и межплатформенным способом получить список общих библиотек (* .dll, * .so, * .dylib), связанных с текущим процессом?

Например:

vector<string> getLinkedSharedLibraries() {
// ...
}

vector<string> sharedLibraryList = getLinkedSharedLibraries();
for (list<string>::iterator it = sharedLibraryList.begin(); it != sharedLibraryList.end(); ++it)
cout << *it << endl;

который бы вернулся:

/usr/lib/libz.1.dylib
/usr/lib/libSystem.B.dylib
...

Я думал об использовании команд ОС, таких как ldd в Linux и otool -L на Mac, а затем в конечном итоге использовать [DY]LD_LIBRARY_PATH чтобы найти там абсолютный путь. Но я не нахожу аналогичного способа в Windows.

В качестве альтернативы, существует ли какая-либо существующая библиотека, занимающаяся такими вещами?

1

Решение

Это лишь одна из тех вещей, которые Windows делает лучше … Вам не нужен инструмент, он дает больше информации и его легко найти.

Нет особого смысла в «знании», был ли загружен определенный модуль или нет. Это либо вы загрузили, либо нет.

введите описание изображения здесь

#include <windows.h>
#include <tlhelp32.h>
#include <vector>
#include <iostream>
#include <sstream>

bool GetModules(std::vector<MODULEENTRY32> &modules)
{
void* hSnap = nullptr;
MODULEENTRY32 Mod32 = {0};

if ((hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId())) == INVALID_HANDLE_VALUE)
return false;

Mod32.dwSize = sizeof(MODULEENTRY32);
while (Module32Next(hSnap, &Mod32))
{
modules.push_back(Mod32);
}

CloseHandle(hSnap);
return true;
}std::string ModuleToString(MODULEENTRY32 Mod32)
{
auto to_hex_string = [](std::size_t val, std::ios_base &(*f)(std::ios_base&)) -> std::string
{
std::stringstream oss;
oss << std::hex << std::uppercase << val;
return oss.str();
};

std::string str;
str.append("  =======================================================\r\n");
str.append("  Module Name:             ").append(Mod32.szModule).append("\r\n");
str.append("  =======================================================\r\n\r\n");
str.append("  Module Path:             ").append(Mod32.szExePath).append("\r\n");
str.append("  Load Count (Global):     ").append(std::to_string(static_cast<int>(Mod32.GlblcntUsage != 0xFFFF ? Mod32.GlblcntUsage + 1 : 0)).c_str()).append("\r\n");
str.append("  Load Count (Process):    ").append(std::to_string(static_cast<int>(Mod32.ProccntUsage != 0xFFFF ? Mod32.ProccntUsage + 1 : 0)).c_str()).append("\r\n");
str.append("  Base Address:            0x").append(to_hex_string(reinterpret_cast<std::size_t>(Mod32.modBaseAddr), std::hex).c_str()).append("\r\n");
str.append("  Base Size:               0x").append(to_hex_string(Mod32.modBaseSize, std::hex).c_str()).append("\r\n\r\n");
str.append("  =======================================================\r\n");
return str;
}int main()
{
std::vector<MODULEENTRY32> modules;

if (GetModules(modules))
{
for (auto &&it : modules)
{
std::cout<<ModuleToString(it)<<"\n";
}
}
return 0;
}
3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector