В Windows есть версии функций для Unicode и ANSI.Документация указывает, что имя файла - LPCTSTR
.Для версии ANSI, которая определена как LPCSTR
, а для Unicode - LPCWSTR
.
Вот правильный способ вызова функции Windows.Как правило, вы хотите W
версию функции.Определение .argtypes
и .restype
также поможет с проверкой ошибок.Как вы обнаружили, вы можете передать неправильный тип, и он не будет работать.Если определено .argtypes
, будут обнаружены несовместимые типы.
from ctypes import *
from ctypes import wintypes as w
dll = WinDLL('winmm')
dll.PlaySoundW.argtypes = w.LPCWSTR,w.HMODULE,w.DWORD
dll.PlaySoundW.restype = w.BOOL
SND_FILENAME = 0x20000
# Call it with a Unicode string and it works.
dll.PlaySoundW('sound.wav',None,SND_FILENAME)
# Call it with a byte string and get an error since `.argtypes` is defined.
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
Вывод (после воспроизведения звука):
Traceback (most recent call last):
File "C:\test.py", line 15, in <module>
dll.PlaySoundW(b'sound.wav',None,SND_FILENAME)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
Или пропустите всю эту работу и просто используйте модуль winsound:
import winsound
winsound.PlaySound('sound.wav',winsound.SND_FILENAME)