gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:46:19 26 4
gpt4 key购买 nike

我正在使用 ctypes 根据描述 DLL 函数参数和返回的描述文件调用 DLL 文件中的函数。这是此 DLL 中的一个函数,称为 InitNetwork。下面是它的描述:

Function:BOOL InitNetwork(char  LocalIP[],char  ServerIP[],int  LocalDeviceID);
Arguments:LocalIP
ServerIP
LocalDeviceID
Return:Success:TRUE;
Faile:FALSE;

我在 Python 中做的是这样的:

from ctypes import *
import os

#Load Dll:
cppdll = CDLL("C:\\VS_projects\\MusicServer_Flask\\NetServerInterface.dll")

#Get the function:
initnetwork = getattr(cppdll, "?InitNetwork@@YAHQAD0H@Z") # The function can be successfully accessed.

#specify arguments' types:
initnetwork.argtypes = [c_char_p,c_char_p,c_int]

在此之后,我尝试:

initnetwork("192.168.1.103", "192.168.1.103", 1111)

获取错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

如果我尝试这样做:

initnetwork(LocalIP = "192.168.1.103", ServerIP = "192.168.1.103", LocalDeviceID = 1111)

我会得到:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: this function takes at least 3 arguments (0 given)

为什么会出现这些错误?我怎样才能成功调用这个函数?任何建议表示赞赏。感谢您的关注!

最佳答案

ctypes 官方文档:[Python 3.5]: ctypes - A foreign function library for 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]: How to compile a 64-bit dll written in C? (@CristiFati's answer)有关如何构建它的详细信息(采用完全相同的步骤,在本例中的命令是:cl/nologo/LD/DWIN64/DWIN32/Tp dll.c/link/OUT:NetServerInterface.dll)。

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

代码.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 - 使用 Python 调用 DLL 函数时出现 ctypes.ArgumentError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50325050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com