Afficher un message
Vieux 12/09/2007, 10h19   #3
vml
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: proprietes persistantes d'un activeX control et python

On 11 sep, 20:51, MC <XX.X...@XX.XmclaveauX.com> wrote:
> Bonsoir !
>
> > j'ai une propriete d'un activex qui est dite persistante, on ne peut
> > la modifier que lors du design d'une form et elle conditionne la
> > visualisation de l'activex control dans une form.

>
> > Je me demande si je peux modifier cette propiete a la creation de
> > l'objet COM avec pywin32 ?

>
> En complément de ce que j'ai déjà répondu dans la liste, et avec tes
> précisions complémentaires :
> - pour moi, une propriété persistante, c'est une propriété que l'on
> retrouve lors de sessions successives. Mais, visiblement, ce n'est pas
> le sens utilisé dans ton cas.
> - Pywin32 permet d'interopérer avec des objets COM, mais pas
> directement avec des ActiveX en tant que compsants visuels. Pour cela,
> il faut passer par un conteneur. J'en connais trois : PythonWin,
> WxPython, et Pluie.
> - Pywin32 ne permet d'accéder qu'aux propriétés publiques (exposées)
> d'un ActiveX. Si la propriété n'est pas exposée, elle n'est pas
> utilisable.
> Il existe, dans PythonWin, un utilitaire (Makepy), capable de retrouver
> les propriétés statiques d'un objet COM.Visual-studio (et MS) étant
> essentiellement statique, ça pourrait suffire. Si makepy ne peut
> trouver la propriété, celle-ci sera inaccessible (nonseulement à
> Python, mais à tous les langages utilisant COM).
>
> --
> @-salutations
>
> Michel Claveau


On 11 sep, 20:51, MC <XX.X...@XX.XmclaveauX.com> wrote:
> Bonsoir !
>
> > j'ai une propriete d'un activex qui est dite persistante, on ne peut
> > la modifier que lors du design d'une form et elle conditionne la
> > visualisation de l'activex control dans une form.

>
> > Je me demande si je peux modifier cette propiete a la creation de
> > l'objet COM avec pywin32 ?

>
> En complément de ce que j'ai déjà répondu dans la liste, et avec tes
> précisions complémentaires :
> - pour moi, une propriété persistante, c'est une propriété que l'on
> retrouve lors de sessions successives. Mais, visiblement, ce n'est pas
> le sens utilisé dans ton cas.
> - Pywin32 permet d'interopérer avec des objets COM, mais pas
> directement avec des ActiveX en tant que compsants visuels. Pour cela,
> il faut passer par un conteneur. J'en connais trois : PythonWin,
> WxPython, et Pluie.
> - Pywin32 ne permet d'accéder qu'aux propriétés publiques (exposées)
> d'un ActiveX. Si la propriété n'est pas exposée, elle n'est pas
> utilisable.
> Il existe, dans PythonWin, un utilitaire (Makepy), capable de retrouver
> les propriétés statiques d'un objet COM.Visual-studio (et MS) étant
> essentiellement statique, ça pourrait suffire. Si makepy ne peut
> trouver la propriété, celle-ci sera inaccessible (nonseulement à
> Python, mais à tous les langages utilisant COM).
>
> --
> @-salutations
>
> Michel Claveau


J'utilise effectivement un conteneur wxpython pour faire cela, dans
le .py genere par makepy sur mon fichier ocx j'ai ceci:



makepy_version = '0.4.95'
python_version = 0x20500f0

import win32com.client.CLSIDToClass, pythoncom
import win32com.client.util
from pywintypes import IID
from win32com.client import Dispatch

# The following 3 lines may need tweaking for the particular server
# Candidates are pythoncom.Missing, .Empty and .ArgNotFound
defaultNamedOptArg=pythoncom.Empty
defaultNamedNotOptArg=pythoncom.Empty
defaultUnnamedArg=pythoncom.Empty

CLSID = IID('{7E8C2313-69F1-4199-8F30-D2834F0388DC}')
MajorVersion = 1
MinorVersion = 0
LibraryFlags = 10
LCID = 0x0

from win32com.client import DispatchBaseClass
class _DActiveXModuleLoader(DispatchBaseClass):
"""Dispatch interface for toto toto.Lab ModuleLoader Control"""
CLSID = IID('{75F72F36-5D10-450B-B99F-0D0CED099456}')
coclass_clsid = IID('{A72D838C-A05F-4B3B-AF58-EE878D860B1E}')

def AboutBox(self):
return self._oleobj_.InvokeTypes(-552, LCID, 1, (24, 0), (),)

_prop_map_get_ = {
"Module": (5, 2, (9, 0), (), "Module", None),
"ModuleName": (1, 2, (8, 0), (), "ModuleName", None),
"OpenProject": (2, 2, (11, 0), (), "OpenProject", None),
"ProjectName": (3, 2, (8, 0), (), "ProjectName", None),
"SectionName": (4, 2, (8, 0), (), "SectionName", None),
}
_prop_map_put_ = {
"Module" : ((5, LCID, 4, 0),()),
"ModuleName" : ((1, LCID, 4, 0),()),
"OpenProject" : ((2, LCID, 4, 0),()),
"ProjectName" : ((3, LCID, 4, 0),()),
"SectionName" : ((4, LCID, 4, 0),()),
}

class _DActiveXModuleLoaderEvents:
"""Event interface for toto toto.Lab ModuleLoader Control"""
CLSID = CLSID_Sink = IID('{D2F8DD72-55BB-48E3-9956-228D502B69F9}')
coclass_clsid = IID('{A72D838C-A05F-4B3B-AF58-EE878D860B1E}')
_public_methods_ = [] # For COM Server support
_dispid_to_func_ = {
}

def __init__(self, oobj = None):
if oobj is None:
self._olecp = None
else:
import win32com.server.util
from win32com.server.policy import EventHandlerPolicy

cpc=oobj._oleobj_.QueryInterface(pythoncom.IID_ICo nnectionPointContainer)
cp=cpc.FindConnectionPoint(self.CLSID_Sink)
=cp.Advise(win32com.server.util.wrap(self,
usePolicy=EventHandlerPolicy))
self._olecp,self._olecp_ = cp,
def __del__(self):
try:
self.close()
except pythoncom.com_error:
pass
def close(self):
if self._olecp is not None:
cp,,self._olecp,self._olecp_ =
self._olecp,self._olecp_,None,None
cp.Unadvise()
def _query_interface_(self, iid):
import win32com.server.util
if iid==self.CLSID_Sink: return win32com.server.util.wrap(self)

# Event Handlers
# If you create handlers, they should have the following prototypes:


from win32com.client import CoClassBaseClass
# This CoClass is known by the name 'toto.toto.Lab.ModuleLoaderCtrl'
class ActiveXModuleLoader(CoClassBaseClass): # A CoClass
# toto toto.Lab ModuleLoader Control
CLSID = IID('{A72D838C-A05F-4B3B-AF58-EE878D860B1E}')
coclass_sources = [
_DActiveXModuleLoaderEvents,
]
default_source = _DActiveXModuleLoaderEvents
coclass_interfaces = [
_DActiveXModuleLoader,
]
default_interface = _DActiveXModuleLoader

RecordMap = {
}

CLSIDToClassMap = {
'{75F72F36-5D10-450B-B99F-0D0CED099456}' : _DActiveXModuleLoader,
'{D2F8DD72-55BB-48E3-9956-228D502B69F9}' :
_DActiveXModuleLoaderEvents,
'{A72D838C-A05F-4B3B-AF58-EE878D860B1E}' : ActiveXModuleLoader,
}
CLSIDToPackageMap = {}
win32com.client.CLSIDToClass.RegisterCLSIDsFromDic t( CLSIDToClassMap )
VTablesToPackageMap = {}
VTablesToClassMap = {
}


NamesToIIDMap = {
'_DActiveXModuleLoaderEvents' :
'{D2F8DD72-55BB-48E3-9956-228D502B69F9}',
'_DActiveXModuleLoader' : '{75F72F36-5D10-450B-B99F-0D0CED099456}',
}


j'ai donc bien acces a la propiete ModuleName lorsque je l'encapsule
dans un wx conteneur ... mais lorsque je la change de 'Default' a
'Picture' ca ne marche pas


le mec du developpement m'a dit que l'activeX control que j'utilise ne
peut etre modifie que lors du design-time de Visual Studio, car a ce
moment la la propriete est exposee .... mais sinon rien n'y fait je
n'arrive pas a changer cette satanee proprietee pour avoir autre chose
que le bitmap par default.

J'ai aussi regarde le fichier oca fourni avec l'ocx et il y a bien une
methode d'un objet qui semble etre interessante mais je ne sais
absoluement pas comment utiliser les objets du fichier oca et leur
methodes. j'ai trop de lacunes a propos de COM.

Une idee ?


merci beaucoup


Victor












  Réponse avec citation
 
Page generated in 0,08400 seconds with 9 queries