2009-12-11 1 views
1

J'ai un contrôle ActiveX écrit en C++ que j'ai créé avec VS2008 et ATL. Pour la plupart, c'est un contrôle assez standard (pas très modifié du modèle d'origine), sauf qu'au lieu d'utiliser IDispatchImpl, j'ai créé ma propre implémentation IDispatchEx. Ce contrôle est uniquement utilisé dans Internet Explorer, et j'ai principalement testé avec IE8.InPlaceActivate sur le contrôle ATL non appelé jusqu'à l'événement de la souris

Tout fonctionne très bien, sauf que, pour une raison ou une autre, InPlaceActivate n'est pas appelé tant que je ne déplace pas la souris sur la zone où la balise object est hébergée dans le navigateur; aucune fenêtre n'est créée, aucun message WM_CREATE n'a été envoyé, etc.

J'ai essayé d'implémenter DISPID_READYSTATE, mais rien ne semble aider. Si j'appelle InPlaceActivate(OLEIVERB_UIACTIVATE); de la méthode SetClientSite et cela fonctionne habituellement, mais ce n'est certainement pas normalement nécessaire.

Pourquoi cela se produirait-il? Comment le navigateur détermine-t-il quand appeler InPlaceActivate (ou quel appel déclenche cela)?

L'étiquette utilisée pour incorporer le contrôle ATL dans la page est: <object id="plugin" type="application/x-vnd.FirebreathTemplatePlugin" width="300" height="300"></object>

Vous pleine source au fichier se trouve ici: http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/FBControl.h

Répondre

1

J'ai trouvé le coupable. Par la suite, OLEMSIC_ACTIVATEWHENVISIBLE est utilisé pour générer automatiquement la variable% OLEMISC% dans le fichier .rgs. Cependant, j'avais surchargé l'défaut de traitement rgs de fournir mes propres variables, et dans le processus d'une ligne critique retirée suis, qui aurait ajouté un:

[CLSID]/MiscStatus/1 = s '131473'

au registre. ceci est utilisé par le navigateur pour décider comment initialiser, et cette valeur a OLEMISC_ACTIVATEWHENVISIBLE 'ou'ed (|) dedans. Ajouté que de retour et tout fonctionne à nouveau.

1

Avez-vous essayé de retourner OLEMISC_ACTIVATEWHENVISIBLE dans votre mise en œuvre IOleObject::GetMiscStatus()?

+0

la valeur par défaut classe ATL, j'ai ce toujours là: DECLARE_OLEMISC_STATUS (OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE | OLEMISC_INSIDEOUT | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST ) Y at-il quelque chose que je pouvais faire pour remplacer, par inadvertance, que? – taxilian

+0

Désolé, je ne suis pas sûr. C'était ma meilleure estimation. –

1

Si tout ce que vous voulez est d'assurer la fenêtre créée pour les scripts, vous pouvez créer la fenêtre précédemment, comme décrit dans PRB: ActiveX Control Window Is Not Created Until Visible in Internet Explorer

Voir aussi IE Automatic Component Activation (Changes to IE ActiveX Update)

+0

J'ai regardé ça; Je suppose que ce serait mieux que rien, mais j'ai créé d'autres contrôles ATL, et je n'ai jamais eu besoin de le faire auparavant. Comme cela est essentiellement spécifié dans le document que vous avez référencé, InPlaceActivate doit être appelé dès que le contrôle est visible; il n'est pas appelé jusqu'à ce que je déplace la souris sur la région où il est dessiné. De l'article (que j'ai lu auparavant) il semble que ce soit un contrôle sans fenêtre par défaut; cependant, la première ligne du constructeur est: m_bWindowOnly = TRUE; et je ne change jamais la valeur après cela. – taxilian

Questions connexes