2010-08-16 9 views
5

Estoy aprendiendo a escribir un control ActiveX programable. Mi objetivo es tener un pequeño control que pueda verificar si hay algo instalado en el sistema. Lo que he hecho hasta ahora es:Escribir un control ActiveX simple para IE que tiene un método

  • Crear un proyecto de control ActiveX de MFC en VS2008
  • añadir un poco de 'seguros para secuencias de comandos' bits que he encontrado here.
  • Amplíe el IDL para proporcionar mi método "IsInstalled", que por ahora devuelve TRUE incondicionalmente (pero luego leerá algunas claves del registro).
  • Genere el control y ejecute regsvr32 en él. Verifiqué que aparece en HKEY_CLASSES_ROOT, y cuando instalé el objeto, el panel "Locales" de IE Developer Tools muestra que el objeto es de tipo _D [mi nombre de complemento]. No solo eso, sino que mi método IsInstalled() aparece debajo de ese objeto.

Sin embargo, cuando llamo IsInstalled(), simplemente no puedo conseguir que funcione:

JScript Debugger - Breaking on JScript runtime error -(n http://img138.imageshack.us/img138/1586/whycomwhy.png

Estoy en una pérdida. También intenté hacer de IsInstalled una propiedad en lugar de un método, utilizando VARIANT_BOOL en lugar de boolean en lugar de BOOL en IDL, lo que sea.

Aquí están los extractos relevantes del código.

La cabecera:

afx_msg VARIANT_BOOL IsInstalled(); 

La aplicación:

afx_msg VARIANT_BOOL 
CMyAXCtrl::IsInstalled() 
{ 
    return TRUE; 
} 

El mapa de envíos:

BEGIN_DISPATCH_MAP(CMyAXCtrl, COleControl) 
    DISP_FUNCTION_ID(CMyAXCtrl, "IsInstalled", dispidIsInstalled, IsInstalled, VT_BOOL, VTS_NONE) 
END_DISPATCH_MAP() 

La parte de la expedición IDL:

[ uuid(6B662202-CF13-4144-AA33-C3FEE9C2C962), 
     helpstring("Dispatch interface for My Control")] 
    dispinterface _Daxplugin 
    { 
    properties: 
    methods: 
     [id(1)] VARIANT_BOOL IsInstalled(); 
    }; 

Si hay algún otro fragmento relevante de código que deba proporcionar, házmelo saber. Pero estoy perplejo aquí. ¡Gracias de antemano!

+0

¿Cuál es el error de tiempo de ejecución de JScript que está obteniendo? Tu imagen solo muestra "(n", que no es muy útil. –

+0

Eso es exactamente lo que es. No puedo entender cómo mostrar el error de tiempo de ejecución completo. De todos modos, mira mi comentario a continuación: es un punto discutible ahora. –

Respuesta

3

Es casi seguro que tiene el prototipo incorrecto para una función de secuencias de comandos. La automatización OLE para lenguajes de scripts tiende a confiar en devolver un HRESULT y luego usar un parámetro de salida para el código de retorno real.

Así cambiarlo a [id(1)] HRESULT IsInstalled(VARIANT_BOOL* p);

también es cierto! = VARIANT_TRUE, debe volver VARIANT_TRUE que es igual a -1 en lugar de 1.

esperanza alguna de que realmente ayuda, pero sin el error real Podría estar equivocado :)

+0

Terminé reescribiendo todo en ATL, que tiene una interfaz más clara para implementando los bits de Safe-for-Script, y descubrí este problema HRESULT por mi cuenta. Sin embargo, por esa razón no estoy seguro de que realmente quiera otorgar la recompensa ya que lo descubrí en mi o wn. Gracias de cualquier manera. –

0

Puede marcar su control como guardar para scripting implementando IObjectSafety o marcando el objeto como guardar mientras lo registra (como lo supone el enlace que proporcionó).

¿Ha ejecutado regsvr32 después de agregar el código para marcarlo y guardarlo para el scripting?

Puede verificar el registro si su control tiene la seguridad para establecer los bits de scripting. Si los bits están configurados, encontrará las dos claves {7DD95802-9882-11CF-9FA9-00AA006C42C4} (Safe for Initialization) {7DD95801-9882-11CF-9FA9-00AA006C42C4}(Safe For Scripting) como subclaves de Categorías Implementadas en su objeto.

Sugeriría implementar IObjectSafety ya que no depende de su clase registrarse.

+0

Utilicé el proyecto de ejemplo de CodeProject, que incluye el registro manual de esos dos CLSID. La seguridad del scripting no es un problema, o no habría podido crear una instancia del objeto en absoluto. El problema ocurre más tarde. –

+0

Si entendí bien la documentación, IE instanciará el control ActiveX, pero no permitirá el acceso desde los scripts si no encuentra los atributos Safe for Scripting. –

Cuestiones relacionadas