代码之家  ›  专栏  ›  技术社区  ›  Steven Smethurst

在python中,如何设置LP\u c\u ubyte的值

  •  0
  • Steven Smethurst  · 技术社区  · 6 年前

    我正在使用Python ctypes为C DLL创建Python包装器。我在用python更新内存中的值指针时遇到问题。

    在本例中,我有一个具有寄存器回调函数的DLL。调用回调函数,创建无符号char变量,将指向该变量的指针传递给回调函数,然后打印该变量的更新值。

    我所期望的是python函数 callbackUpdateValue 将更新的值 foo ,更新后的值将打印在C DLL中 DoCallBack 作用的价值 0 而不是预期值 99

    我的问题是: 在python中,如何更新 foo公司 在里面 callbackUpdateValue 以便可以在C DLL中打印 DoCallBack文件 作用

    我尽可能地减少了代码

    DLL C++代码

    DLL有两个函数。一个用于注册回调,另一个用于调用回调并打印结果。

    #include <stdio.h>
    typedef void(*FPCallback)(unsigned char * foo);
    FPCallback g_Callback;
    
    extern "C" __declspec( dllexport ) void RegisterCallback(void(*p_Callback)(unsigned char * foo)) {
        g_Callback = p_Callback ; 
    }
    
    extern "C" __declspec( dllexport ) void DoCallBack() {
        unsigned char foo = 0 ; 
        g_Callback( &foo ); 
        printf( "foo=%d\n", foo); 
    }
    

    Python代码

    python代码设置回调函数,然后从DLL调用DoCallBack函数。

    from ctypes import *
    
    def callbackUpdateValue( foo ):
        foo = 99 
    
    customDLL = cdll.LoadLibrary ("customeDLL.dll")
    
    # RegisterCallback
    CustomDLLCallbackFUNC = CFUNCTYPE(None, POINTER( c_ubyte))
    CustomDLLCallback_func = CustomDLLCallbackFUNC( callbackUpdateValue )
    RegisterCallback = customDLL.RegisterCallback
    RegisterCallback.argtypes = [ CustomDLLCallbackFUNC ]
    RegisterCallback( CustomDLLCallback_func ) 
    
    # DoCallBack
    DoCallBack = customDLL.DoCallBack
    
    # Call the callback 
    DoCallBack() 
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Mark Tolonen    6 年前

    定义python回调的正确方法是

    def callbackUpdateValue( foo ):
        foo[0] = 99
    

    哪里 foo[0] 取消引用指针。可在此处找到更多信息: https://docs.python.org/2.5/lib/ctypes-callback-functions.html