-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] 1 DLL Python

, 01 2017 . 17:33 +
! , - . - 1, .

, dll , , JSON , 2 . , . web- , ctypes, .

:

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)
 

, . , .lib objdump -D, .

- , (mangle ) , . MinGW

1 . dll , Native API, . , . , - gcc. Visual Studio , , .

. , , . - 34, Python. !

python win32com Python , COM . , COM , 1.

pypiwin32 pip, , .. - pip'.

, . COM-

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)) == "": 
            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()

GtAlgoWrapper. 1 :

 progressCallback1C(, ) 
    (" = " + );
    (" = " + );

//...
 1()
    // 
    =   COM("GtAlgoWrapper");
    // 
   .progressCalback();
   //...
    = ...; // JSON 
   .solve();


, . , dll 1C:

_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)

, python-, GtAlgoWrapper, 1.

dll 1C , .
!

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332082/

:  

: [1] []
 

:
: 

: ( )

:

  URL