Я хотел бы взаимодействовать с 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