Python Ctypes字符串指针

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) 我下载了,然后就

此python代码调用一个dll(在LabVIEW中创建),该dll返回作为参数传递的字符串的大小。 每次我尝试传递不同大小的字符串时,它都会将大小返回为“1”。 我试着用不同的编程语言调用dll,比如C、LabVIEW,效果很好

dll文件的下载链接:


有人能帮我解决这个问题吗?提前谢谢。

注意事项

  • 在没有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相关部分)

设置偏移自由执行设置的作用是什么?还有函数头吗?我知道它为什么会这样,但我想在公开之前测试一下。虽然我有点不愿意在我的电脑上执行未知代码。你如何从其他语言调用func?
    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