[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