将 char 数组发送到 DLL 调用“不知道如何转换参数”时出错
Posted
技术标签:
【中文标题】将 char 数组发送到 DLL 调用“不知道如何转换参数”时出错【英文标题】:Getting error when sending a char array to a DLL call "Don't know how to convert parameter" 【发布时间】:2016-06-06 17:19:35 【问题描述】:我正在尝试在 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)
并且都返回相同的错误。
【问题讨论】:
C函数ApplyLAS
的签名是什么?如果第一个参数是char *
,您是否尝试过传递c_char_p
值?
你说的是这个吗? [DllImport("RemoteCtrl.dll", CharSet = CharSet.Unicode)]
internal static extern bool ApplyLAS(Char[] FileName, int nLength);
这是 C# 源代码的顶部。
不,那是 C# 方法的签名。我是在DLL中C函数的签名之后。
Googleing what is a dll signature
只提出了与安全相关的内容。我将如何在 DLL 中查找 C 函数的签名? (注意:我能够得到这个工作,所以这纯粹是为了我自己的知识。)
***.com/questions/386133/…
【参考方案1】:
所以这很奇怪。函数调用需要一个 Char 数组,但是由于某种原因,将字符串海峡放入 python 中的函数调用似乎可以完成工作。我是 python 新手,所以希望有一天这对我有意义。
【讨论】:
【参考方案2】:我怀疑您的代码意外运行的原因是您在 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。
【讨论】:
以上是关于将 char 数组发送到 DLL 调用“不知道如何转换参数”时出错的主要内容,如果未能解决你的问题,请参考以下文章