将char数组发送到DLL调用时遇到错误"不知道如何转换参数"

时间:2016-06-06 17:19:35

标签: python dllimport

我正在尝试在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),并且都返回了相同的错误。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我怀疑您的代码意外运行的原因是您在DLL中调用的C函数的第一个参数需要char *。我猜它的声明看起来像是:

bool ApplyLAS(char *filename, int length);

我在这里猜测返回类型,并且第一个参数实际上是wchar_t *或第二个参数unsigned int也很可能。我还假设您的DLL已经从C代码编译。它可能是用其他语言编译的,比如Fortran。

char *参数,例如我怀疑在C函数中的参数,通常是将字符串传递给C的方式.Python的ctypes模块将Python字符串传递给C函数一个char *,从而可以很容易地将字符串传递给C.