Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解DLL类中的C++语法_C++_Dll_Function Pointers_Dll Injection - Fatal编程技术网

理解DLL类中的C++语法

理解DLL类中的C++语法,c++,dll,function-pointers,dll-injection,C++,Dll,Function Pointers,Dll Injection,我试图理解一些代码,这些代码可以概括为: class FooClass { public: void Foo(); static void (FooClass::*Foo_Original)(); }; void (FooClass::* FooClass::Foo_Original)() = 0; void FooClass::Foo() { (this->*Foo_Original)(); } 这是VisualStudio中更复杂的d

我试图理解一些代码,这些代码可以概括为:

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

void (FooClass::* FooClass::Foo_Original)() = 0;
void FooClass::Foo() {
    (this->*Foo_Original)();
}
这是VisualStudio中更复杂的dll解决方案的一部分。从调试器中,我发现方法Foo是从其他dll调用的。有人能解释一下这个语法是什么意思吗?它应该做什么

这和这个不一样。
请仔细考虑一下

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

Foo类公开一个成员函数Foo和一个指向成员函数的静态指针。指针称为Foo_Original

由于它是一个静态指针,因此必须对其进行初始化,这里使用0 aka 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();
}

附言:我不知道这与您的特定案例中的dll和dll注入有什么关系,但我可以想象您的FooClass动态加载了一些dll,并为它们提供了一个标准化的接口。

您的犹豫是可以理解的,仅此一点就足以证明对原始问题的投票是正确的!它是指向非静态成员函数的静态指针。对于静态函数,将没有FooClass::*。应该澄清您的疑问:-