2

void pointers次のように、クラスに戻るいくつかのメソッドを公開する C DLL があります。

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

p.GetApplicationStatus()しかし、明らかにPythonで呼び出すことはできません。を呼び出すことができるように、Pythonでそのクラスをインスタンス化する方法について誰か提案がありますGetApplicationStatus()か?

4

2 に答える 2

3

ドキュメントからの引用:

互換性のない型のインスタンスがある場合があります。C では、ある型を別の型にキャストできます。同じように使える機能をctypes提供します。cast()

したがって、C++ コードに相当する Python は次のとおりです。

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

ただし、多くの場合、これは必要ありません。あなたはこれを行うことができるかもしれません:

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

これは「不正行為」のように見えますが、実際にはそうではありません。POINTER(AppLicense)結果でコンストラクターを呼び出すように指示しているだけです。はPOINTER(AppLicense)ctypes データ型であるため、最初に結果が C であると想定する必要はありませんint

于 2013-10-15T19:14:09.143 に答える