我有一个C ++ DLL。我想创建一个 Flask 服务器来调用此DLL中的函数。所以我在ctypes
内使用Flask
。这是views.py
中的代码:
from flask import render_template
from MusicServer_Flask import app
from ctypes import *
import os
#load Dll:
cppdll = CDLL("C:\\VS_projects\\MusicServer_Flask\\NetServerInterface.dll")
#wrapping DLL function:
initnetwork = getattr(cppdll, "?InitNetwork@@YAHQAD0H@Z") #The function can be accessed successfully
initnetwork.argtypes = [c_char_p,c_char_p,c_int]
initnetwork.restype = wintypes.BOOL
#define route:
@app.route('/InitNetwork/<LocalIP>/<ServerIP>/<LocalDeviceID>')
def InitNetwork(LocalIP, ServerIP, LocalDeviceID):
return initnetwork(LocalIP, ServerIP, LocalDeviceID)
在this question的帮助下,我可以使用以下方法在Python interactice窗口中成功调用此函数:InitNetwork(b"192.168.1.101",b"192.168.1.101",555)
:
但是,当我运行Flask项目并输入此路线时:http://192.168.1.102:8081/InitNetwork/b"192.168.1.102"/b"22192.168.1.102"/555
它给出了如下错误:
似乎b"192.168.1.102"
在请求的网址中变为b%22192.168.1.102%22
。为什么会这样?如何使用正确的URL来调用此函数?
感谢您的关注。
修改
感谢@Paula Thomas的回答,我想我向答案迈了一步。我改变了下面的代码,将第一个和第二个输入参数转换成字节:
@app.route('/InitNetwork/<LocalIP>/<ServerIP>/<LocalDeviceID>')
def InitNetwork(LocalIP, ServerIP, LocalDeviceID):
b_LocalIP = bytes(LocalIP,'utf-8')
b_ServerIP = bytes(ServerIP,'utf-8')
return initnetwork(b_LocalIP, b_ServerIP, LocalDeviceID)
但是,http://172.16.4.218:8081/InitNetwork/172.16.4.218/172.16.4.218/555
和http://172.16.4.218:8081/InitNetwork/"172.16.4.218"/"172.16.4.218"/555
都不起作用。仍然给我wrong type
错误。有人请帮忙吗?
答案 0 :(得分:0)
我认为你会发现Flask正在传递你的字符串(类型str),而你的C或C ++函数期望第一个字节(因此在两个参数之前的&#39; b&#39;)两个参数和第三个int。转换它们是你的责任。