Я сейчас обертываю некоторые функции в C ++ dll, чей оригинальный .h файл .cpp недоступен. После изучения учебника по ctypes у меня остались некоторые вопросы. Позвольте мне показать вам пример:
Это из файла описания функций dll, просто сообщая имена функций, эффекты и параметры:
#initialize network:
BOOL InitNetwork(char LocalIP[],char ServerIP[],int LocalDeviceID)
#judging if the server is online after network initialization:
BOOL GetOnlineStatus()
#get song name:
char* GetMusicSongName(int DirIndex,int SongIndex)
#making the device playing music:
int PlayServerMusic(int DirIndex,int MusicIndex,int DeviceCout,PUINT lpDeviceID,int UseListIndex,int UserMusicIndex,UINT TaskCode)
Чтобы обернуть эти функции в Python, я попытаюсь сделать следующее:
import ctypes
import os
#load dll
cppdll = ctypes.WinDLL("C:\\VS_projects\\MusicWebService\\MusicWebService\\NetServerInterface.dll")
#wrap dll functions:
#initialize network:
def InitNetwork(LocalIP, ServerIP, LocalDeviceID):
return cppdll.InitNetwork(LocalIP, ServerIP, LocalDeviceID)
InitNetwork.argtypes = [c_char, c_char, c_int]
#judging if the server is online after network initialization:
def GetOnlineStatus():
return cppdll.GetOnlineStatus()
#get song name:
def GetMusicSongName(DirIndex, SongIndex):
return cppdll.GetMusicSongName(DirIndex, SongIndex)
GetMusicSongName.argtypes = [c_int, c_int]
#making the device playing music:
def PlayServerMusic(DirIndex, MusicIndex, DeviceCout, lpDeviceID, UseListIndex, UserMusicIndex, TaskCode):
return cppdll.PlayServerMusic(DirIndex, MusicIndex, DeviceCout, lpDeviceID, UseListIndex, UserMusicIndex, TaskCode)
Когда я набираю и определяю первую функцию (после импорта пакетов и загрузки библиотеки DLL) в окне взаимодействия Python VS2015, выдается сообщение об ошибке:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'c_char' is not defined
Нужно ли указывать тип входных параметров? Если так, как это сделать? Я не могу распознать тип некоторых параметров в четвертой функции, таких как PUINT lpDeviceID
и UINT TaskCode
. Как их указать?
Кроме того, мне нужно указать тип возвращаемого значения функции? Если да, то как их указать?
Может ли кто-нибудь дать мне правильный код переноса из приведенных выше примеров? Спасибо за внимание!