2015-02-19 3 views
1

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

Например:

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.

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

+0

Там нет языка под названием "C/C++", и ваш код C++. Пожалуйста, исправьте свой заголовок. –

+0

Спасибо. Готово. – FabienRohrer

+0

Решения на окнах довольно разочаровывают: http://stackoverflow.com/questions/1993673/what-is-the-equivalent-of-linuxs-ldd-on-windows – FabienRohrer

ответ

3

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

Существует не так много использования, в " зная, был ли загружен конкретный модуль или нет. Это либо вы загрузили его, либо нет.

enter image description here

#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; 
} 
+0

Спасибо, это очень полезно. Теперь я ищу эквивалентный код для Mac и Linux. – FabienRohrer

 Смежные вопросы

  • Нет связанных вопросов^_^