将字符数组发送到 DLL 调用"Don't know how to convert parameter"时出错



我正在尝试在Python中重新创建一个DLL函数调用。该代码使用 DLL 文件为各种材料设置设置激光参数。下面是原始 C# 代码:

public bool ApplyLasFile(string strLasFile)
{
    if (!File.Exists(strLasFile))
    {
        //MessageBox.Show("File not found", "Error", MessageBoxButtons.OK);
        return false;
    }
    Char[] arr = strLasFile.ToCharArray();
    ApplyLAS(arr, strLasFile.Length);
    return true;
}

这是我的python代码:

def setLaserSettings(input):
    #laserSettings(power (0-1000), speed (0-1000), height (0-4000), ppi (0-1000))
    input=input.upper()
    if(input=="ABS"):
        settings=laserSettings(825, 1000)
    elif(input=="STAINLESS"):
        settings=laserSettings(1000, 84)
    elif(input=="TITANIUM"):
        settings=laserSettings(1000, 84)
    else:
        return False
    charList=[]
    for x in range (0, len(settings)): #convert string into c_char[]
        charList.append(c_char(settings[x]))
    #print charList
    print ULSLib.ApplyLAS(charList, len(settings))

DLL 调用ULSLib.ApplyLAS(charList, len(settings))返回错误ArgumentError: argument 1: <type 'exceptions.TypeError'>: Don't know how to convert parameter 1 。我一开始只是使用 list(settings) 来代替ToCharArray(),当这不起作用时,我根据 Python ctypes 手册页构建了一个c_char数组。但是,我仍然收到该错误。有人看到我错过了什么吗?感谢您提供的任何帮助。

编辑:我也尝试了list(string)list(charList),都返回相同的错误。

所以这很奇怪。函数调用需要一个 Char 数组,但出于某种原因,将字符串 strait 放入 python 中的函数调用中似乎完成了工作。我是 python 的新手,所以希望有一天这对我来说是有意义的。

我怀疑您的代码意外工作的原因是您在 DLL 中调用的 C 函数对其第一个参数进行了char *。 我猜它的声明看起来像这样:

bool ApplyLAS(char *filename, int length);

我在这里猜测返回类型,也很有可能第一个参数实际上是wchar_t *或第二个参数是unsigned int. 我还假设您的 DLL 是从 C 代码编译的。 它可能是从另一种语言(如Fortran)编译而来的。

char *参数(例如我怀疑 C 函数中的参数)通常是将字符串传递给 C 的方式。 Python 的 ctypes 模块会将一个 Python 字符串作为char *传递给 C 函数,从而很容易将字符串传递给 C。

相关内容

  • 没有找到相关文章

最新更新