您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用Python调用DLL函数时出现ctypes.ArgumentError

使用Python调用DLL函数时出现ctypes.ArgumentError

ctypes 官方文档:[Python 3.5]:ctypes- Python的外部函数库

创建了一个虚拟 .dll 来模仿您的行为。

dll.c

#include <stdio.h>
#include <Windows.h>


__declspec(dllexport) BOOL InitNetwork(char LocalIP[], char ServerIP[], int Localdeviceid) {
    printf("From C:\n\tLocalIP: [%s]\n\tServerIP: [%s]\n\tLocaldeviceid: %d\n", LocalIP, ServerIP, Localdeviceid);
    return TRUE;
}

检查SO:如何编译用C编写的64位dll?(@CristiFati的答案)以获取有关如何构建它的详细信息(采取了完全相同的步骤,在这种情况下,命令是:)cl /nologo /LD /DWIN64 /DWIN32 /Tp dll.c /link /OUT:NetServerInterface.dll

(主要)问题在于,在 python3char*不再映射到 string ,而是映射到 bytes 对象。

code.py

import sys
import ctypes
from ctypes import wintypes


FILE_NAME = "NetServerInterface.dll"
FUNC_NAME = "?InitNetwork@@YAHQEAD0H@Z"  # Name different than yours: if func was declared as `extern "C"`, the "normal" name would be required


def main():
    net_server_interface_dll = ctypes.CDLL(FILE_NAME)
    init_network = getattr(net_server_interface_dll, FUNC_NAME)

    init_network.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int]
    init_network.restype = wintypes.BOOL

    init_network(b"192.168.1.103", b"192.168.1.103", 1111)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

(py35x64_test)

e:\Work\Dev\StackOverflow\q050325050>”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

From C:
        LocalIP: [192.168.1.103]
        ServerIP: [192.168.1.103]
        Localdeviceid: 1111
python 2022/1/1 18:25:40 有184人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶