c ++ - Er der en måde at liste ned de sammenkædede forsamlingsnavne?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil liste ned samlingsnavne, der er knyttet til min .exe. Som jeg ser i c #, har vi en API, som gør det, jeg vil have, dvs. "Assembly.GetReferencedAssemblies"
Beskrivelse: Går AssemblyName-objekterne for alle de enheder, der refereres af denne samling.


Ligesom C #, kan vi få listen over biblioteker i c ++.


Det ville være fantastisk, hvis nogen kunne give mig et råd.

Bedste reference


Vær så god. Åbn VS og opret en ny Win32-konsolprogram
Kopier og indsæt under kode. Kør det.


#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <psapi.h>
#include <vector>
#include <iostream>
#include <string>

int PrintModules(DWORD processID)
{
    std::vector<HMODULE> modules;
    HANDLE process;
    DWORD bytesNeeded;

    std::cout << "Process ID:" << processID << std::endl;
    process = OpenProcess(PROCESS\_QUERY\_INFORMATION | PROCESS\_VM\_READ, FALSE, processID);
    if(NULL == process)
        return 1;

    EnumProcessModulesEx(process, nullptr, 0, &bytesNeeded, LIST\_MODULES\_ALL);
    modules.resize(bytesNeeded / sizeof(HMODULE));
    if(EnumProcessModulesEx(process, modules.data(), modules.size() * sizeof(HMODULE), &bytesNeeded, LIST\_MODULES\_ALL))
    {
        for(auto handle : modules)
        {
            std::vector<char> moduleName(1024, 0);
            auto newSize = GetModuleFileNameEx(process, handle, moduleName.data(), moduleName.size());
            moduleName.resize(newSize);
            std::cout << "	" << moduleName.data() << std::endl;
        }
    }
    CloseHandle(process);
    return 0;
}

int main()
{
    PrintModules(GetCurrentProcessId());
    return 0;
}


Du skulle få noget lignende



  Proces ID: 9348

          C: \ Path \ Visual Studio 2015 \ Projekter \ ConsoleApplication5 \ Debug \ ConsoleApplication5.exe

          C: \ WINDOWS \ system32 \ ntdll.dll

          C: \ WINDOWS \ System32 \ KERNEL32.DLL

          C: \ WINDOWS \ System32 \ KERNELBASE.dll

          C: \ WINDOWS \ system32 \ MSVCP140D.dll

          C: \ WINDOWS \ system32 \ VCRUNTIME140D.dll

          C: \ WINDOWS \ system32 \ ucrtbased.dll




Tilføj nu nye Win32 DLL til løsningen. Link din konsol applikation med den. Ring til enhver metode fra nyt bibliotek i din main. Noget sådan her.


int main()
{
    auto res = fnMyLibrary();
    PrintModules(GetCurrentProcessId());
    return 0;
}


Rerun dig program. Du skulle få noget som dette



  Proces ID: 9348

          C: \ Path \ Visual Studio 2015 \ Projekter \ ConsoleApplication5 \ Debug \ ConsoleApplication5.exe

          C: \ WINDOWS \ system32 \ ntdll.dll

          C: \ WINDOWS \ System32 \ KERNEL32.DLL

          C: \ WINDOWS \ System32 \ KERNELBASE.dll

          C: \ Path \ Visual Studio 2015 \ Projekter \ ConsoleApplication5 \ Debug \ MyLibrary.dll

          C: \ WINDOWS \ system32 \ MSVCP140D.dll

          C: \ WINDOWS \ system32 \ VCRUNTIME140D.dll

          C: \ WINDOWS \ system32 \ ucrtbased.dll




Hele løsningen er her [5]