【问题标题】:Understanding C++ syntax in a DLL class了解 DLL 类中的 C++ 语法
【发布时间】:2026-01-25 07:25:01
【问题描述】:

我试着理解一些代码,可以总结成这样的:

class FooClass {
    public:
        void Foo();
        static void (FooClass::*Foo_Original)();
};

void (FooClass::* FooClass::Foo_Original)() = 0;
void FooClass::Foo() {
    (this->*Foo_Original)();
}

这是 Visual Studio 中更复杂的 dll 解决方案的一部分。从调试器中,我发现方法 Foo() 是从其他一些 dll 调用的。有人可以解释这种语法的含义吗?它应该做什么?

这与这个不重复。 C++: Pointer to class data member 请多考虑

【问题讨论】:

    标签: c++ dll function-pointers dll-injection


    【解决方案1】:

    FooClass 公开了一个成员函数Foo() 和一个指向成员函数的静态指针。该指针称为Foo_Original

    因为它是一个静态指针,它必须被初始化,这里用 0(又名 nullptr)。

    函数Foo() 只是调用Foo_Original 指向的函数。当然,这会像 U.B 一样做其他事情,只有当指针在某个地方初始化为成员函数时。

    例子:

    class FooClass {
    public:
        void Foo();
        static void (FooClass::*Foo_Original)();
        // additional member functions for the demo:
        void Bar()  { std::cout << "Bar was called" << std::endl; }
        void Goo()  { std::cout << "Goo was called" << std::endl; }
    };
    int main()
    {
        FooClass f; 
        // f.Foo(); ==> U.B, as Foo_Original is still 0 
        f.Foo_Original = &FooClass::Bar;
        f.Foo(); 
        f.Foo_Original = &FooClass::Goo;
        f.Foo();
    }
    

    PS:我不知道这与您的特定情况下的 dll 和 dll 注入有何关系,但我可以想象您的 FooClass 动态加载一些 DLL 并为它们提供标准化接口。

    【讨论】:

      【解决方案2】:

      我不怎么使用它们,但这看起来像是在声明一个 ptr-to-a-FooClass-member-function,它接受零参数并“返回”无效。我不确定它是在声明一个静态指针,还是一个指向静态成员函数的指针)。

      【讨论】:

      • 您的犹豫是可以理解的(仅此一项就可以证明对原始问题的赞成票)!它是指向非静态成员函数的静态指针。静态函数不会有FooClass::*This FAQ 应该澄清你的疑问:-)