ShellExecuteA cannot execute '.exe' in Python (with. ctypes ShellExecuteA)

Question:

I have compiled below code but cannot execute the "PPP.exe".

‘.exe’ file exists same directory with ‘.py’ file.

Why cannot working(or "open") this code?? Please let me know.

import ctypes
ctypes.windll.shell32.ShellExecuteA(0, 'open', "PPP.exe",  None, None, 1)
Asked By: Jung-soo Lee

||

Answers:

Use ShellExecuteW. Your strings are Unicode strings and are passed as wchar_t* to C.

Alternatively, use byte strings with ShellExecuteA, e.g. b'open' and b'PPP.exe'.

If you fully define the arguments and return type (always recommended), then ctypes will type-check for you and return an error if the type is incorrect:

import ctypes as ct
from ctypes import wintypes as w

SW_SHOWNORMAL = 1

shell32 = ct.WinDLL('shell32')
shell32.ShellExecuteA.argtypes = w.HWND, w.LPCSTR, w.LPCSTR, w.LPCSTR, w.LPCSTR, w.INT
shell32.ShellExecuteA.restype = w.HINSTANCE
shell32.ShellExecuteW.argtypes = w.HWND, w.LPCWSTR, w.LPCWSTR, w.LPCWSTR, w.LPCWSTR, w.INT
shell32.ShellExecuteW.restype = w.HINSTANCE

# works
shell32.ShellExecuteA(None, b'open', b'cmd.exe', None, None, SW_SHOWNORMAL)

# works
shell32.ShellExecuteW(None, 'open', 'cmd.exe', None, None, SW_SHOWNORMAL)

# ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
shell32.ShellExecuteA(None, 'open', 'cmd.exe', None, None, SW_SHOWNORMAL)

# ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type
shell32.ShellExecuteW(None, b'open', b'cmd.exe', None, None, SW_SHOWNORMAL)
Answered By: Mark Tolonen
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.