【问题标题】:C# callbacks with return values in Python在 Python 中带有返回值的 C# 回调
【发布时间】:2020-07-28 13:43:45
【问题描述】:

我正在尝试在 DLL 中调用以下函数,该函数(据我所知)将回调作为参数。

C# 定义:

//Error handler
public delegate int FPtrErrorHandler(int ErrorType, int MessageType, int WhomToInform, String ErrorMessage);

//Desired function to call
[ DllImport ( Globals.LibDLLPath, CallingConvention = CallingConvention.Cdecl ) ]
public static extern int OpenLib(String TempDirectory, Bool IfCleanTempDir, FPtrErrorHandler ErrorHandler);

根据this SO entry,我在下面创建了 Python 代码:

import ctypes as c
from ctypes import *

@c.WINFUNCTYPE(c.c_int, c.c_int, c.c_int, c.c_int, c.c_char_p)
def FPtrErrorHandler(ErrorIdentifier, ErrorMessageType, WhomToInform, ErrorMessage):
    print(f'Error ID={ErrorIdentifier}, Type={ErrorMessageType}, WhomToInform={WhomToInform}, msg={ErrorMessage}')
    return 0

lib = windll.LoadLibrary('path_to_dll')

_OpenLib = lib[163]
_OpenLib.restype = c_int
_OpenLib.argtypes = [c_char_p, c_bool, c_void_p]
def OpenLib(TempDirectory,IfCleanTempDir):
    cb1 = FPtrErrorHandler
    return _OpenLib(TempDirectory, IfCleanTempDir, cb1)

n = OpenLib(r:'c:\temp',c_bool(True))

不幸的是,我收到了可怕的消息

ArgumentError: argument 1: <class 'TypeError'>: wrong type

在此先感谢您帮助我。我真的很高兴学习 ctypes 以及如何使用 Python 与令人惊叹的 DLL 进行交互。

【问题讨论】:

  • 我不确定python是如何与外部代码交互的,但是c#FPtrErrorHandler已经定义了4个参数。但是你的 python FPtrErrorHandler 只有 3 个参数。是不是错了?
  • 另外,c.WINFUNCTYPE 的第一个参数 c.c_char_p 似乎需要是返回类型。但是c#方法返回int,因此应该是c.c_int,对吧?
  • 好问题——我必须说我自己也不清楚。我假设FPtrErrorHandler 中的ErrorMessage 是一个输出参数,因此c.c_char_p 作为c.WINFUNCTYPE 的第一个参数。不过,我愿意接受有关更改内容的建议。
  • ErrorMessage 绝对不是 outpur 参数,如果是的话,它会用 out 关键字进行注释。签名显示返回类型是int
  • @Ackdari,根据您的反馈,我更改了当前显示的代码。但是,我仍然遇到同样的错误。

标签: python c# interop ctypes


【解决方案1】:

天哪,我认为这可能很容易。

如果我改变对函数的调用

n = OpenLib(r:'c:\temp',c_bool(True))

n = OpenLib(rb:'c:\temp',c_bool(True))

它似乎正在工作。我只是在字符串前缀中添加了b 修饰符。

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2013-10-07
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多