2016-08-26 3 views
0

J'essaye de import code Python en VBA.Serveur COM Python avec VBA late biding + skip win register (pas de droits d'administrateur)

Le code ci-dessous fonctionne mais requiert les droits d'administrateur. Y at-il un moyen de contourner la nécessité de registre gagnant (en supposant que je ne dispose pas de droits d'administration), mais garder le comportement « Biding fin » (ne veulent pas que Outils >> Référence à chaque fois que je compile quelque chose de nouveau)

class ProofOfConcept(object): 
    def __init__(self): 
     self.output = [] 

    def GetData(self): 
     with open('C:\Users\MyPath\Documents\COMs\SourceData.txt') as FileObj: 
      for line in FileObj: 
       self.output.append(line) 
      return self.output 

class COMProofOfConcept(object): 
    _reg_clsid_ = "{D25A5B2A-9544-4C07-8077-DB3611BE63E7}" 
    _reg_progid_= 'RiskTools.ProofOfConcept' 
    _public_methods_ = ['GetData'] 

def __init__(self): 
    self.__ProofOfConcept = ProofOfConcept() 

def GetData(self): 
    return self.__ProofOfConcept.GetData() 

if __name__=='__main__': 
    print "Registering COM server..." 
    import win32com.server.register 
    win32com.server.register.UseCommandLine(COMProofOfConcept) 

code VBA qu'il appelle:

Sub TestProofOfConcept() 
    Set PoF = CreateObject("RiskTools.ProofOfConcept") 
    x = PoF.GetData() 
    MsgBox x(0) 
End Sub 

Répondre

3

En bref, non. L'exécution de VBA utilise essentiellement l'API COM CoGetClassObject sous le capot - la fonction CreateObject() est essentiellement juste une enveloppe mince autour de lui (il appelle CLSIDFromString pour localiser le CLSID à partir du paramètre d'abord). Ces deux fonctions nécessitent que la classe soit enregistrée.