寄信人地址功能引起问题

问题描述

我正在用 C 编写程序,并设置一个要在另一个结构中使用的结构,如下所示:

typedef VOID(WINAPI* OriginalFunc)(PVOID);

struct C_Child
{
    
    VOID GetName( )
    {
        return ((OriginalFunc*)(this))[0x0000](this);
    }
}; 

然后:

struct C_Parent
{
    struct C_Child* Child;
} Parent;

但是,当我这样调用结构时:

Parent.Child->GetName();

要从父级访问子类内部的“ GetName”函数,我总是最终无法编译,并且遇到了许多语法错误。

示例1:

enter image description here

示例2:

enter image description here

在我变得过于刻苦之前,我只想通知大家我主要使用C ++,在使用它之前我已经做过很多次了-我知道语言是不同的,但是我很认真地只是为什么会引起这种问题感到困惑。

有人对我如何纠正此问题有任何想法,或者可能以不同的方式实现相同的结果吗?

感谢所有帮助。

解决方法

我想这就是你想要的:

VOID WINAPI C_Child_GetName(PVOID a) {
  // ...
}

struct C_Child {
   OriginalFunc GetName;
} Child = {
   .GetName = C_Child_GetName,};

struct C_Parent {
   struct C_Child *Child;
} Parent = {
   .Child = &Child,};

这允许一个人执行所请求的

Parent.Child->GetName();

经过测试

typedef void VOID;
typedef void *PVOID;
#define WINAPI
typedef VOID (WINAPI *OriginalFunc)(PVOID);
,

我不确定我是否知道您想做什么:(

您无法在结构内部使用函数,但是可以编写如下代码

#include <stdio.h>
#include <windows.h>

typedef void* (*pFV)(void*);

typedef struct 
{
    pFV         name[4];
}   C_Child;


typedef struct
{
    C_Child*    Child;
}   Parent;

void* GetName(void* v)
{
    printf("GetName()\n");
    return v;
}

int main(void)
{
    Parent   parent;
    C_Child  child;

    child.name[0] = GetName;
    parent.Child = &child;
    (parent.Child->name[0])(NULL);
}

并在子类内部加载函数地址。这是一个常见的构造,例如虚拟功能表,在Windows和其他系统中很常见

此行

        (parent.Child->name[0])(NULL);

按预期调用函数GetName()

它是您想要的吗?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...