Python Ctypes字符串指针
此python代码调用一个dll(在LabVIEW中创建),该dll返回作为参数传递的字符串的大小。 每次我尝试传递不同大小的字符串时,它都会将大小返回为“1”。 我试着用不同的编程语言调用dll,比如C、LabVIEW,效果很好 dll文件的下载链接:Python Ctypes字符串指针,python,pointers,dll,ctypes,Python,Pointers,Dll,Ctypes,此python代码调用一个dll(在LabVIEW中创建),该dll返回作为参数传递的字符串的大小。 每次我尝试传递不同大小的字符串时,它都会将大小返回为“1”。 我试着用不同的编程语言调用dll,比如C、LabVIEW,效果很好 dll文件的下载链接: 有人能帮我解决这个问题吗?提前谢谢。注意事项: 在没有LabVIEW运行时引擎的情况下,.dll不可用(其DllMain在本例中为LVDLLStatus,返回0-触发失败,错误为\u dll\u INIT\u FAILED) 我下载了,然后就
有人能帮我解决这个问题吗?提前谢谢。注意事项:
- 在没有LabVIEW运行时引擎的情况下,.dll不可用(其DllMain在本例中为LVDLLStatus,返回0-触发失败,错误为\u dll\u INIT\u FAILED)
- 我下载了,然后就可以加载了
char*
(8位),而wchar\t*
是16位
测试代码(code.py):
#/usr/bin/env蟒蛇3
导入系统
从ctypes导入CDLL\
c_int,c_char_p,c_wchar_p
单词=[
"",
“a”,
“q z”,
“asd\n”,
"12345",
“qwertyuiop”,
]
如果名称=“\uuuuu main\uuuuuuuu”:
打印(“Python{:s}on{:s}\n.”格式(sys.version,sys.platform))
strlen_dll=CDLL(“strlen”)
strlen_func=strlen_dll.strlen
strlen_func.restype=c_int
用文字表示:
打印(“{:s}:\n len:{:d}”。格式(repr(word),len(word)))
strlen_func.argtypes=[c_char\u p]
打印(“Strlen.Strlen(c_char_p):{:d}”。格式(Strlen_func(word.encode()))
strlen_func.argtypes=[c_wchar\u p]
打印(“Strlen.Strlen(c_wchar_p):{:d}”。格式(Strlen_func(word)))
输出:
说明:
- 使用宽字符时,Win使用wchar_t(或
)。据 Windows使用UTF-16编码表示Unicode字符,其中每个字符编码为16位值无符号短字符
- 在UTF-16上进行谷歌搜索将产生大量结果,以下是其中的几个:
- 也检查
- 让我们以字符A(十六进制0x41)为例。因为它是一个普通的ASCII码,所以它将被表示为一个wchar\t,如:
- 0x00-此字节不是必需的,并且没有代码页,您可以将其视为填充字节
- 0x41-值本身
- 如图所示,wchar\u t的第一个字节是0,它与空字符终止符()相同。因此,在不知道的情况下,您正在传递一个包含此类字符的字符串,当函数遇到第一个字符时,它将停止
- 但是为什么它返回1(而不是0,因为字符串中的第一个宽字符以0x00开头)?这是因为(事实上,运行在它们上面的英特尔CPU和操作系统都是小端的)。您还应该检查(endianness相关部分)
import ctypes
from ctypes import windll, cdll,\
c_wchar, c_size_t, c_ulonglong, c_wchar_p, c_void_p,\
sizeof,\
WinError
try:
dllhandle = ctypes.CDLL("Strlen.dll")
print("Library Loaded")
except Exception as e:
print("Can't open DLL:",e)
dllhandle.Strlen.argtypes = [ctypes.c_wchar_p]
dllhandle.Strlen.restype = ctypes.c_int32
data = "Hello"
data_ptr = ctypes.c_wchar_p(data)
print("Data Pointer:",data_ptr)
length = dllhandle.Strlen(data_ptr)
print("Data:",data)
print("String Length:",length)
(py35x64_test) E:\Work\Dev\StackOverflow\q049030000>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
Python 3.5.4 (v3.5.4:3f56838, Aug 8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32
'':
len: 0
Strlen.Strlen(c_char_p): 0
Strlen.Strlen(c_wchar_p): 0
'a':
len: 1
Strlen.Strlen(c_char_p): 1
Strlen.Strlen(c_wchar_p): 1
'q z':
len: 3
Strlen.Strlen(c_char_p): 3
Strlen.Strlen(c_wchar_p): 1
'asd\n':
len: 4
Strlen.Strlen(c_char_p): 4
Strlen.Strlen(c_wchar_p): 1
'12345':
len: 5
Strlen.Strlen(c_char_p): 5
Strlen.Strlen(c_wchar_p): 1
'qwertyuiop':
len: 10
Strlen.Strlen(c_char_p): 10
Strlen.Strlen(c_wchar_p): 1