C++ 有没有办法列出链接的程序集名称?

C++ 有没有办法列出链接的程序集名称?,c++,windows,visual-c++,C++,Windows,Visual C++,我想列出链接到my.exe的程序集名称。正如我在c#中看到的,我们有一个API,它完成了我想要的事情,即“Assembly.getReferencedAssemblys” 描述:获取此程序集引用的所有程序集的AssemblyName对象 类似于C++,我们可以得到C++中的库列表。 如果有人能给我一个建议就太好了。给你。打开VS并创建新的Win32 console应用程序复制并粘贴下面的代码。运行它 #include "stdafx.h" #include <windows.h> #

我想列出链接到my.exe的程序集名称。正如我在c#中看到的,我们有一个API,它完成了我想要的事情,即
“Assembly.getReferencedAssemblys”
描述:获取此程序集引用的所有程序集的AssemblyName对象

类似于C++,我们可以得到C++中的库列表。


如果有人能给我一个建议就太好了。

给你。打开VS并创建新的Win32 console应用程序
复制并粘贴下面的代码。运行它

#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 << "\t" << moduleName.data() << std::endl;
        }
    }
    CloseHandle(process);
    return 0;
}

int main()
{
    PrintModules(GetCurrentProcessId());
    return 0;
}
重新运行你的程序。你应该得到这样的东西

进程ID:9348
C:\Path\Visual Studio 2015\Projects\ConsoleApplication5\Debug\ConsoleApplication5.exe
C:\WINDOWS\SYSTEM32\ntdll.dll
C:\WINDOWS\System32\KERNEL32.DLL
C:\WINDOWS\System32\KERNELBASE.dll
C:\Path\Visual Studio 2015\Projects\ConsoleApplication5\Debug\MyLibrary.dll
C:\WINDOWS\SYSTEM32\MSVCP140D.dll
C:\WINDOWS\SYSTEM32\VCRUNTIME140D.dll
C:\WINDOWS\SYSTEM32\ucrtbased.dll


整个解决方案是

,没有专用的C++ API。您可能希望签出实用程序,如依赖项遍历程序或转储文件dumpbin/DEPENDENTS prog.exe导入的名称(缺少外部名称)看起来类似于:
plessecallme
,并且符号上没有附加元数据来指定需要包含的库。链接器只是用它从用于链接的库列表中找到的第一个匹配名称修复(满足)符号。[这太简单了,甚至没有开始处理动态链接]@VTT,但ITI有Win32 API,如果可以使用外部应用程序-转到dependecywalker。如果您希望自己实现它,您可能会对相应的Win32 API感兴趣,比如
EnumProcessModules
。检查这里,你真的是指“链接的程序集名称”,还是指“链接的DLL”?谢谢你的解决方案。根据你的建议,我试过这个。但这是一个正在运行的进程。我正试图做的是,有一个给定的输入是exe路径。示例:“c:xxxxmyexe”,在提供exe名称时,我应该列出我们添加到属性->链接器->输入->附加依赖项中的lib或dll文件。看起来您必须直接解析PE并检索数据。
int main()
{
    auto res = fnMyLibrary();
    PrintModules(GetCurrentProcessId());
    return 0;
}