[Python] ApiCom Error

Matteo Boscolo matteo.boscolo a boscolini.eu
Ven 7 Gen 2011 08:29:58 CET


Ciao A tutti,
e' da pił di un giorno che cerco di risolvere questo problema, qualsiasi 
aiuto sarebbe apprezzatissimo.
Vi spiego la situazione.
ho due script test e test1 che trovate a fondo mail,
lo script test definisce un serverCom.
se lo eseguo da python, non ci sono errori e lo script fa esattamente 
quello che gli viene richiesto di fare.
se invece chiamo il mio script da del codice c# ,(che trovate sempre in 
fondo alla mail), l'esecuzionde del codice mi ritorna un errore.
dopo attente analisi mi sono accorto che se uso il codice c# compilando 
con l'opzione anyCpu, (la mia macchina e' a 64 bit), il codice si 
schianta quando vado ad utilizzare il metodo :
  def comInit(self,obj=None):  # <---- qui gli passo una stringa "pippo"
         self._test1=test1.test1(obj)
e precisamente quando tenta di istanziare la classe test1

l'errore non si verifica se compilo il codice c# utilizzando l'opzione 
32Bit.(Questa soluzione non la posso utilizzare, in quanto la mia classe 
com verra istanziata da un applicazione che non ho sviluppato io)

la cosa strana e che il metodo Now, non si schianta mai ..

Sapete come risolvere questo problema, o almeno darmi qualche consiglio?

Grazie mille ..
Matteo

#test
from win32com.server.util import unwrap, wrap
import test1

class test(object):
     """
         The main client application
     """
     _reg_clsid_ =   "{F92FB064-0B23-4AE7-BE1A-79DD8B820100}"
     _reg_desc_ =    "test module"
     _reg_progid_ =  "test.application"
     _public_methods_ = ['comInit','Now','GetIstance']
     def __init__(self):
         self._test1=None
     def comInit(self,obj=None):
         self._test1=test1.test1(obj)

     def Now(self,msg):
         return"Now" +str(msg)
     def GetIstance(self):
         return str(self._test1.getArg())

#o:=newObj('test.application')
#o->Now("ciao")
#o->comInit("aa")

if __name__=='__main__':
     import win32com.server.register
     win32com.server.register.UseCommandLine(test)
     t=test()
     t.Now("now  ")
     t.comInit("aa")
     print t.GetIstance()
     print "Test Done"

#Test1
class test1:
     def __init__(self,arg=None):
         self._arg=arg
     def getArg(self):
         return "done "+str(self._arg)


//c# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
     class Program
     {
         static void Main(string[] args)
         {
             object obj = Activator.CreateInstance
                 (Type.GetTypeFromProgID("test.Application"));
             object[] objArgs = new object[1];
             objArgs[0] = "ciao";
             obj.GetType().InvokeMember("comInit",
                 BindingFlags.InvokeMethod, null, obj, objArgs);

             object ret=obj.GetType().InvokeMember("Now",
                 BindingFlags.InvokeMethod, null, obj, objArgs);

         }
     }
}


Maggiori informazioni sulla lista Python