gpt4 book ai didi

c++ - 通过 DLL 传递指向成员函数的指针

转载 作者:行者123 更新时间:2023-11-28 07:34:27 24 4
gpt4 key购买 nike

我有一个 DLL,它被一个我没有创建的程序作为插件加载,它的目的是替换指向程序内部数组中成员函数的指针,以便为加载它的现有程序提供额外的功能。

程序(加载插件 dll)的源代码如下所示

//Core object that all objects inherit
class MObject
{
public:
//variables

//functions
}

enum ECmdIndex
{
CMD_RUN = 0x0,
//ect
CMD_MAX = 0x500
}
//Global command list of command functions
typedef void (MObject::*CommandFunc)(SContext&, void*)
CommandFunc GCommands[CMD_MAX];

//Example command function
void MObject::funcCmdRun(SContext& context, void* result)
{
//do stuff
}
GCommands[CMD_RUN] = &MObject::funcCmdRun;

//This is used to execute command functions
void MObject::ProcessCommand( SContext& context, void* result )
{
//ect

//Execute the command's function on this MObject
//Here is where my function should replace the default one
(this->*GCommands[context.cmdInd])(context, result);

//ect
}

我的 DLL 相当简单。主要是将程序的GCommands数组中的一个命令函数替换为DLL中的一个命令函数。

//MObject structure is replicated exactly in the DLL
//This is neccesary because my plugin is going beyond the provided API
//And so this is becoming a bit "hacky"
class MObject
{
public:
//variables

//functions
}

typedef void (MObject::*CommandFunc)(SContext&, void*)

void MObject::MyCommandFunc(SContext& context, void* result)
{
//do stuff
}

void onLoad()
{
//Get a pointer to GCommands array
CommandFunc** pGCommands = GetGCommandOffset();

//Replaced the desired command function with the new one
pGCommand[0x1B] = &MObject::MyCommandFunc;
}

一个简短的摘要:宿主程序调用一个成员函数指针。我的 DLL 应该使指针指向它自己的函数,并在主机应用程序调用该指针时执行使该函数可调用的必要操作。

问题是从未输入我的新命令功能,并且在程序中执行时该命令不再执行任何操作。我至少会期待崩溃。对于代码固有的 hacky 外观,我深表歉意,但肯定有正确的方法来实现这一点?

最佳答案

这里的根本原因似乎是 ODR 违规。您的主机应用程序定义了一个 MObject,其中包含 MyCommandFunc 的一个实现(或根本没有实现),而您的 DLL 则使用另一个实现来定义它。您在这里尝试做的事情(通过函数指针数组在每个成员函数的基础上覆盖类功能)实在是太奇怪了,而且永远无法以可移植的方式工作。

如果您有一堆操作 MObject 的命令,您可以将它们声明为非成员(或静态成员)函数,这些函数采用 MObject 并具有这些函数的数组。 (您可以改为将它们公开为 MObjectCommand 虚拟接口(interface)的实现,但看起来您不需要任何状态,因此这可能是不必要的。)

关于c++ - 通过 DLL 传递指向成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17024011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com