【问题标题】: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 应该澄清你的疑问:-)