NP CAD Page | Articles | Russian | Download

N.Poleshchuk. Primary Advices for Migration from ObjectARX 2004-6 to ObjectARX 2007-8

We are talking here of some problems arising while migrating from ObjectARX 2006 (and 2004/2005) to ObjectARX 2007 (and 2008).

Basic Differences Between ARX Projects 2004/2005/2006 and 2007

The main thing: applications for AutoCAD 2007 and higher must support unicodes, in other words every alphanumeric symbol will be coded by two bytes not by one as in the usual ANSI coding. Let us declare the most obvious differences:

N Name AutoCAD 2004/2005/2006 AutoCAD 2007                  
1 String data type char *
char []
wchar_t *
wchar_t []
2 Explicitely defined strings "Sample string" L"Sample string"
3 String functions _itoa(), ... _itow(), ...

But there are many other less obvious distinctions that can be discovered while reorganizing your applications to the next version. Some of them are mentioned in the file ObjectARX 2007\docs\acad_xmg.chm ("ObjectARX Migration Guide").

Simple Advices for Writing Source Code of ARX Applications for AutoCAD 2004/2005/2006 and AutoCAD 2007

It would be good to create source texts in a manner suitable to include them without changes into appplications for different versions of AutoCAD. Taking into account that in versions 2004-2007 ObjectARX Wizard creates project skeleton by similar templates it is possible to write programs in a universal form. All the differences will be hidden in linked header files and libraries that mostly preserve their names from version to version. In theory it is also possible to create texts satisfying previous versions (2002, 2000i, 2000) but for them ObjectARX Wizard uses another template - that’s why we will not consider the extension of source texts to these versions (possible but harder).
The three primary migration differences for C++ were formulated above. Next you will find recommendations for each of them.

The ACHAR Data Type

This type is defined in the AdAChar.h file of ObjectARX 2006 in the following way:

typedef char ACHAR;

In the 2007th version ACHAR declaration looks otherwise:

typedef wchar_t ACHAR;

So we can conclude that in the both versions it is convenient instead of char and wchar_t to use the universal ACHAR type for which you should put into text a directive:

#include "AdAChar.h"

It will provide program text uniformity in declaration of string variable types for 2006 and 2007. Therefore it is possible to build applications for AutoCAD 2004/2005/2006 using ObjectARX 2006 (it is necessary indeed to make sure of workability of your ARX files in AutoCAD 2004/2005 if application should run in these versions too).
In ObjectARX 2005 there is no AdAChar.h file but ACHAR type declaration can be found in adesk.h. If you be more attentive then you will see that there is an include instruction for AdAChar.h file in it. That’s why it is better to attach adesk.h rather than AdAChar.h:

#include "adesk.h"

Macros from TCHAR.H

The tchar.h file was inserted by Microsoft into Visual C++ to facilitate application transferring to unicodes support.
If the source text has a directive

#include <tchar.h>

then macros from tchar.h file become available to Visual C++ preprocessor working before compilation.

The _T Macro

First of all the _T macro is interesting for us. If the following directive

#define _UNICODE

is present then L character is added before (this is what we just need for explicitely defined unicode string constants). At the same time if the identifier _UNICODE is undefined then _T macro does nothing (leaves argument unchanged).

Example:
acutPrintf(_T("Design system, 2007."));

Info. In Visual C++ 2005 the _UNICODE identifier is always set by default.

String Function Macros

The tchar.h file contains many macros corresponding to the functions handling strings. For example:

Macro ANSI function Unicode function
_itot _itoa _itow
_ttoi atoi _wtoi
_ttol atol _wtol
_tstof atof _wtof
_tcslen strlen wcslen
_tcscat strcat wcscat
_tcscpy strcpy wcscpy
_tcsncpy strncpy wcsncpy

Therefore instead of string functions in a universal source code it is better to use macros that is being transformed by preprocessor to specific function names (ANSI or Unicode).

Note 1. Some functions (e.g. strcat) in Visual C++ 2005 are treated as depricated because of safe analogs creation (strcat_s).

Note 2. Many Windows API functions in reality have two types, for ANSI and Unicode, that is compiler itself appends A or W symbol. For example, MessageBoxA and MessageBoxW.

Preprocessor Directives

For outdated functions and for other cases when macros from tchar.h are unsufficient you can use directives that are run by preprocessor before compilation of source code. Pieces of texts that should look different with supporting unicodes and without it are formed by #ifdef and #ifndef directives. Here is an example:

#ifdef _UNICODE
_tcscat_s (s1, s2);
#else
_tcscat (s1, s2);
#endif

In this example a new safe function wcscat_s will be included into the text for AutoCAD 2007 (Visual C++ 2005) and an older one strcat function for AutoCAD 2005 (Visual C++ 2002).
Such a branching will help you to take into account all the features of AutoCAD 2007 in comparison with the older versions (e.g. to create mesh in version 2006 and to create surface in version 2007 or higher).
In the same way but with the user identifiers for preprocessor one can make branching for various languages (Russian-English etc.), and for 64-bit support.


NP CAD Page | Articles | Russian | Download