gpt4 book ai didi

c++ - 从 C DLL 调用重载的 C++ 函数

转载 作者:行者123 更新时间:2023-11-28 06:50:14 25 4
gpt4 key购买 nike

有一个应用程序 (Proteus VSM),用 MSVC C++ 编写,支持基于 DLL 的插件。

g++(mingw32)生成的DLL与MSVC不兼容,__thiscall等方式无济于事。我的大部分代码都是用gcc/mingw写的,有很多基于GAS的汇编部分(不是为了提速)等,所以很难只为 Windows DLL 项目重写它(其他代码用于 Linux)

这是来自 SDK 的原始 header :

class IDSIMPIN1
{ public:
virtual EVENT *setstate (ABSTIME time, RELTIME tlh, RELTIME thl, RELTIME tgq, STATE state) = 0;
virtual EVENT *setstate (ABSTIME time, RELTIME tgq, STATE state) = 0;
virtual VOID setstate (STATE state) = 0;
virtual VOID sethandler (IDSIMMODEL *model, PINHANDLERFN phf) = 0;
virtual DSIMNODE getnode() = 0;
virtual STATE getstate() = 0;
};

如您所见,setstate 函数重载了 3 次。为了访问它,我在 C 中执行了以下操作:

#define __thiscall __attribute__((fastcall))
#define EDX DWORD EDX
typedef struct IDSIMPIN1 IDSIMPIN1;
typedef struct IDSIMPIN1_vtable IDSIMPIN1_vtable;

struct IDSIMPIN1_vtable
{
//EVENT* __thiscall (*setstate)(IDSIMPIN1 *this, EDX, ABSTIME time, RELTIME tgq, STATE state);
VOID __thiscall (*setstate)(IDSIMPIN1 *this, EDX, STATE state);
VOID __thiscall (*sethandler)(IDSIMPIN1 *this, EDX, IDSIMMODEL *model, PINHANDLERFN phf);
DSIMNODE __thiscall (*getnode)(IDSIMPIN1 *this, EDX);
STATE __thiscall (*getstate)(IDSIMPIN1 *this, EDX);
};

struct IDSIMPIN1
{

IDSIMPIN1_vtable *vtable;

};

现在我可以像这样访问这个函数:

IDSIMPIN1 *pin;
...
pin->vtable->setstate(pin, 0, SHI);

这适用于“正常”功能。但是当涉及到 setstate 时,例如,它并不像预期的那样工作。因为我不能在 C 中使用重载函数,所以我立即尝试了其中一个。只有 VOID“版本”按预期工作,其他的行为不正确。

我不确定这是问题的根本原因,我知道这可能是一个奇怪的编程,但也许有人可以帮助我解决可能的问题(除了将代码移植到 MSVC :))。

最佳答案

每个重载在 vtable 中都有一个指针:

struct IDSIMPIN1_vtable
{
EVENT* __thiscall (*setstate1)(IDSIMPIN1 *, ABSTIME, RELTIME, RELTIME, RELTIME, STATE);
EVENT* __thiscall (*setstate2)(IDSIMPIN1 *, ABSTIME, RELTIME, STATE);
VOID __thiscall (*setstate3)(IDSIMPIN1 *, STATE);
VOID __thiscall (*sethandler)(IDSIMPIN1 *this, EDX, IDSIMMODEL *model, PINHANDLERFN phf);
DSIMNODE __thiscall (*getnode)(IDSIMPIN1 *this, EDX);
STATE __thiscall (*getstate)(IDSIMPIN1 *this, EDX);
};

在 C 中,只需给它们不同的名称并调用您想要的名称即可。

关于c++ - 从 C DLL 调用重载的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24086305/

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