了解 DLL 中的 C++ 语法 class
Understanding C++ syntax in a DLL class
我试着理解一些代码,可以总结成这样:
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
请多考虑一下
我用得不多,但这看起来像是在声明一个 ptr-to-a-FooClass-member-function,它采用零 args 和 'returns' void。我不确定它是在声明一个静态指针,还是一个指向静态成员函数的指针。
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();
}
P.S.: 我不知道在你的具体情况下这与 dll 和 dll 注入有什么关系,但我可以想象你的 FooClass 动态加载一些 DLL 并提供标准化他们的界面。
我试着理解一些代码,可以总结成这样:
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 请多考虑一下
我用得不多,但这看起来像是在声明一个 ptr-to-a-FooClass-member-function,它采用零 args 和 'returns' void。我不确定它是在声明一个静态指针,还是一个指向静态成员函数的指针。
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();
}
P.S.: 我不知道在你的具体情况下这与 dll 和 dll 注入有什么关系,但我可以想象你的 FooClass 动态加载一些 DLL 并提供标准化他们的界面。