28 diciembre, 2009

Error al importar librería msado15.dll de ADO

Al programar en Visual C++ 5.0 para un sistema de gestión de bases de datos (database management system, DBMS) relacional pensado para pequeñas aplicaciones de Windows como Microsoft Access 2000, utilizando la interfaz orientada a objetos, ActiveX Data Objects (ADO) para el acceso a la base de datos. Nos encontramos con que tenemos que importar en el fichero de cabecera (.h) correspondiente mediante la directiva # import la dll msado15.dll, pues bien, después de ponernos a tirar código resulta que al compilar nos encontramos con los siguientes errores :
  • ..\Debug\msado15.tlh(403) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
  • ..\Debug\msado15.tlh(1098) : error C2504: 'Connection15' : base class undefined
  • ..\Debug\msado15.tlh(1266) : error C2504: 'Recordset21' : base class undefined
  • ..\Debug\msado15.tlh(1286) : error C2504: 'Recordset20' : base class undefined
  • ..\Debug\msado15.tlh(1320) : error C2504: 'Recordset15' : base class undefined
  • ..\Debug\msado15.tlh(1706) : error C2504: 'Fields20' : base class undefined
  • ..\Debug\msado15.tlh(1740) : error C2504: 'Fields15' : base class undefined
  • ..\Debug\msado15.tlh(1794) : error C2504: 'Field20' : base class undefined
  • ..\Debug/msado15.tli(293) : error C2664: '_com_issue_errorex' : cannot convert parameter 2 from 'struct _Connection *const ' to 'struct IUnknown *'
  • ..\Debug/msado15.tli(481) : error C2664: '_com_issue_errorex' : cannot convert parameter 2 from 'struct _Recordset *const ' to 'struct IUnknown *'
  • ..\Debug/msado15.tli(491) : error C2664: '_com_issue_errorex' : cannot convert parameter 2 from 'struct Recordset21 *const ' to 'struct IUnknown *'
  • etc.
El error está perfectamente documentado en una revisión disponible en el sitio de soporte de Microsoft. El identificador del artículo es 190726 - Última revisión: martes, 18 de noviembre de 2003 - Versión: 2.0 y el título de la revisión: #Import de Visual C++ 5.0 produce errores con ADO versión 2.0 donde se comenta que se produce en los windows 95, 98 y NT, lista a la que añadimos también el 2000. De entre las alternativas ofrecidas, la mejor es sin lugar a dudas la primera, es decir, instalar Visual Studio, Service Pack 3 porque todo se debe a un antiguo problema de la característica #import del compilador que se corrigió en la versión full del correspondiente service pack 3. La obtención de este service pack puede hacerse de varias maneras, siendo la más cómoda acceder al centro de descargas de Microsoft o hacer un ftp a Microsoft, para lo que aconsejo el sitio FileWatcher y bajarse el vssp3 versión full que consta de nueve ficheros (de unos 10 MB cada uno) :
  1. VSSP3_1.EXE
  2. VSSP3_2.CAB
  3. VSSP3_3.CAB
  4. VSSP3_4.CAB
  5. VSSP3_5.CAB
  6. VSSP3_6.CAB
  7. VSSP3_7.CAB
  8. VSSP3_8.CAB
  9. VSSP3_9.CAB
Lo primero una vez hecha la descarga es expandir el service pack ejecutando VSSP3_1.EXE, preferiblemente desde un prompt MS-DOS. Esto creará el directorio vs97_sp3 y ya podremos ejecutar el SETUP.EXE para instalar el service pack que soluciona nuestro problema.

17 noviembre, 2009

Problema con el ordinal 5084 en MFC42D.dll

Ayer empezamos un nuevo desarrollo con el viejo IDE Microsoft Developer Studio 97 en Visual C++ 5.0 y tras generar un MFC AppWizard[exe] y compilar en modo Win32 Debug nos apareció la siguiente ventana al ir a ejecutar:
"No se ha podido localizar el ordinal 5084 en la biblioteca de vínculo dinámico MFC42D.dll".
Después de buscar en diferentes sitios, blogs, foros, manuales, soporte de Microsoft, etc. no encontramos nada que solucionase el problema. En general se insiste en sustituir la librería MFC42D.dll por otra con una versión diferente, en unos casos se recomienda sustituir la v4.21.7022 por una superior como la 6.0.8168, la 6.00.8665, etc. o al revés, otras veces el consejo es bajar de versión. La solución que ha funcionado ha sido desinstalar el IDE y volverlo a instalar: sencillo y efectivo. Ahora el debugger y la ejecución en modo debug van como la seda.

Un saludo

08 octubre, 2009

La conjetura de Goldbach y un problema imposible.



En matemáticas hay muchas conjeturas, de todas ellas la más famosa es la de Goldbach. Apareció mencionada por primera vez en una carta de Christian Goldbach a Leonhard Euler en 1742. En ella el matemático prusiano (1690-1764) le plantea la conjetura a su colega suizo:
"Cualquier número par mayor que dos es la suma de dos números primos"
La conjetura ha sido verificada hasta números enormes, pero aún no se ha encontrado ningún argumento matemático que demuestre que es cierta para todo número par.
Tenemos que recordar esta conjetura para poder resolver el llamado "problema imposible", que aparece en uno de los muchos artículos que publicó Martin Gardner en la columna juegos matemáticos de la revista de divulgación "Scientific American". El problema se plantea así:
«Se eligen dos números, no necesariamente distintos, en el conjunto de números enteros positivos mayores que 1 y no mayores que 20. Al matemático S se le da solamente la suma de estos números. Y al matemático P se le hace saber solamente su producto.

Por teléfono, S le dice a P: “No veo cómo vas a poder averiguar mi suma”. Una hora más tarde, P devuelve la llamada a S y le comunica “Ya sé cuánto vale tu suma”. Más tarde, S llama otra vez a P y le informa “Ahora ya conozco tu producto”.

¿De qué números se trata?»

 
Un saludo

30 junio, 2009

MAPI, introducción.


I.-) MAPI es una especificación de arquitectura que define un subsistema de mensajería.

II.-) La especificación incluye las definiciones de varios componentes externos, lo que hacen y las interfaces que exponen.

III.-) Estos componentes pueden ser implementados por cualquier vendedor, no sólo por Microsoft.

IV.-) Las interfaces entre componentes no son API's sino interfaces COM.

V.-) "Simple MAPI" (version 0) si es una librería. Contiene 12 funciones, pero "Extended MAPI" (version 1) es a lo nos referimos en esta introducción.

El subsistema MAPI está formado por el componente "MAPI run-time" y por el "spooler de mensajes". El "MAPI run-time" es una dll que contiene un conjunto de objetos basados en MAPI y API's usadas por los otros componentes. Estos objetos y API's incluyen interfaces o funciones para inicializar el subsistema MAPI, iniciar una sesión MAPI, gestionar la memoria o administrar perfiles. El spooler es un proceso independiente que gestiona el flujo de mensajes de entrada y salida del sistema.

Un Proveedor de servicios es una dll que devuelve interfaces a MAPI y al spooler. MAPI define tres proveedores principales de servicios, aunque hay algunos más:

- Proveedor de almacén de mensajes (Crear, submitir y almacenar mensajes).

- Proveedor de libreta de direcciones (Ver direcciones de correo de receptores).

- Proveedor de transporte (Manipular la transmisión física de los mensajes).

Un cliente, típicamente, es un proceso que requiere los servicios del subsistema MAPI para poder manipular los mensajes. Un cliente suele ser una aplicación de usuario final para crear, enviar y ver mensajes. Debe hacer "log on" a una sesión MAPI antes de poder solicitar servicios. El "logging on" da lugar a una instancia de cada proveedor de almacén o de libreta de direcciones (se ejecutan en el contexto del cliente). El "logging on" también inicia el spooler que carga e inicializa el proveedor de transporte (se ejecuta excusivamente en el contexto del spooler).

Un perfil es un nombre de lista de servicio de mensaje y datos de configuración creados por el usuario.

Un "servicio de mensaje" es un grupo de uno o más proveedores de servicio que extienden código común de configuración.

Una sesión es el periodo fijo de tiempo durante el que se realiza el trabajo, siendo trabajo en el contexto MAPI una serie de peticiones del cliente a MAPI y que son servidas por uno o más proveedores.

El componente "MAPI run-time" actúa como un broker entre clientes y proveedores de servicio y es integrado en el S.O. Windows como parte del subsistema de mensajería, gestiona directamente las interfaces entre el cliente y los proveedores de servicio. También implementa sus propias interfaces para crear y administrar perfiles, administrar una sesión, y acceder a múltiples proveedores de libreta de direcciones. Además proporciona un conjunto de API's para alocar y liberar memoria, manipular estructuras de datos MAPI, etc.

Un proveedor de almacén de mensajes es una dll que manipula una base de datos de mensajes. Está organizado como una jerarquía de carpetas y mensajes. Aunque la dll de almacén de mensajes se ejecuta en el contexto del cliente y es local en la máquina del usuario la base de datos accedida puede ser local o estar situada en el servidor.

Una "lista de distribuciones" es un tipo especial de contenedor que permite a un grupo de receptores ser direccionados como receptor sencillo, una copia del mensaje es enviada a cada miembro de la lista de distribución. Al igual que los proveedores de almacén de mensajes, los proveedores de libreta de direcciones pueden ser locales o estar situados en el servidor. Estos últimos contienen listas de direcciones globales, mientras que los proveedores locales de libreta de direcciones son habitualmente PAB's (formados frecuentemente por entradas creadas por el usuario).

El trabajo del "proveedor de transporte" es aceptar un mensaje de salida, traducirlo en una cascada de bytes que entienda el sistema subyacente y transmitirlo mediante el sistema de mensajería. Los mensajes entrantes llegan al proveedor de transporte desde el sistema de mensajería, son codificados en un mensaje MAPI y manipulados hacia el spooler para entregarse al proveedor de almacen de mensajes. El sistema de mensajería subyacente hacia el que se conecta el proveedor de transporte dictamina qué protocolo usa el proveedor para establecer y mantener la conexión. Algunos protocolos son propietarios como el de "Micorosft Mail Post Offices", y otros son estándares como el X400 o el SMTP.

El spooler MAPI es un proceso separado que forma parte del subsistema de mensajería. El proveedor de transporte se ejecuta únicamente en el contexto del spooler, el cliente no puede acceder directamente a los proveedores de transporte para solicitar servicios de entrega desde el sistema de mensajería externo. Dicha comunicación debe pasar a través del spooler que está separado del cliente, por tanto es a través del proveedor del almacén de mensajes como se carga una instancia en el contexto del cliente y del spooler. El es el que une ambos procesos.

23 junio, 2009

Modula-2 was created by Niklaus Wirth


Niklaus Wirth was born in February 1934 in Winterthur (Switzerland). He received the degree of Electronics Engineering from the Swiss Federal Institute of Technology (ETH) in Zurich in 1959, an M.Sc. from Laval University, Canada, in 1960. Then in 1963 he was awarded a Ph.D.in EECS from the University of California, Berkeley.

From 1963 to 1967 he served as assistant professor of Computer Science at Stanford University and again at the University of Zurich. Then in 1968 he became Professor of Informatics at ETH Zürich, taking a two year sabbatical at Xerox PARC in California.

Wirth was the chief designer of the programming languages Euler, Algol W, Pascal, Modula, Modula-2 and Oberon. He was also a major part of the design and implementation team for the Lilith and Oberon operating systems, and for the Lola digital hardware design and simulation system. He received the ACM Turing Award for the development of these languages and in 1994 he was inducted as a Fellow of the ACM.

His article Program Development by Stepwise Refinement, about the teaching of programming, is considered to be a classic text in software engineering. In 1975 he wrote the book
Algorithms + Data Structures = Programs, which gained wide recognition and is still useful today.

He is retired since April 1999.

Infolinks In Text Ads