我正在尝试在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。