Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

proprietes persistantes d'un activeX control et python

4 réponses
Avatar
vml
Bonjour !


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 ?

Quelqu'un as-t-il une idee ?



merci d'avance



Victor

4 réponses

Avatar
MC
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

Avatar
vml
On 11 sep, 20:51, MC 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 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_IConnectionPointContainer)
cp=cpc.FindConnectionPoint(self.CLSID_Sink)
cookie=cp.Advise(win32com.server.util.wrap(self,
usePolicy=EventHandlerPolicy))
self._olecp,self._olecp_cookie = cp,cookie
def __del__(self):
try:
self.close()
except pythoncom.com_error:
pass
def close(self):
if self._olecp is not None:
cp,cookie,self._olecp,self._olecp_cookie =
self._olecp,self._olecp_cookie,None,None
cp.Unadvise(cookie)
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.RegisterCLSIDsFromDict( 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


Avatar
Méta-MCI \(MVP\)
Re !

lacunes a propos de COM.


Beaucoup de problèmes peuvent aussi venir de l'implémentation du client COM. Dans beaucoup de
langages/applications, il y a des limites. Par exemple :
- pas de gestion Unicode (or COM utilise Unicode pour transférer les données)
- format numérique différent (COM est, d'abord, basé sur des types du langage C)
- format date ou time ou datetime différent
- mauvais support des tableaux (dans Python, les listes font l'affaire)
- mauvais support de la casse (exemple : VBscript), ce qui entraîne des problèmes bizarres
- mauvaise gestion du nombre de paramètres (certains trucs ne supportent pas un nombre variable
de paramètres, d'autres n'acceptent qu'une seule valeur en retour)
- gestion des callbacks (et des évènements) impossible ou très incomplète (c'est le cas de
Python)

Bref, combler des lacunes peut très bien ne pas suffire, et ne pas être nécessaire.


Pour en revenir à ta propriété, si elle est en lecture seule, tu ne pourras pas la modifier depuis
Python.
Ceci dit, s'il s'agit juste de remplacer une image, pourquoi ne pas remplacer le contenu du
fichier-image ? (en gardant son nom).


@-salutations

Michel Claveau

Avatar
vml
On 12 sep, 13:39, "Méta-MCI (MVP)"
wrote:
Re !

lacunes a propos de COM.


Beaucoup de problèmes peuvent aussi venir de l'implémentation du clie nt COM. Dans beaucoup de
langages/applications, il y a des limites. Par exemple :
- pas de gestion Unicode (or COM utilise Unicode pour transférer les données)
- format numérique différent (COM est, d'abord, basé sur des typ es du langage C)
- format date ou time ou datetime différent
- mauvais support des tableaux (dans Python, les listes font l'affaire)
- mauvais support de la casse (exemple : VBscript), ce qui entraîne des problèmes bizarres
- mauvaise gestion du nombre de paramètres (certains trucs ne suppor tent pas un nombre variable
de paramètres, d'autres n'acceptent qu'une seule valeur en retour)
- gestion des callbacks (et des évènements) impossible ou très i ncomplète (c'est le cas de
Python)

Bref, combler des lacunes peut très bien ne pas suffire, et ne pas êt re nécessaire.

Pour en revenir à ta propriété, si elle est en lecture seule, tu ne pourras pas la modifier depuis
Python.
Ceci dit, s'il s'agit juste de remplacer une image, pourquoi ne pas rempl acer le contenu du
fichier-image ? (en gardant son nom).

@-salutations

Michel Claveau


Eh bien le control activeX n'est pas qu'une simple image il me donne
aussi acces a tt un tas de methodes derriere et au pilotage d'une
application de mesure .... et en plus le mode 'Picture' me donne acces
a un appli tres tres sympa ou je peux avoir des curseurs dans un plot
faire des zooms comparer des valeurs RMS etc etc ... Donc j'en ai
absolument besoin

CE que vous me dites m'inquiete un peu quand a la gestion des
evenments et callback ... moi qui veut a tt pris renverser c# et vb6
dans me boite c'est pas trop gagne ....
Pouvez-vous me donner des examples ( avec ie ??)


le developpeur m'a propose d'adapter l'initialisation de l'activeX en
rendant la propriete accessible au run-time , je vais peut etre
attendre cela alors ?

merci d'avance


Victor