Взаимодействие с API среды выполнения Windows с помощью ctypes (возможно, comtypes)Python

Программы на Python
Anonymous
Взаимодействие с API среды выполнения Windows с помощью ctypes (возможно, comtypes)

Сообщение Anonymous »

Я хотел бы взаимодействовать с API среды выполнения Windows и создать простую библиотеку Python для взаимодействия с API Win RT, выполняющего распознавание текста с помощью OcrEngine. Использование только ctypes и comtypes.
Я пробовал реализовать аналогичные функции, которые используются в функции в строке 1816 в AutoHotkey.
Также я нашел, как получить доступ com из Python здесь
Это то, что у меня есть до сих пор, но я продолжаю получать «запись о нарушении прав доступа» в строке 34 в функции ComCall
Мой код:
import ctypes
import ctypes.wintypes

ole32 = ctypes.windll.ole32
combase = ctypes.windll.combase

class GUID(ctypes.Structure):
_fields_ = [("Data1", ctypes.c_ulong),
("Data2", ctypes.c_ushort),
("Data3", ctypes.c_ushort),
("Data4", ctypes.c_ubyte * 8)]

def __str__(self):
return f"{{{self.Data1:08X}-{self.Data2:04X}-{self.Data3:04X}-" + \
f"{''.join(f'{x:02X}' for x in self.Data4[:2])}-" + \
f"{''.join(f'{x:02X}' for x in self.Data4[2:])}}}"

def create_hstring(value):
hstring = ctypes.wintypes.HANDLE()
combase.WindowsCreateString(value, len(value), ctypes.byref(hstring))
return hstring

def delete_hstring(ptr):
combase.WindowsDeleteString(ptr)

def ComCall(index, cls, return_type, input_types, input_vals):
VTable = ctypes.cast(cls, ctypes.POINTER(ctypes.c_void_p))
wk = ctypes.c_void_p(VTable[0])
function = ctypes.cast(wk, ctypes.POINTER(ctypes.c_void_p))

GetPropertyType = ctypes.WINFUNCTYPE(return_type, *input_types)
GetProperty = GetPropertyType(function[index])

return GetProperty(*input_vals)

def CreateClass(v1, v2):
hstring = create_hstring(v1)

clsid = GUID()
ole32.CLSIDFromString(v2, ctypes.byref(clsid))

cls = ctypes.c_void_p()
hr = combase.RoGetActivationFactory(hstring, ctypes.byref(clsid), ctypes.byref(cls))
if hr != 0:
print(f"Failed to activate class {v1=} {v2=}")

delete_hstring(hstring)

return cls

print("CoInitialize result:", ole32.CoInitialize(None))
print("RoInitialize result:", combase.RoInitialize(0))

LanguageFactory = CreateClass("Windows.Globalization.Language", "{9B0252AC-0C27-44F8-B792-9793FB66C63E}")
BitmapDecoderStatics = CreateClass("Windows.Graphics.Imaging.BitmapDecoder", "{438CCB26-BCEF-4E95-BAD6-23A822E58D01}")
OcrEngineStatics = CreateClass("Windows.Media.Ocr.OcrEngine", "{5BFFA85A-3384-3540-9940-699120D428A8}")
GlobalizationPreferencesStatics = CreateClass("Windows.System.UserProfile.GlobalizationPreferences", "{01BF4326-ED37-4E96-B0E9-C1340D1EA158}")

LanguageList = ctypes.c_void_p()
print(ComCall(6, GlobalizationPreferencesStatics, ctypes.c_long, [ctypes.c_void_p], [ctypes.byref(LanguageList)]))

ole32.CoUninitialize()
print("Done!")


Подробнее здесь: https://stackoverflow.com/questions/786 ... e-comtypes

Вернуться в «Python»