2010-02-17 9 views
11

Mantengo un programa que se puede automatizar a través de COM. En general, los clientes usan VBS para hacer sus scripts, pero tenemos un par de clientes que usan Compatibilidad con ActiveX de Matlab y tienen problemas con llamando a métodos de objetos COM con un parámetro NULL.¿Cuál es el equivalente Matlab de NULL, cuando llama a métodos COM/ActiveX?

Se han preguntado cómo lo hacen en Matlab - y he estado recorriendo Mathworks' COM/ActiveX documentation por un día o así que ahora y no pueden entenderlo.

Su código de ejemplo podría ser algo como esto:

function do_something() 
    OurAppInstance = actxserver('Foo.Application'); 
    OurAppInstance.Method('Hello', NULL) 
end 

donde NULL es donde en otro idioma, nos escribimos NULL o nil o Nothing, o, por supuesto, pase en un objeto. El problema es que esto es opcional (y estos se implementan como parámetros opcionales en la mayoría, pero no todos, casos) - estos métodos esperan obtener NULL con bastante frecuencia.

Me dicen que han intentado [] (que a partir de mi lectura parecía el más probable), así como '', Nothing, 'Nothing', None, Null y 0. No tengo idea de cuántas de esas son palabras clave válidas de Matlab, ciertamente ninguna funciona en este caso.

¿Alguien puede ayudar? ¿Cuál es la sintaxis de Matlab para un puntero/objeto nulo para usar como un parámetro de método COM?

Actualización: Gracias por todas las respuestas hasta el momento! Desafortunadamente, ninguna de las respuestas parece funcionar, ni siquiera libpointer. El error es la misma en todos los casos:

Error: Type mismatch, argument 2

Este parámetro en la biblioteca de tipo COM se describe en RIDL como:

HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult); 

El coclase en cuestión implementa una única interfaz que desciende de IDispatch.

Respuesta

6

Estoy respondiendo mi propia pregunta aquí, después de hablar con la asistencia técnica de Matlab: No hay un equivalente de Nothing, y Matlab no es compatible con esto.

En detalle: Matlab es compatible con argumentos opcionales, pero no admite que pasa en la variante punteros NULL (en realidad, para seguir exactamente cómo Nothing obras de VB, una variante VT_EMPTY, creo) ya sea como un argumento opcional o no. Existe documentación sobre algunos tipos de null/pointerish, muchos de los cuales se mencionan en mi pregunta o en varias respuestas, pero estos no parecen ser utilizables con su compatibilidad con COM.

Me dieron una solución mediante el soporte de Matlab utilizando una DLL COM que crearon y Excel para crear un objeto nada ficticio que podría pasarse en las secuencias de comandos. No he conseguido que funcione esta solución/truco, y aunque lamentablemente no podría redistribuirlo. Sin embargo, si encuentra el mismo problema, ¡esta descripción podría darle como mínimo un punto de partida!

Editar

Es posible this Old New Thing blog postpuede estar relacionados. (Ya no trabajo con acceso al código fuente problemático, o el acceso a Matlab, para refrescar la memoria o para probar.)

En resumen, para IUnknown (o derivados) parámetros, es necesario un atributo [unique] para que puedan legalmente ser NULL. La declaración anterior requiere que Matlab cree o pase una variante VT_EMPTY, que no pudo hacer. Quizás agregar [único] puede haber provocado que el motor de Matlab pase en un puntero NULL (o una variante que contenga un puntero NULL), en su lugar, suponiendo que haya podido hacer eso, lo cual es una suposición.

Esto es toda una especulación ya que este código y las complejidades de él están varios años atrás de mí en este punto. Sin embargo, espero que ayude a cualquier lector futuro.

3

Desde el mathworks documentation, puede utilizar la función libpointer:

p = libpointer; 

y luego p será un puntero NULL. Vea esa página para más detalles.

Ver también: more information about libpointer.

+0

Gracias Peter. El cliente en cuestión dice que ha intentado esto y que no funcionó. He actualizado la pregunta con más información sobre la información de error y la firma del método específico. –

5

La respuesta de Peter debería funcionar, pero algo que quizás desee probar es NaN, que es lo que Matlab usualmente usa como valor de NULL.

1

Además de usar [] y libpointer (como sugiere Peter), también puede probar {}.

1

La respuesta correcta para algo en VB que está esperando un argumento Nothing, es conseguir de alguna manera una COM/ActiveX Variant que tiene un tipo de variante de VT_EMPTY.(Ver MSDN docs que hacen referencia a la conducta cálculo de referencias para Visual Basic Nothing)

MATLAB puede hacer esto con la matriz vacía ([]), pero no estoy seguro .... por lo que no puede ser posible únicamente en MATLAB. Aunque alguien podría escribir fácilmente una pequeña biblioteca COM cuyo propósito es crear una variante con VT_EMPTY.

Pero si el argumento tiene el atttribute [optional], y desea salir de ese argumento opcional en blanco, usted debe no hacerlo. Consulte el COM/ActiveX docs on Variants que dice debajo de VT_EMPTY:

VT_EMPTY: No se ha especificado ningún valor. Si un argumento opcional para un método de Automatización se deja en blanco, no pase un VARIANT de tipo VT_EMPTY. En su lugar, pase un VARIANT de tipo VT_ERROR con un valor de DISP_E_PARAMNOTFOUND.

Matlab debe (pero probablemente no lo hace) proporcionar métodos para crear (una "nada" y un "opcional en blanco") estos objetos para que pueda interactuar correctamente con objetos COM.

Cuestiones relacionadas