import ctypes def callback_recv(*args): print(args) lib = ctypes.cdll.LoadLibrary('test.dll') Callback = ctypes.CFUNCTYPE(None, ctypes.c_int, ctypes.c_char_p) my_func = getattr(lib, '_ZN7GtTools4testEPKcPFviS1_E') cb_func = Callback(callback_recv) my_func(ctypes.c_char_p('some data'), cb_func)
class GtAlgoWrapper(): # com spec _public_methods_ = ['solve','resultCallback', 'progressCallback',] # _public_attrs_ = ['version',] # _readonly_attr_ = [] _reg_clsid_ = '{2234314F-F3F1-2341-5BA9-5FD1E58F1526}' # uuid _reg_progid_= 'GtAlgoWrapper' # id _reg_desc_ = 'COM Wrapper For GTAlgo' # def __init__(self): self.version = '0.0.1' self.progressOuterCb = None # ... def solve(self, data): # ... return '' def resultCallback(self, obj): # ... return obj def progressCallback(self, obj): # 1 , # if str(type(obj)) == "<type 'PyIDispatch'>": com_obj = win32com.client.Dispatch(obj) try: # 1 (progressCallback) self.progressOuterCb = com_obj.progressCallback1C; except AttributeError: raise Exception('"progressCallback" ') return obj
def main(): import win32com.server.register win32com.server.register.UseCommandLine(GtAlgoWrapper) print('registred') if __name__ == '__main__': main()
progressCallback1C(, ) (" = " + ); (" = " + ); //... 1() // = COM("GtAlgoWrapper"); // .progressCalback(); //... = ...; // JSON .solve();
_dependencies = ['libwinpthread-1.dll', 'libgcc_s_dw2-1.dll', # ..., 'GtRouting0-0-1.dll'] def solve(self, data): prefix_path = 'C:/release' # try: for dep in self._dependencies: ctypes.cdll.LoadLibrary(os.path.join(prefix_path, dep)) # lib = ctypes.cdll.LoadLibrary(os.path.join(prefix_path, 'GtAlgo0-0-1.dll')) except WindowsError: raise Exception('cant load' + dep) solve_func = getattr(lib, '_ZN6GtAlgo5solveEPKcPFviS1_ES3_') # StatusCallback = ctypes.CFUNCTYPE(None, ctypes.c_int, ctypes.c_char_p) ResultCallback = ctypes.CFUNCTYPE(None, ctypes.c_int, ctypes.c_char_p) scb_func = StatusCallback(self.progressOuterCb) rcb_func = ResultCallback(self.resultOuterCb) # 1C DLL. Magic! if self.resultOuterCb is None: raise Exception('resultCallback function is not Set') if self.progressOuterCb is None: raise Exception('progressCallback function is not Set') # solve_func(ctypes.c_char_p(data), scb_func, rcb_func)
Source: https://habr.com/ru/post/332082/
All Articles