gpt4 book ai didi

python - 使用 Ctypes 从 Void 指针创建 C 类实例

转载 作者:行者123 更新时间:2023-11-28 22:53:31 25 4
gpt4 key购买 nike

我有一个 C DLL,它公开了一些方法,这些方法将 void pointers 返回给类,如下所示:

void *GetLicense() {
static AppLicenseImpl ipds_;
return (void *) &ipds_;
}

在 C++ 中,加载 DLL 后,我会这样做以使用它:

typedef void *(* FPGetLicense)();
GetLicense_ = (FPGetLicense)GetAddress("GetLicense");
license_ = (AppLicense *) GetLicense_();
license_->GetApplicationStatus(); // Load data so that other calls don't fail

我不知道如何在 Python 中进行并行处理。这让我明白了:

d = ctypes.cdll.LoadLibrary('license.dll')
d.GetLicense.restype = ctypes.c_void_p
p = d.GetLicense() # returns ptr loc, something like 8791433660848L

但我显然不能在 Python 中调用 p.GetApplicationStatus()。有没有人建议我如何在 Python 中以其余方式实例化该类,以便我可以调用 GetApplicationStatus()

最佳答案

引自the docs :

Sometimes you have instances of incompatible types. In C, you can cast one type into another type. ctypes provides a cast() function which can be used in the same way.

因此,C++ 代码的 Python 等价物是:

license = cast(d.GetLicense(), ctypes.POINTER(AppLicense))
license.GetApplicationStatus()

然而,通常这不是必需的;你也许可以这样做:

d.GetLicense.restype = ctypes.POINTER(AppLicense)

这看起来像“作弊”,但事实并非如此。您只是告诉它用结果调用 POINTER(AppLicense) 构造函数。由于 POINTER(AppLicense) 是 ctypes 数据类型,因此它不必首先假设结果是 C int

关于python - 使用 Ctypes 从 Void 指针创建 C 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19389124/

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