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