According to [Python 3.Docs]: Built-in Types - Text Sequence Type - str (emphasis is mine):
Textual data in Python is handled with str objects, or strings. Strings are immutable sequences of Unicode code points.
On Win they are UTF16 encoded.
So, the correspondence between CTypes and Python (also visible by checking the differences between):
╔═══════════════╦══════════════╦══════════════╗
║ CTypes ║ Python 3 ║ Python 2 ║
╠═══════════════╬══════════════╬══════════════╣
║ c_char_p ║ bytes ║ str ║
║ c_wchar_p ║ str ║ unicode ║
╚═══════════════╩══════════════╩══════════════╝
Example:
Back to your situaton:
>>> import ctypes as ct
>>>
>>> some_string = "disco duck"
>>>
>>> enc_utf16 = some_string.encode("utf16")
>>> enc_utf16
b'\xff\xfed\x00i\x00s\x00c\x00o\x00 \x00d\x00u\x00c\x00k\x00'
>>>
>>> type(some_string), type(enc_utf16)
(<class 'str'>, <class 'bytes'>)
>>>
>>> ct.c_wchar_p(some_string) # This is the right way
c_wchar_p(2508534214928)
>>>
>>> ct.c_wchar_p(enc_utf16)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unicode string or integer address expected instead of bytes instance
As a side note, TCHAR varies (it's a typedef) on _UNICODE (not) being defined. Check [MS.Docs]: Generic-Text Mappings in tchar.h for more details. So, depending on the C code compilation flags, the Python code might also need adjustments.
You could also check [SO]: Python 3 Concat Single Byte with String Bytes (@CristiFati's answer).