c++ - MSVC C++ 在运行时从字符串中进行名称重整

标签 c++ visual-studio name-mangling

首先我将从我需要​​在运行时进行名称重整的原因开始。

我需要在 dll 和它的包装器之间创建一个桥梁

namespace Wrapper
{
    class  __declspec(dllexport) Token
    {
    public:

        virtual void release() {}
    };
}

class  __declspec(dllexport) Token
{
public:

    virtual void release(){}
};

想法是使用 dumpin 生成持有类 token 的 dll 的所有损坏名称,然后对它们进行分解。

?release@Token@@UAEXXZ --> void Token::release(void)

之后我要转换的是匹配包装器,所以我需要更改函数名称

void Token::release(void) --> void Wrapper::Token::release(void)

然后我需要再次处理它,这样我就可以创建一个 def 文件,将旧函数定向到新函数。

?release@Token@@UAEXXZ = ?release@Token@Wrapper@@UAEXXZ

所有这些过程都需要在运行时进行。

首先也是最简单的解决方案是找到一个破坏字符串的函数,但我找不到任何...

还有其他解决方案吗?

最佳答案

Clang 编译器与 MSVC ABI 兼容,包括名称重整。 底层基础设施是 LLVM 项目的一部分,我找到了 llvm-undname这会破坏 MSVC 名称。或许您可以修改它以将 Wrapper:: 命名空间添加到符号并重新处理。

您可以在 this test code 中找到有关改组名称的灵感。 .

关于c++ - MSVC C++ 在运行时从字符串中进行名称重整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55159432/

相关文章:

c++ - 构造函数初始化错误

C++关于strcmp和读取文件

c++ - 包含 unordered_map 的结构的大小(以字节为单位)

c++ - 关于Visual C++中预编译头文件的问题

visual-studio - Visual Studio 监 window 口图标代表什么?

c++ - 如何强制编译器将 C 名称改写为 C++ 名称

c++ - 访问其他线程堆栈变量如何在 C++ 中工作?

visual-studio - 构建 ASP.NET 网站项目时如何禁用 "Validating Web Site"步骤?

c++ - 为什么 EXTERN_C 宏在其 C 形式中遗漏了 `extern`?

c++ - 从 demangled 名称中获取 mangled 名称