curso basico de objectarx, visual c++.net

23
Curso Básico de ObjectARX Por: Jose Luis Madrid Villa

Upload: zuto1

Post on 28-Dec-2015

85 views

Category:

Documents


6 download

DESCRIPTION

Programiranje

TRANSCRIPT

Page 1: curso basico de objectarx, visual c++.net

Curso Básico de ObjectARX

Por: Jose Luis Madrid Villa

Page 2: curso basico de objectarx, visual c++.net

Bienvenidos al Curso Básico de ObjectARX y Visual C++ Para iniciar, les comentare que el Desarrollo de Aplicaciones en ObjectARX, es un Tema complejo, este comentario no es para desanimar a quienes no cuentan con la experiencia y los conocimientos básicos requeridos para seguir este Curso, y si tiene la intención de hacerles saber, que por lo menos en el inicio, se requiere de tiempo y dedicación en el Desarrollo de cualquier Rutina. El objetivo inicial de este Curso Básico, es el de unificar los conocimientos de los participantes, para posteriormente planear un curso intermedio, en el cual avancemos sobre pasos firmes y homogéneos con el grupo participante, por lo tanto les aconsejo; seguirlo progresivamente. El curso esta planeado en entregas que irán aumentando en grado de dificultad, sin embargo, siempre existirá la posibilidad de regresar o ampliar cualquier tema a solicitud de quienes lo crean conveniente. Hasta donde me es posible, tratare de explicar cada Tema en forma clara y precisa, si en alguna ocasión no lo consiguiera, les agradecería que me lo hagan saber para corregir cualquier confusión ocasionada por mi falta de claridad. Con la finalidad de Complementar el desarrollo del curso, en cada parte del mismo y paralelamente, se proporcionaran los conocimientos tanto de ObjectARX como de Visual C++, en cuanto a este ultimo, su aplicación se enfocará estrictamente para su uso en ObjectARX, por lo tanto si alguien esta interesado en ahondar sobre cualquier tema en particular le sugiero que lo haga en forma independiente de este curso. Requisitos recomendados en cuanto a conocimientos:

• C/C++/Visual C++. • AutoLISP/VisualLISP. • Visual Basic/VBA para AutoCAD. • Programación Orientada a Objetos.

Como lo mencione anteriormente, estos conocimientos se pueden ir obteniendo paralelamente con el desarrollo del Curso.

constructor-3d.com [email protected]

Page 3: curso basico de objectarx, visual c++.net

Requisitos mínimos indispensables de Software y Hardware:

• AutoCAD® 2004/2005/2006 instalado. • Visual C++.NET 2002, (Ver. 7.0) de Microsoft. • ObjectARX® 2004/2005/2006 de acuerdo a la versión de AutoCAD

instalada. • Windows® XP Professional, Service Pack 1 or 2/Windows 2000, Service

Pack 4 • Pentium® III 800 Mhz mínimo recomendado. • 256 MB RAM. • Monitor 1024 x 768 con VGA Color Verdadero (mínimo)

Es necesario aclarar que el curso se enfocara a la versión 2006, sin embargo podrá adaptarse fácilmente a las versiones 2004/2005. Visual C++.NET versión 7, es la recomendada por AutoDESK para desarrollar en ObjectARX, sin embargo, se podrán utilizar versiones posteriores, aceptando el riesgo de las complicaciones que se pudieran tener en cuanto a la compatibilidad, sobre todo en la compilación de las aplicaciones. El Kit de Desarrollo de ObjectARX (SDK), se puede obtener sin costo desde la siguiente página: www.objectarx.com Posteriormente se indicara la forma de instalarlo correctamente. Al final de cada entrega se proporcionaran referencias y enlaces para ahondar en cada tema expuesto.

constructor-3d.com [email protected]

Page 4: curso basico de objectarx, visual c++.net

Capitulo 1

Conceptos Básicos. Como funciona AutoCAD internamente. Antes de iniciar con el Tema de ObjectARX, conoceremos conceptos básicos acerca del funcionamiento de AutoCAD. AutoCAD funciona por medio de una Base de Datos en la cual organiza y almacena diferentes tipos de Objetos. La forma en que lo hace, es Manteniendo Contenedores que utilizan Procedimientos y Métodos los cuales manipulan Objetos que son del mismo tipo, por ejemplo: Entidades (Líneas, Textos, Arcos, etc.), Estilos de Texto, Capas, Estilos de Acotaciones, etc. Por lo tanto un Dibujo de AutoCAD es una colección de Objetos almacenados en una Base de Datos, que contiene la información mínima para que cada Objeto mantenga su definición. Estos Objetos pueden ser gráficos o Estructuras no graficas, por ejemplo: Tablas de Símbolos y Diccionarios. Las Entidades son un tipo especial de Objetos dentro de la Base de Datos y cuentan con representación grafica. Las Tablas de Símbolos son Contenedores usados para almacenar Objetos en la Base de Datos, por ejemplo: la Tabla de Capas (layer table), contiene los registros de la Tabla de Capas. Los Diccionarios al igual que las Tablas de Símbolos, también son Contenedores usados para almacenar Objetos en la Base de Datos, su diferencia estriba en que en este tipo de Contenedor se puede almacenar prácticamente cualquier tipo de información.

constructor-3d.com [email protected]

Page 5: curso basico de objectarx, visual c++.net

Figura 1.1 Componentes de la Base de Datos de AutoCAD

Que es ObjectARX. ObjectARX es un ambiente de Programación que contiene un conjunto de Librerías para desarrollar Aplicaciones para AutoCAD usando C++, facilita el acceso a las estructuras de la Base de Datos de AutoCAD, ya que el acceso es directo, también facilita el acceso al Sistema Gráfico, permite definir comandos nativos dentro de AutoCAD, entre otras cosas, adicionalmente nos permite crear Objetos Personalizados en la Base de Datos para Aplicaciones especificas. ObjectARX es básicamente una DLL (biblioteca de enlaces dinámicos), también soporta el Desarrollo de Aplicaciones complejas.

constructor-3d.com [email protected]

Page 6: curso basico de objectarx, visual c++.net

Con ObjectARX utilizaremos básicamente 3 tipos de objetos:

o Entidades: son objetos que poseen representación grafica. Por ejemplo: Líneas, Textos, Círculos, etc.

o Contenedores: son objetos especiales para manejar y almacenar Colecciones. Por ejemplo: la Tabla de Capas (layer table), la Tabla de Block (block table), etc.

o Objetos: son objetos sin representación grafica. Por ejemplo: layouts, Groups, etc.

Grupos de Clases ObjectARX. Las Clases son categorías de Objetos que definen todas las propiedades comunes de los diferentes Objetos que le pertenecen (Objetos miembros). En la entrega 2 conoceremos los conceptos básicos de la Programación Orientada a Objetos, mientras tanto conoceremos los grupos de clases y funciones que forman la base del ambiente de ObjectARX. AcRx: Clases para vincular una aplicación y para registro e identificación en

tiempo de ejecución. AcEd: Clases para registro de comandos nativos de AutoCAD y para notificación

de eventos. AcDb: Clases de base de Datos de AutoCAD. AcGi: Clases de Gráficos para dibujo de entidades de AutoCAD. AcGe: Clases de Utilidades para operaciones geométricas comunes.

Librerías requeridas para Vincular aplicaciones ObjectARX:

AcRx: acad.lib, rxapi.lib, acdb16.lib AcEd: acad.lib, rxapi.lib, acedapi.lib, acdb16.lib AcDb: acad.lib, rxapi.lib, acdb16.lib AcGi: acad.lib, rxapi.lib, acdb16.lib AcGe: acad.lib, rxapi.lib, acge16.lib, acdb16.lib

constructor-3d.com [email protected]

Page 7: curso basico de objectarx, visual c++.net

Instalando el SDK de ObjectARX Después de haber bajado y extraído los archivos del SDK de ObjectARX, en la carpeta de instalación de ObjectARX localizamos las siguientes Carpetas que contienen: inc Archivos header de ObjectARX. lib Archivos librerías de ObjectARX. redistrib Archivos DLLs utilizadas por Aplicaciones ObjectARX. classmap La jerarquía de clases en un dibujo de AutoCAD. arxlabs Un Tutorial que será expuesto y comentado aquí. docs Archivos de Documentación y Ayuda en línea. samples Archivos de Ejemplos de Aplicaciones ObjectARX. utils Utilerías varias, incluye la carpeta ObjARXWiz que contiene el

instalador de ArxWizards (asistentes para ObjectARX). Para instalar los Asistentes de ObjectARX: localizamos el instalador ArxWizards.msi en la Carpeta \utils\ObjARXWiz. Después de instalar el asistente de ObjectARX y al Abrir VC++.NET, encontraremos una nueva Barra de Herramientas que corresponde a ObjectARX.

constructor-3d.com [email protected]

Page 8: curso basico de objectarx, visual c++.net

Comenzando Creación de nuestro primer programa, el clásico “HELLO WORLD” En este primer ejercicio, aprenderemos a crear y configurar un Proyecto y a registrar un comando para AutoCAD. Existen dos formas para la creación de aplicaciones de ObjectARX, una es la forma manual y la otra por medio del Asistente de ObjectARX. En este primer ejercicio utilizaremos la forma manual, así es que no se preocupen mucho por memorizar todo el procedimiento, ya que el objetivo principal del ejercicio, es el de tener nuestro primer contacto con el ambiente de desarrollo de ObjectARX y VC++. En la siguiente entrega conoceremos al Asistente de ObjectARX, el cual nos ayudara a crear Aplicaciones en forma rápida y fácil y a partir del ejercicio No. 2, tendremos dos Secciones, una para explicar la parte correspondiente a ObjectARX y la otra para la parte de programación de VC++ utilizada en cada ejercicio. Para seguir el ejercicio, utilizaremos el Tutorial STEP 1 que se incluye en el SDK de ObjectARX, y que se muestra a continuación traducido al español, después de descomprimir el ZIP del SDK de ObjectARX, el original en Ingles lo encontraran en la Carpeta: <Carpeta de instalación de ObjectARX>\arxlabs\ObjectARXLabs.html, Los pasos que deberemos completar son los siguientes:

• Crear un Nuevo Proyecto. • Configurar el Compilador. • Configurar el Vinculador. • Definimos Directorios. • Agregar Código al Proyecto. • Crear archivo Def para exportar la función principal a AutoCAD. • Generar la Aplicación. • Cargar el comando dentro del ambiente de AutoCAD. • Ejecutar el Comando.

constructor-3d.com [email protected]

Page 9: curso basico de objectarx, visual c++.net

Configuración del Proyecto y Registro de un Comando

Introducción Como crear un nuevo Proyecto ObjectARX en Visual C++.NET

1. En Visual C++ .NET Seleccionar "File" -> "New" -> "Project".

Figure 1.1– Iniciando un Proyecto Nuevo

2. Hacer clic en "VC++ Projects" en "Project Types:" en el Cuadro de

dialogo "New Project"

3. Seleccionar "Win32 Project” en lista de “Templates”. 4. Proporcionar el Nombre del proyecto en la caja “Name”, por ejem.

"Step01”

5. Proporcionar la localización de la Carpeta donde se quiere guardar, y hacer

click en "OK". Esto invocará a el diálogo de “Asistente de aplicaciones WIN 32”

constructor-3d.com [email protected]

Page 10: curso basico de objectarx, visual c++.net

Figura 1. 2 – Seleccionando plantillas de proyectos Win32

6. Seleccionar la solapa "Application Settings" en el asistente. Seleccionar

"DLL" para la opción "Application type".

Figura 1. 3 - Asistente de aplicación, especificando una aplicación tipo DLL

constructor-3d.com [email protected]

Page 11: curso basico de objectarx, visual c++.net

7. Hacer Click en "Finish" para crear el proyecto Configuración de Compilador

1. Invocar el Explorador de Soluciones en VC++.NET usando el menú: "View"->"Solution Explorer" alternativamente se puede usar el atajo: Ctrl+Alt+L.

2. Seleccionar el proyecto “Step01" en el Explorador de Soluciones. Dar click

con botón derecho en el nodo “Project” en el Explorador de Soluciones y seleccionar "Properties" en el menú de botón derecho de mouse, con esto se mostrará el diálogo de la página de propiedades para el proyecto.

Figura 1.4 - Invocando Propiedades del Proyecto en el Explorador de Soluciones

constructor-3d.com [email protected]

Page 12: curso basico de objectarx, visual c++.net

3. En la lista desplegable "Configuration:" seleccionar "All Configurations".

Esto asegura que los cambios que hagamos se aplicarán a todas las configuraciones

4. Seleccionar el nodo "C/C++"->" General" y seleccionar Warning Level a

Level 1 y "Detect 64-Bit Portability Issues" a NO. Hacemos esto para suprimir los avisos, a los cuales nosotros no necesitamos poner atención porque no afectan de ninguna forma a este proyecto. Hacer clic en “OK” para aplicar y cerrar el diálogo. Similarmente, después de que se tienen hechos los cambios de cualquier propiedad en el dialogo de las Páginas de Propiedad, podemos usar el botón “OK” para aplicar y cerrar

Figura 1.5 - Invocando Propiedades de Proyecto en el Explorador de

Soluciones 5. Hacer clic en el nodo "C/C++" en el árbol "Configuration Properties".

Seleccionar "Code Generation". Seleccionar "Runtime Library". Asignar la propiedad "Multi-threaded DLL (/MD), seleccionando la propiedad en la lista desplegable.

constructor-3d.com [email protected]

Page 13: curso basico de objectarx, visual c++.net

Figura 1.6- Propiedades de Proyecto Configurando la Librería Runtime 6. Seleccionar el elemento "General" del nodo "C/C++" en "Additional

Include Directories" agregar la ruta de la carpeta “Include” del SDK de ObjectARX

Figura 1.7 –Especificando directorios adicionales “Include”

constructor-3d.com [email protected]

Page 14: curso basico de objectarx, visual c++.net

Alternativamente también se puede especificar la localización de archivos “header” y de archivos de librerías usando el diálogo “Options” (disponible en el menú Tools->Options). Esto nos asegura que VC++ .NET buscará los archivos “header” y de librerías de ObjectARX en esas rutas, y a partir de este momento ya no se tendrán que proporcionar esas rutas para cada proyecto de ObjectARX. Para definir las rutas; seleccionar el elemento "VC++ Directories" en el nodo "Projects" en el diálogo “Options”. En la lista desplegable "Show Directories for:" Seleccionar "Include files". Agregar un nuevo elemento a la lista y proporcionar la ruta de los archivos “header” de ObjectARX. Similarmente proporcionar la ruta de los archivos de librería.

Figura 1.8 - Especificando directorios “Include” en el diálogo Options

constructor-3d.com [email protected]

Page 15: curso basico de objectarx, visual c++.net

Configuración del Vinculador (Linker)

1. Seleccionar el nodo "Linker" -> "Input". En el elemento "Additional Dependencies", agregar las siguientes librerias: "rxapi.lib acdb16.lib acge16.lib acad.lib acedapi.lib"

Figura 1.9- Especificando dependencias adicionales

2. Seleccionar el nodo "Linker" -> "General". En el elemento "Additional Library Directories", agregar la ruta de la librería del SDK de ObjectARX

Figura 1.10- Especificando rutas de librerías adicionales.

constructor-3d.com [email protected]

Page 16: curso basico de objectarx, visual c++.net

3. En el elemento "Output File", cambiar la extensión del archivo de salida de ".dll" a ".arx".

Fig. 1.11- Especificando el nombre de archivo de salida La configuración de nuestro proyecto ya está completa, ahora agregaremos el código requerido para hacer que se muestre "Hello World" en la línea de Comando de Autocad

constructor-3d.com [email protected]

Page 17: curso basico de objectarx, visual c++.net

Agregando Código al Proyecto

1. Desde el Menu, seleccionar "Project" -> "Add New Item" (Ctrl+Shift+A). 2. En el Dialogo "Add New Item" seleccionar "C++ File (.cpp)". 3. Teclear "HelloWorld" en la caja "Name:". Hacer Click en "Open".

Primero, se requiere incluir dos archivos de encabezado ”header” de ObjectARX: aced.h y rxregsvc.h. Esos son Archivos “header” para definiciones de aplicaciones “Rx” y “acceso” de ”C” a Servicios específicos del Editor de AutoCAD (aced.h) y el “header” para las funciones de utilidad acrxXXX (rxregsvc.h). Adicionar esto como se indica a continuación: #include "stdafx.h" #include <aced.h> #include <rxregsvc.h> Después declaramos dos funciones: initApp() - que será llamada por AutoCAD cuando la aplicación se cargue y: unloadApp() - que será llamada cuando la aplicación se descargue. Referirse a la función acrxEntryPoint(), mas adelante para observar como esas funciones son llamadas por AutoCAD. Adicionar las líneas: void initApp(); void unloadApp(); Ahora declaramos nuestra función para visualizar "Hello World" en la línea de comando de AutoCAD. Adicionar: void helloWorld(); Ahora definimos la función initApp(). Esta función registra un Nuevo comando con el mecanismo de comandos de AutoCAD. Este Nuevo comando se convertirá en un punto de entrada (“entry point”) adicional dentro de nuestra aplicación: void initApp() { // register a command with the AutoCAD command mechanism acedRegCmds->addCommand("HELLOWORLD_COMMANDS", "Hello", "Bonjour", ACRX_CMD_TRANSPARENT, helloWorld);

}

constructor-3d.com [email protected]

Page 18: curso basico de objectarx, visual c++.net

Para detallar lo tocante al Macro acedRegCmds y a el método addCommand() (de la clase AcEdCommandStack), referirse al archivo de la ayuda en línea de ObjectARX. El primer argumento de addCommand() es el nombre del grupo de comandos (este incluye un solo comando en nuestro caso). El segundo argumento es el nombre de comando global/sin traducir. El tercer argumento es el nombre para el mismo comando local/traducido. El cuarto argumento es la bandera de comando (note que aquí definimos un comando transparente, significa que el comando puede ser invocado mientras otro comando esta activo). Finalmente, el último argumento es el puntero para la función que será llamada por nuestro comando. En C++ este es el nombre de la función misma. A continuación definimos la función unloadApp(). Esta es la función que removerá nuestro grupo de comandos, y que removerá también nuestro comando. Ya que los comandos registrados en AutoCAD son puntos de entrada adicionales dentro de nuestra aplicación, es absolutamente necesario remover estos cuando la aplicación se descarga. Adicionar: void unloadApp() { acedRegCmds->removeGroup("HELLOWORLD_COMMANDS"); } Ahora definimos nuestra función helloWorld(); la función acutPrintf() es la equivalente de C printf redireccionada a la línea de comando de AutoCAD. Adicionar: void helloWorld() { acutPrintf("\nHello World!"); } Ahora necesitamos definir la función más importante de aplicaciones ObjectARX. Todas las aplicaciones ObjectARX tienen un punto de entrada principal que es usado para pasar mensajes: la función acrxEntryPoint(). Recuerde que una aplicación ObjectARX es una DLL y no tiene un punto de entrada main(). AutoCAD llama a la función acrxEntryPoint() del modulo de ObjectARX para pasar mensajes a la aplicación. El primer parámetro de acrxEntryPoint() es un miembro ”data” de la clase AcRx llamado msg que representa el mensaje enviado desde el núcleo de ObjectARX a la aplicación. Referirse a la Ayuda en línea para detalles de los diferentes mensajes que una aplicación ObjectARX puede recibir desde AutoCAD.

constructor-3d.com [email protected]

Page 19: curso basico de objectarx, visual c++.net

En esta aplicación muy simple, necesitamos ser notificados cuando la aplicación se carga o descarga con el propósito de registrar o des-registrar nuestro comando "hello". En el primer caso llamaremos a nuestra función initApp(); en el Segundo caso llamaremos a nuestra función unloadApp(). El Segundo parámetro de acrxEntryPoint() es un indicador o puntero opaco para datos pasados a diferentes funciones, Tales como las funciones lock y unlock (estos datos cambian dependiendo del mensaje pasado por AutoCAD). Por omisión todas las aplicaciones están “locked”, lo que significa que una vez cargadas no pueden ser descargadas. Ya que nuestra aplicación es muy simple (esta no define objetos que AutoCAD y otra aplicaciones hagan referencia a ellos, excepto nuestro propio comando), Podemos confiadamente desbloquear (“unlock”) nuestra aplicación para que sea descargable, siempre y cuando removamos primero nuestro comando, lo cual conseguimos con nuestra función unloadApp(). También por omisión, aplicaciones ObjectARX no son MDI (Referirse a la ayuda en línea para detalles de MDI). Las aplicaciones necesitan registrarse así mismas explícitamente para ser MDI usando la función global acrxRegisterAppMDIAware() NOTA: Registrar una aplicación como MDI no es en si misma suficiente para ser aplicaciones efectivamente MDI. El criterio que necesita reunir se describe en detalle en la documentación en línea de ObjectARX. Ya que nuestra aplicación es muy simple (no usa el concepto de Document y no interactúa con la Base de Datos del dibujo de AutoCAD), podemos confiadamente registrar nuestra aplicación como MDI usando la función global acrxRegisterAppMDIAware(). Adicionar: extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) { switch (msg) { case AcRx::kInitAppMsg: acrxDynamicLinker->unlockApplication(pkt); acrxRegisterAppMDIAware(pkt); initApp(); break; case AcRx::kUnloadAppMsg: unloadApp(); break;

default:

constructor-3d.com [email protected]

Page 20: curso basico de objectarx, visual c++.net

break; } return AcRx::kRetOK; } Finalmente, necesitamos exportar la función acrxEntryPoint() para que AutoCAD pueda accesarla. Hay muchas formas para hacer esto: una consiste en crear un archivo de definición (.def), como se explica a continuación.

constructor-3d.com [email protected]

Page 21: curso basico de objectarx, visual c++.net

Creando el archivo Definition (.DEF)

1. En el Menu "Project" -> "Add New Item" (Ctrl+Shift+A). 2. En el dialogo "Add New Item" seleccionar la Plantilla "Def File (.def)". 3. Teclear "ArxProject" en la caja "Name:". Hacer Click en "Open"

Agregar la siguiente información en el archivo nuevo. Todas las aplicaciones ObjectARX deben exportar por lo menos dos funciones: acrxEntryPoint y acrxGetApiVersion. LIBRARY Step01 EXPORTS acrxEntryPoint PRIVATE acrxGetApiVersion PRIVATE Nuestro proyecto esta listo para ser Generado (”built”). Si se ha seguido el presente tutorial correctamente se obtendrán: 0 errors y 0 warnings. NOTA: Si se obtiene un AVISO del “Linker” LNK4099 para las librerías rxapi.lib y acedapi.lib durante la Construcción. Ignorar dichos AVISOS. Cargar hello.arx en AutoCAD y teclear "hello" para ejecutar nuestro comando. Para cargar “hello.arx”, seleccionar uno de los cuatro métodos siguientes:

1. Simplemente dragar el archivo desde el Explorer a la ventana de AutoCAD.

2. Usar el comando de AutoCAD "ARX" y teclear "Load" en la línea de comando.

3. Desde el Menú de AutoCAD, “Tools” -> "Load Application...".

4. Usar el comando de AutoCAD "APPLOAD".

Una vez que el comando ha sido cargado, teclear "hello" o "bonjour" en la línea de comando y se mostrara el mensaje "Hello World!".

constructor-3d.com [email protected]

Page 22: curso basico de objectarx, visual c++.net

Con el ejemplo previo, se podrán haber dado cuenta que en Visual C++, todo deber estar definido, esto es algo que siempre debemos tener en mente. Ahora analizaremos cada una de la partes de este ejemplo sencillo además se proporcionan las referencias correspondientes para ahondar en los temas expuestos.

1. Creamos una aplicación de tipo Win32 a. 1.1 Configuramos la Aplicación Win32 como tipo DLL.

2. Configuramos el Compilador b.

2.1 Definimos Propiedades de Configuración. 2.1.1 Configuración General. 2.1.2 Configuración para C/C++

2.1.2.1 Configuración General para C/C++ 2.1.2.2 Configuración para Generación de Código.

2.1.3 Configuramos el Vinculador. 2.1.3.1 Configuración General del Vinculador. 2.1.3.2 Configuración de Entrada.

3. Definición de Directorios de VC++.

4. Agregar Código al Proyecto 4.1 Crear el Archivo .cpp de C++ c.

5. Crear archivo .def para exportar la función principal a AutoCAD d. 6. Generar la Aplicación e.

Enlaces: a. http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vcc

ore/html/vcgrfoverviewwin32appwizard.asp

b. http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vsintro7/html/vxurfSolutionExplorerDialog.asp

c. http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vcc

ore/html/vcurfprogramorcontrolsourceheaderfiles.asp

d. http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vccore/html/_core_export_from_a_dll_using_..def_files.asp

e. http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vcc

ore/html/vcurfprogramorcontrolsourceheaderfiles.asp

constructor-3d.com [email protected]