Introduction

ZWCAD 2023 Help
Introduction

This document will guide you to migrate an ARX application to ZRX of ZWCAD. If you have any problems can’t be solved in this document, please feel free to contact us for help by email to zdn@zwcad.com .

© 1998-2022 广州中望龙腾软件股份有限公司 All Rights Reserved.


System Requirement

System Requirement

1. Developing environment: Visual Studio 2017

2. ZWCAD Version: ZWCAD 2023

3. SDK: ZRXSDK

4. ARX objects Based on ObjectARX2019 are recommended

Note: ZRX is compatible with ObjectARX2019, so some features, like constraint, provided in higher versions of ObjectARX would not be supported in current ZRX. Meanwhile, the current ZRX supports Unicode. For migration, we recommend to use ARX objects for ObjectARX 2019.


Migration steps

Migration steps


Step 1

Step 1: Update your ARX projects to VS2017 (Visual Studio 2017)

Open your ARX Projects in no less than version 15.9 of VS2017 and VS2017 will wizard you to update them to VS2017.


Step 2: Change the header files and library paths to ZRX

  1. Change header files path to ZRX. In project property dialog: [C/C++ -> General -> Additional Include Directories], remove the path refer to ObjectARX and add the path of ZRXSDK\arxport. For example, the path is "D:\ZRXSDK\ arxport". It is shown as the figure below.

    For Windows XP Edition, please change the Preprocessor Definitions, add "WINVER=0x0501;_WIN32_WINNT=0x0501;" as below.

  2. Change the library path to ZRX. In project property dialog: [Linker -> General -> Additional Library Directories], remove old paths refer to ObjectARX and add the path of ZRXSDK\lib, for example, “D: \ZRXSDK\lib-$(Platform)”. It is shown as the figure below.

  3. Make sure the configuration type is "Dynamic Library (.dll)". Modify the file extension of output file from .arx to .zrx in [Configuration Properties -> General -> Output File] as below:

    For Windows XP Edition, please change the Platform Toolset to "Visual Studio 2017 - Windows XP (v141_xp)" as below.

  4. [Linker -> Input -> Additional Dependencies]: Remove old files from ARXSDK and add follow dependency libraries: ZwdUI.lib;ZwAuto.lib;ZWCAD.lib; ZwDatabase.lib; ZwDatabaseMgd.lib;ZwGeometry.lib; ZwRx.lib; ZwUI.lib;ZwZrx.lib;ZwPAL.lib; Added the libs you needed.


Step 3

Step 3: Change other settings

a) Character setting: If you use MBCS in your project, please change to “Use Unicode Character Set” as below [General -> Character Set]:

b) b) Check language setting: If you do not treat wchart_t as Built-in Type in your project, please change [C/C++ -> Language -> Treat wchart_t as Built-in Type] to “Yes (/Zc:wchar_t)” and change [C/C++ -> Language -> Force Conformance in For Loop Scope] to “Yes (/Zc:forScope)” as below:


Step 4

Step 4: Modify the .def file

Open the .def file included in you project (if there is not this file in your project, this step can be skipped, but please make sure that acrxEntryPoint was exported and you needed to change it to zcrxEntryPoint) and modify its content as below:

a) Add .zrx extension after the name of your LIBRARY file

Note: If your DEF just contains EXPORTS, you can skip this step and continue to step b.

b) Change “acrxEntryPoint” and “acrxGetApiVersion” to “zcrxEntryPoint” and “zcrxGetApiVersion”

For example:

If your DEF is like this:

LIBRARY "hwWHKC"

EXPORTS

acrxEntryPoint PRIVATE

acrxGetApiVersion PRIVATE

Please modify it as:

LIBRARY "hwWHKC.zrx"

EXPORTS

zcrxEntryPoint PRIVATE

zcrxGetApiVersion PRIVATE

If your DEF is like this:

EXPORTS

acrxEntryPoint PRIVATE

acrxGetApiVersion PRIVATE

Please modify it as:

EXPORTS

zcrxEntryPoint PRIVATE

zcrxGetApiVersion PRIVATE


Step 5

Step 5: Modify acrxEntryPoint to zcrxEntryPoint in your .CPP file

Note:

Please Make sure that your zcrxEntryPoint is declared as Extern “C” type, for example: extern "C" AcRx::AppRetCode zcrxEntryPoint(AcRx::AppMsgCode msg, void* pkt). Meanwhile, you can’t declare your zcrxEntryPoint as static type.

Otherwise, you ZRX commands will not be recognized.


Unicode Conversion Guide

Unicode Conversion Guide

ZRXSDK for ZWCAD2015 (and later version) has converted to Unicode, so your project may need some modification. This document demonstrates how to convert a MBCS ZRX (or ARX) project to Unicode.


Project Settings

Project Settings

1. The character set of your project need to be changed to “Use Unicode Character Set”.

2. Warning WChar_t as build in type. It means the compiler will warn all the “char” in your source code as wide character.


Source Code

Source Code

1. All the literal strings must be wrapped by the _T() macro. For example:

acutPrintf("HelloWorld"); à acutPrintf(_T("HelloWorld"));

AfxMessageBox("HelloWorld"); à AfxMessageBox(_T("HelloWorld"));

2. Some “char” in your source code should be changed to “TCHAR” or “ACHAR”, according to the scene it used. For example:

char* pszLayerName = NULL;   //this char should be changed to “TCHAR” or “ACHAR”

pLayerTblRcd->getName(pszLayerName);

CString strName(pszLayerName);

ads_free(szLayerName);

szLayerName = NULL;

3. If your ZRX (or ARX) project communicates with other projects or 3rd-party libraries, you should take care of the differences of character set between them. It means when you transfer string between 2 projects, you may need to convert the string’s character set so that it can be correctly recognized.

4. There is an instruction from MSDN tells more details on character set: http://msdn.microsoft.com/en-us/library/windows/desktop/dd374083(v=vs.85).aspx .

5. Following is a table shows the different versions of types and Win32 APIs in different character sets. We suggest you to use the “Generic” version to obtain well compatibility:

Generic | MBCS | UNICODE
TCHAR | char | wchar_t
_TEOF | EOF | WEOF
_TINT | int | wint_t
_TSCHAR | signed char | wchar_t
_TUCHAR | unsigned char | wchar_t
_TXCHAR | char | wchar_t
__T(x) | x | L
__targv | __argv | __wargv
__tcserror | _strerror | __wcserror
__tcserror_s | _strerror_s | __wcserror_s
_cgetts | _cgets | _cgetws
_cgetts_s | _cgets_s | _cgetws_s
_cputts | _cputs | _cputws
_fgettc | fgetc | fgetwc
_fgettc_nolock | _fgetc_nolock | _fgetwc_nolock
_fgettchar | _fgetchar | _fgetwchar
_fgetts | fgets | fgetws
_fputtc | fputc | fputwc
_fputtc_nolock | _fputc_nolock | _fputwc_nolock
_fputtchar | _fputchar | _fputwchar
_fputts | fputs | fputws
_ftprintf | fprintf | fwprintf
_ftprintf_l | _fprintf_l | _fwprintf_l
_ftprintf_p | _fprintf_p | _fwprintf_p
_ftprintf_p_l | _fprintf_p_l | _fwprintf_p_l
_ftprintf_s | fprintf_s | fwprintf_s
_ftprintf_s_l | _fprintf_s_l | _fwprintf_s_l
_ftscanf | fscanf | fwscanf
_ftscanf_l | _fscanf_l | _fwscanf_l
_ftscanf_s | fscanf_s | fwscanf_s
_ftscanf_s_l | _fscanf_s_l | _fwscanf_s_l
_get_tpgmptr | _get_pgmptr | _get_wpgmptr
_gettc | getc | getwc
_gettc_nolock | _getc_nolock | _getwc_nolock
_gettch | _getch | _getwch
_gettch_nolock | _getch_nolock | _getwch_nolock
_gettchar | getchar | getwchar
_gettchar_nolock | _getchar_nolock | _getwchar_nolock
_gettche | _getche | _getwche
_gettche_nolock | _getche_nolock | _getwche_nolock
_getts | gets | _getws
_getts_s | gets_s | _getws_s
_i64tot | _i64toa | _i64tow
_i64tot_s | _i64toa_s | _i64tow_s
_istalnum | isalnum | iswalnum
_istalnum_l | _isalnum_l | _iswalnum_l
_istalpha | isalpha | iswalpha
_istalpha_l | _isalpha_l | _iswalpha_l
_istascii | __isascii | iswascii
_istcntrl | iscntrl | iswcntrl
_istcntrl_l | _iscntrl_l | _iswcntrl_l
_istdigit | isdigit | iswdigit
_istdigit_l | _isdigit_l | _iswdigit_l
_istgraph | isgraph | iswgraph
_istgraph_l | _isgraph_l | _iswgraph_l
_istlower | islower | iswlower
_istlower_l | _islower_l | _iswlower_l
_istprint | isprint | iswprint
_istprint_l | _isprint_l | _iswprint_l
_istpunct | ispunct | iswpunct
_istpunct_l | _ispunct_l | _iswpunct_l
_istspace | isspace | iswspace
_istspace_l | _isspace_l | _iswspace_l
_istupper | isupper | iswupper
_istupper_l | _isupper_l | _iswupper_l
_istxdigit | isxdigit | iswxdigit
_istxdigit_l | _isxdigit_l | _iswxdigit_l
_itot | _itoa | _itow
_itot_s | _itoa_s | _itow_s
_ltot | _ltoa | _ltow
_ltot_s | _ltoa_s | _ltow_s
_puttc | putc | putwc
_puttc_nolock | _putc_nolock | _putwc_nolock
_puttch | _putch | _putwch
_puttch_nolock | _putch_nolock | _putwch_nolock
_puttchar | putchar | putwchar
_puttchar_nolock | _putchar_nolock | _putwchar_nolock
_putts | puts | _putws
_sctprintf | _scprintf | _scwprintf
_sctprintf_l | _scprintf_l | _scwprintf_l
_sctprintf_p | _scprintf_p | _scwprintf_p
_sctprintf_p_l | _scprintf_p_l | _scwprintf_p_l
_sntprintf | _snprintf | _snwprintf
_sntprintf_l | _snprintf_l | _snwprintf_l
_sntprintf_s | _snprintf_s | _snwprintf_s
_sntprintf_s_l | _snprintf_s_l | _snwprintf_s_l
_sntscanf | _snscanf | _snwscanf
_sntscanf_l | _snscanf_l | _snwscanf_l
_sntscanf_s | _snscanf_s | _snwscanf_s
_sntscanf_s_l | _snscanf_s_l | _snwscanf_s_l
_stprintf | sprintf | _swprintf
_stprintf_l | _sprintf_l | __swprintf_l
_stprintf_p | _sprintf_p | _swprintf_p
_stprintf_p_l | _sprintf_p_l | _swprintf_p_l
_stprintf_s | sprintf_s | swprintf_s
_stprintf_s_l | _sprintf_s_l | _swprintf_s_l
_stscanf | sscanf | swscanf
_stscanf_l | _sscanf_l | _swscanf_l
_stscanf_s | sscanf_s | swscanf_s
_stscanf_s_l | _sscanf_s_l | _swscanf_s_l
_tWinMain | WinMain | wWinMain
_taccess | _access | _waccess
_taccess_s | _access_s | _waccess_s
_tasctime | asctime | _wasctime
_tasctime_s | asctime_s | _wasctime_s
_tchdir | _chdir | _wchdir
_tchmod | _chmod | _wchmod
_tcprintf | _cprintf | _cwprintf
_tcprintf_l | _cprintf_l | _cwprintf_l
_tcprintf_p | _cprintf_p | _cwprintf_p
_tcprintf_p_l | _cprintf_p_l | _cwprintf_p_l
_tcprintf_s | _cprintf_s | _cwprintf_s
_tcprintf_s_l | _cprintf_s_l | _cwprintf_s_l
_tcreat | _creat | _wcreat
_tcscanf | _cscanf | _cwscanf
_tcscanf_l | _cscanf_l | _cwscanf_l
_tcscanf_s | _cscanf_s | _cwscanf_s
_tcscanf_s_l | _cscanf_s_l | _cwscanf_s_l
_tcscat | strcat | wcscat
_tcscat_s | strcat_s | wcscat_s
_tcschr | strchr | wcschr
_tcsclen | strlen | wcslen
_tcscmp | strcmp | wcscmp
_tcscnlen | strnlen | wcsnlen
_tcscoll | strcoll | wcscoll
_tcscoll_l | _strcoll_l | _wcscoll_l
_tcscpy | strcpy | wcscpy
_tcscpy_s | strcpy_s | wcscpy_s
_tcscspn | strcspn | wcscspn
_tcsdec | _strdec | _wcsdec
_tcsdup | _strdup | _wcsdup
_tcsdup_dbg | _strdup_dbg |
_tcserror | strerror | _wcserror
_tcserror_s | strerror_s | _wcserror_s
_tcsftime | strftime | wcsftime
_tcsftime_l | _strftime_l | _wcsftime_l
_tcsicmp | _stricmp | _wcsicmp
_tcsicmp_l | _stricmp_l | _wcsicmp_l
_tcsicoll | _stricoll | _wcsicoll
_tcsicoll_l | _stricoll_l | _wcsicoll_l
_tcsinc | _strinc | _wcsinc
_tcslen | strlen | wcslen
_tcslwr | _strlwr | _wcslwr
_tcslwr_l | _strlwr_l | _wcslwr_l
_tcslwr_s | _strlwr_s | _wcslwr_s
_tcslwr_s_l | _strlwr_s_l | _wcslwr_s_l
_tcsnbcnt | _strncnt | _wcsncnt
_tcsncat | strncat | wcsncat
_tcsncat_l | _strncat_l | _wcsncat_l
_tcsncat_s | strncat_s | wcsncat_s
_tcsncat_s_l | _strncat_s_l | _wcsncat_s_l
_tcsnccat | strncat | wcsncat
_tcsnccat_l | _strncat_l | _wcsncat_l
_tcsnccat_s | strncat_s | wcsncat_s
_tcsnccat_s_l | _strncat_s_l | _wcsncat_s_l
_tcsnccmp | strncmp | wcsncmp
_tcsnccnt | _strncnt | _wcsncnt
_tcsnccoll | _strncoll | _wcsncoll
_tcsnccoll_l | _strncoll_l | _wcsncoll_l
_tcsnccpy | strncpy | wcsncpy
_tcsnccpy_l | _strncpy_l | _wcsncpy_l
_tcsnccpy_s | strncpy_s | wcsncpy_s
_tcsnccpy_s_l | _strncpy_s_l | _wcsncpy_s_l
_tcsncicmp | _strnicmp | _wcsnicmp
_tcsncicmp_l | _strnicmp_l | _wcsnicmp_l
_tcsncicoll | _strnicoll | _wcsnicoll
_tcsncicoll_l | _strnicoll_l | _wcsnicoll_l
_tcsncmp | strncmp | wcsncmp
_tcsncoll | _strncoll | _wcsncoll
_tcsncoll_l | _strncoll_l | _wcsncoll_l
_tcsncpy | strncpy | wcsncpy
_tcsncpy_l | _strncpy_l | _wcsncpy_l
_tcsncpy_s | strncpy_s | wcsncpy_s
_tcsncpy_s_l | _strncpy_s_l | _wcsncpy_s_l
_tcsncset | _strnset | _wcsnset
_tcsnextc | _strnextc | _wcsnextc
_tcsnicmp | _strnicmp | _wcsnicmp
_tcsnicmp_l | _strnicmp_l | _wcsnicmp_l
_tcsnicoll | _strnicoll | _wcsnicoll
_tcsnicoll_l | _strnicoll_l | _wcsnicoll_l
_tcsninc | _strninc | _wcsninc
_tcsnlen | strnlen | wcsnlen
_tcsnset | _strnset | _wcsnset
_tcsnset_l | _strnset_l | _wcsnset_l
_tcsnset_s | _strnset_s | _wcsnset_s
_tcsnset_s_l | _strnset_s_l | _wcsnset_s_l
_tcspbrk | strpbrk | wcspbrk
_tcsrchr | strrchr | wcsrchr
_tcsrev | _strrev | _wcsrev
_tcsset | _strset | _wcsset
_tcsset_l |  | _wcsset_l
_tcsset_s | _strset_s | _wcsset_s
_tcsset_s_l | _strset_s_l | _wcsset_s_l
_tcsspn | strspn | wcsspn
_tcsspnp | _strspnp | _wcsspnp
_tcsstr | strstr | wcsstr
_tcstod | strtod | wcstod
_tcstod_l | _strtod_l | _wcstod_l
_tcstoi64 | _strtoi64 | _wcstoi64
_tcstoi64_l | _strtoi64_l | _wcstoi64_l
_tcstok | strtok | wcstok
_tcstok_l | _strtok_l | _wcstok_l
_tcstok_s | strtok_s | wcstok_s
_tcstok_s_l | _strtok_s_l | _wcstok_s_l
_tcstol | strtol | wcstol
_tcstol_l | _strtol_l | _wcstol_l
_tcstoui64 | _strtoui64 | _wcstoui64
_tcstoui64_l | _strtoui64_l | _wcstoui64_l
_tcstoul | strtoul | wcstoul
_tcstoul_l | _strtoul_l | _wcstoul_l
_tcsupr | _strupr | _wcsupr
_tcsupr_l | _strupr_l | _wcsupr_l
_tcsupr_s | _strupr_s | _wcsupr_s
_tcsupr_s_l | _strupr_s_l | _wcsupr_s_l
_tcsxfrm | strxfrm | wcsxfrm
_tcsxfrm_l | _strxfrm_l | _wcsxfrm_l
_tctime | ctime | _wctime
_tctime32 | _ctime32 | _wctime32
_tctime32_s | _ctime32_s | _wctime32_s
_tctime64 | _ctime64 | _wctime64
_tctime64_s | _ctime64_s | _wctime64_s
_tctime_s | ctime_s | _wctime_s
_tdupenv_s | _dupenv_s | _wdupenv_s
_tdupenv_s_dbg | _dupenv_s_dbg | _wdupenv_s_dbg
_tenviron | _environ | _wenviron
_texecl | _execl | _wexecl
_texecle | _execle | _wexecle
_texeclp | _execlp | _wexeclp
_texeclpe | _execlpe | _wexeclpe
_texecv | _execv | _wexecv
_texecve | _execve | _wexecve
_texecvp | _execvp | _wexecvp
_texecvpe | _execvpe | _wexecvpe
_tfdopen | _fdopen | _wfdopen
_tfinddata32_t | _finddata32_t | _wfinddata32_t
_tfinddata32i64_t | _finddata32i64_t | _wfinddata32i64_t
_tfinddata64_t | __finddata64_t | _wfinddata64_t
_tfinddata64i32_t | _finddata64i32_t | _wfinddata64i32_t
_tfinddata_t | _finddata_t | _wfinddata_t
_tfinddatai64_t | _finddatai64_t | _wfinddatai64_t
_tfindfirst | _findfirst | _wfindfirst
_tfindfirst32 | _findfirst32 | _wfindfirst32
_tfindfirst32i64 | _findfirst32i64 | _wfindfirst32i64
_tfindfirst64 | _findfirst64 | _wfindfirst64
_tfindfirst64i32 | _findfirst64i32 | _wfindfirst64i32
_tfindfirsti64 | _findfirsti64 | _wfindfirsti64
_tfindnext | _findnext | _wfindnext
_tfindnext32 | _findnext32 | _wfindnext32
_tfindnext32i64 | _findnext32i64 | _wfindnext32i64
_tfindnext64 | _findnext64 | _wfindnext64
_tfindnext64i32 | _findnext64i32 | _wfindnext64i32
_tfindnexti64 | _findnexti64 | _wfindnexti64
_tfopen | fopen | _wfopen
_tfopen_s | fopen_s | _wfopen_s
_tfreopen | freopen | _wfreopen
_tfreopen_s | freopen_s | _wfreopen_s
_tfsopen | _fsopen | _wfsopen
_tfullpath | _fullpath | _wfullpath
_tfullpath_dbg | _fullpath_dbg | _wfullpath_dbg
_tgetcwd | _getcwd | _wgetcwd
_tgetcwd_dbg | _getcwd_dbg | _wgetcwd_dbg
_tgetdcwd | _getdcwd | _wgetdcwd
_tgetdcwd_dbg | _getdcwd_dbg | _wgetdcwd_dbg
_tgetdcwd_lk_dbg | _getdcwd_lk_dbg | _wgetdcwd_lk_dbg
_tgetdcwd_nolock | _getdcwd_nolock | _wgetdcwd_nolock
_tgetenv | getenv | _wgetenv
_tgetenv_s | getenv_s | _wgetenv_s
_tmain | main | wmain
_tmakepath | _makepath | _wmakepath
_tmakepath_s | _makepath_s | _wmakepath_s
_tmkdir | _mkdir | _wmkdir
_tmktemp | _mktemp | _wmktemp
_tmktemp_s | _mktemp_s | _wmktemp_s
_topen | _open | _wopen
_totlower | tolower | towlower
_totlower_l | _tolower_l | _towlower_l
_totupper | toupper | towupper
_totupper_l | _toupper_l | _towupper_l
_tperror | perror | _wperror
_tpgmptr | _pgmptr | _wpgmptr
_tpopen | _popen | _wpopen
_tprintf | printf | wprintf
_tprintf_l | _printf_l | _wprintf_l
_tprintf_p | _printf_p | _wprintf_p
_tprintf_p_l | _printf_p_l | _wprintf_p_l
_tprintf_s | printf_s | wprintf_s
_tprintf_s_l | _printf_s_l | _wprintf_s_l
_tputenv | _putenv | _wputenv
_tputenv_s | _putenv_s | _wputenv_s
_tremove | remove | _wremove
_trename | rename | _wrename
_trmdir | _rmdir | _wrmdir
_tscanf | scanf | wscanf
_tscanf_l | _scanf_l | _wscanf_l
_tscanf_s | scanf_s | wscanf_s
_tscanf_s_l | _scanf_s_l | _wscanf_s_l
_tsearchenv | _searchenv | _wsearchenv
_tsearchenv_s | _searchenv_s | _wsearchenv_s
_tsetlocale | setlocale | _wsetlocale
_tsopen | _sopen | _wsopen
_tsopen_s | _sopen_s | _wsopen_s
_tspawnl | _spawnl | _wspawnl
_tspawnle | _spawnle | _wspawnle
_tspawnlp | _spawnlp | _wspawnlp
_tspawnlpe | _spawnlpe | _wspawnlpe
_tspawnv | _spawnv | _wspawnv
_tspawnve | _spawnve | _wspawnve
_tspawnvp | _spawnvp | _wspawnvp
_tspawnvpe | _spawnvpe | _wspawnvpe
_tsplitpath | _splitpath | _wsplitpath
_tsplitpath_s | _splitpath_s | _wsplitpath_s
_tstat | _stat | _wstat
_tstat32 | _stat32 | _wstat32
_tstat32i64 | _stat32i64 | _wstat32i64
_tstat64 | _stat64 | _wstat64
_tstat64i32 | _stat64i32 | _wstat64i32
_tstati64 | _stati64 | _wstati64
_tstof | atof | _wtof
_tstof_l | _atof_l | _wtof_l
_tstoi | atoi | _wtoi
_tstoi64 | _atoi64 | _wtoi64
_tstoi64_l | _atoi64_l | _wtoi64_l
_tstoi_l | _atoi_l | _wtoi_l
_tstol | atol | _wtol
_tstol_l | _atol_l | _wtol_l
_tstrdate | _strdate | _wstrdate
_tstrdate_s | _strdate_s | _wstrdate_s
_tstrtime | _strtime | _wstrtime
_tstrtime_s | _strtime_s | _wstrtime_s
_tsystem | system | _wsystem
_ttempnam | _tempnam | _wtempnam
_ttempnam_dbg | _tempnam_dbg | _wtempnam_dbg
_ttmpnam | tmpnam | _wtmpnam
_ttmpnam_s | tmpnam_s | _wtmpnam_s
_ttoi | atoi | _wtoi
_ttoi64 | _atoi64 | _wtoi64
_ttol | atol | _wtol
_tunlink | _unlink | _wunlink
_tutime | _utime | _wutime
_tutime32 | _utime32 | _wutime32
_tutime64 | _utime64 | _wutime64
_ui64tot | _ui64toa | _ui64tow
_ui64tot_s | _ui64toa_s | _ui64tow_s
_ultot | _ultoa | _ultow
_ultot_s | _ultoa_s | _ultow_s
_ungettc | ungetc | ungetwc
_ungettc_nolock | _ungetc_nolock | _ungetwc_nolock
_ungettch | _ungetch | _ungetwch
_ungettch_nolock | _ungetch_nolock | _ungetwch_nolock
_vftprintf | vfprintf | vfwprintf
_vftprintf_l | _vfprintf_l | _vfwprintf_l
_vftprintf_p | _vfprintf_p | _vfwprintf_p
_vftprintf_p_l | _vfprintf_p_l | _vfwprintf_p_l
_vftprintf_s | vfprintf_s | vfwprintf_s
_vftprintf_s_l | _vfprintf_s_l | _vfwprintf_s_l
_vsctprintf | _vscprintf | _vscwprintf
_vsctprintf_l | _vscprintf_l | _vscwprintf_l
_vsctprintf_p | _vscprintf_p | _vscwprintf_p
_vsctprintf_p_l | _vscprintf_p_l | _vscwprintf_p_l
_vsntprintf | _vsnprintf | _vsnwprintf
_vsntprintf_l | _vsnprintf_l | _vsnwprintf_l
_vsntprintf_s | _vsnprintf_s | _vsnwprintf_s
_vsntprintf_s_l | _vsnprintf_s_l | _vsnwprintf_s_l
_vstprintf | vsprintf | _vswprintf
_vstprintf_l | _vsprintf_l | _vswprintf_l
_vstprintf_p | _vsprintf_p | _vswprintf_p
_vstprintf_p_l | _vsprintf_p_l | _vswprintf_p_l
_vstprintf_s | vsprintf_s | vswprintf_s
_vstprintf_s_l | _vsprintf_s_l | _vswprintf_s_l
_vtcprintf | _vcprintf | _vcwprintf
_vtcprintf_l | _vcprintf_l | _vcwprintf_l
_vtcprintf_p | _vcprintf_p | _vcwprintf_p
_vtcprintf_p_l | _vcprintf_p_l | _vcwprintf_p_l
_vtcprintf_s | _vcprintf_s | _vcwprintf_s
_vtcprintf_s_l | _vcprintf_s_l | _vcwprintf_s_l
_vtprintf | vprintf | vwprintf
_vtprintf_l | _vprintf_l | _vwprintf_l
_vtprintf_p | _vprintf_p | _vwprintf_p
_vtprintf_p_l | _vprintf_p_l | _vwprintf_p_l
_vtprintf_s | vprintf_s | vwprintf_s
_vtprintf_s_l | _vprintf_s_l | _vwprintf_s_l
vtprintf_s_l | _vprintf_s_l | _vwprintf_s_l


Trouble shooting

Trouble shooting


Updating from VS2010(VC10) to VS2017(VC15)

Ø Trouble shooting

l Updating from VS2010(VC10) to VS2017(VC15)

a) Cannot be used before initialization

1>d:\8.work\1.code\zwcada_branchs\archzw\swr_archcore\exportfile.cpp(1700): error C3861: “ptr_fun”: The identifier could not be found.

1>d:\8.work\1.code\zwcada_branchs\archzw\swr_archcore\exportfile.cpp(1700): error C3861: “bind1st”: The identifier could not be found.

1>d:\8.work\1.code\zwcada_branchs\archzw\swr_archcore\exportfile.cpp(1701): error C3536: “itFloor”: Cannot be used before initialization.

Please add the header file <functional> to the source file。

b) Execution to the _tfindfirst(), _findclose(), _tfindnext() functions results in an error: 0xC0000005, the program crashes. For example, the following code：

long hand; //the type of hand change from long to long long

hand = _tfindfirst((TCHAR *)sDbfPath, &fb);

if(hand != -1L)

{

bFind = TRUE;

_findclose(hand);

}

You should change the type of hand from long to long long.

c) Error：MFC does not support _WIN32_WINNT less than _WIN32_WINNT_WINXP. For example, the following code：#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0500

#endif

You should mask the code here as follows:

#if _MSC_VER < 1910

#ifndef _WIN32_WINNT

#define _WIN32_WINNT 0x0500

#endif

#endif

d) Error:unresolved external symbol _sprintf

You should do the following:

1) Open project properties: Linker -> Input -> Additional Dependencies, add the library: legacy_stdio_definitions.lib

2) Add the following compilation preprocessing to the source file which reported the error:

#pragma comment (lib, “legacy_stdio_definitions.lib”)


Updating from ARX2008 to ARX 2019

Updating from ARX2008 to ARX 2019

l Updating from ARX2008 to ARX 2019

a) Some functions in ARX2019 add the final keyword (new feature of C++11), so that the interface cannot be overridden by the subclass, which is realized by calling another newly added overloaded function inside the function. For example, the following functions:

ARX2008 | ARX2019
virtual const ACHAR * AcApLayoutManager::findActiveTab () = 0; | virtual const ACHAR * AcApLayoutManager::findActiveTab () final;
virtual ACHAR * AcApLayoutManager::getNextNewLayoutName (AcDbDatabase* useDb = NULL) = 0; | virtual ACHAR * AcApLayoutManager::getNextNewLayoutName (AcDbDatabase* useDb = nullptr) final;
virtual Acad::ErrorStatus AcDbEntity::setColor( const AcCmColor& color, Autodesk::Boolean doSubents = true ); | virtual Acad::ErrorStatus AcDbEntity::setColor( const AcCmColor& color, bool doSubents = true ) final;
ZSOFT_DEPRECATED virtual void beginClose( AcDbDatabase* pDwg ); | ZSOFT_DEPRECATED virtual void beginClose( AcDbDatabase* ) final;
More | More

If you use these functions in your code, please modify your code. accordingly.

b) Add the delete keyword to some functions in ARX2019 (new feature in C++11) and disable the use of functions generated by default by the compiler, for example:

ARX2008 | ARX2019
AcDbIdMapping::AcDbIdMapping( const AcDbIdMapping& ); | AcDbIdMapping::AcDbIdMapping( const AcDbIdMapping& ) = delete;
AcDbIdMapping& AcDbIdMapping::operator= ( const AcDbIdMapping& ); | AcDbIdMapping& AcDbIdMapping::operator= ( const AcDbIdMapping& ) = delete;
AcDbEntity::AcDbEntity ( const AcDbEntity& ); | AcDbEntity::AcDbEntity ( const AcDbEntity& ) = delete;
More | More

If you use these functions in your code, please modify your code accordingly.

c) ARX2019 changes the access of some functions from public to protected, and adds the sub string at the beginning of the function name, for example:

ARX2008 | ARX2019
public: virtual Acad::ErrorStatus AcDbAttributeDefinition:: getClassID( CLSID* pClsid )const; | protected: virtual Acad::ErrorStatus AcDbAttributeDefinition:: subGetClassID( CLSID* pClsid ) const override;
public: virtual Adesk::UInt32 AcDbCamera:: setAttributes( AcGiDrawableTraits* pTraits ); | protected: virtual Adesk::UInt32 AcDbCamera:: subSetAttributes( AcGiDrawableTraits* pTraits ) override;
public: virtual Acad::ErrorStatus AcDbText::getClassID( CLSID* pClsid ) const; | protected: virtual Acad::ErrorStatus AcDbText::subGetClassID( CLSID* pClsid ) const override;
More | More

If you use these functions in your code, please modify your code accordingly.

d) ARX2019 changes the returned value of resourceInstance() from HINSTANCE to AcRxResourceInstance&, for example：

virtual const HINSTANCE resourceHandle() const = 0;

->virtual const AcRxResourceInstance& resourceInstance() const = 0;

If used resourceHandle() in your code, you need to change the returned value.

e) ARX2019 changes the parameter of the acdbValidateSetup() function from Adesk::Int32 to const AcLocale&, for example：

Acad::ErrorStatus acdbValidateSetup(Adesk::Int32 lcid);

-> Acad::ErrorStatus acdbValidateSetup(const AcLocale& loc);

If used acdbValidateSetup() in your code, you need to change the parameter.

f) ARX2019 changes the parameter of the dxfout() function in the AcDbObject class from Adesk::uchar* to const AcDbObjectIdArray *，for example：

Acad::ErrorStatus  AcDbObject::dxfOut(ZcDbDxfFiler* pFiler,
Adesk::Boolean allXdFlag, Adesk::uchar*
regAppTable) const;

->Acad::ErrorStatus AcDbObject::dxfOut(AcDbDxfFiler* pFiler, bool allXdata, const AcDbObjectIdArray * pRegAppIds) const;

If used dxfout() in your code, you need to change the parameter.

g) ARX2019 changes parameter of some function from HardwareFeature to const AcUniqueString*, for example：

ARX2008 | ARX2019
virtual bool AcGsConfig::isFeatureEnabled ( HardwareFeature feature ) = 0; | virtual bool AcGsConfig::isFeatureEnabled ( const AcUniqueString* ) const = 0;
virtual void AcGsConfig::setFeatureEnabled ( HardwareFeature feature, bool bEnable = true ) = 0; | virtual void AcGsConfig::setFeatureEnabled ( const AcUniqueString*, bool bEnable = true ) = 0;
More | More

If used these functions in your code, you need to change the parameter.

h) ARX2019 adds parameter AcDbDatabase* pDb = NULL(AcDbDatabase* pDb = nullptr) to some functions, for example:

ARX2008 | ARX2019
virtual Acad::ErrorStatus AcDbLayoutManager::setCurrentLayout( const ACHAR * newname ) = 0; | virtual Acad::ErrorStatus AcDbLayoutManager::setCurrentLayout( const ACHAR * newname, AcDbDatabase* pDb = NULL ) = 0;
virtual AcDbObjectId AcDbLayoutManager::getActiveLayoutBTRId () = 0; | virtual AcDbObjectId AcDbLayoutManager::getActiveLayoutBTRId ( const AcDbDatabase* pDb = NULL ) = 0;
virtual const ACHAR * AcDbLayoutManager::findActiveLayout ( bool allowModel ) = 0; | virtual const ACHAR * AcDbLayoutManager::findActiveLayout( bool allowModel, const AcDbDatabase* pDb = nullptr ) final;
More | More

If used these functions in your code, you need to take care of the new parameter.

i) ARX2019 adds an int parameter to some functions, for example：

ARX2008 | ARX2019
static int AdCharFormatter::isNativeToCodePage( wchar_t wch, unsigned nCodePage, char *pChNative = NULL ) | static int AdCharFormatter::isNativeToCodePage( wchar_t wch, unsigned nCodePage, char *pChNative, int bufferLen );
virtual Acad::ErrorStatus AcDbPolyline::addVertexAt( unsigned int index, const AcGePoint2d& pt, double bulge = 0., double startWidth = -1., double endWidth = -1 ); | virtual Acad::ErrorStatus addVertexAt( unsigned int index, const AcGePoint2d& pt, double bulge = 0., double startWidth = -1., double endWidth = -1., Adesk::Int32 vertexIdentifier = 0 );
static Acad::ErrorStatus AcDbRasterImageDef::suggestName( AcDbDictionary* pImageDictionary, const ACHAR* pNewImagePathName, ACHAR* newImageName ); | static Acad::ErrorStatus AcDbRasterImageDef::suggestName( AcDbDictionary* pImageDictionary, const ACHAR* pNewImagePathName, ACHAR* newImageName, size_t nSize );
More | More

If used these functions in your code, you need to add an int parameter.

j) ARX2019 adds a bool parameter to some functions, for example：

ARX2008 | ARX2019
static AcDbEntity* AcDbPointRef::subentPtr( const AcDbFullSubentPath& objPath, bool& isCloned, bool& reverseArc ); | static AcDbEntity* AcDbPointRef::subentPtr( const AcDbFullSubentPath& objPath, bool& isCloned, bool& reverseArc, bool& isStandAloneArc );
void AcGeCurve3d::getSamplePoints( double fromParam, double toParam, double approxEps, AcGePoint3dArray& pointArray, AcGeDoubleArray& paramArray ) const; | void AcGeCurve3d::getSamplePoints( double fromParam, double toParam, double approxEps, AcGePoint3dArray& pointArray, AcGeDoubleArray& paramArray, bool forceResampling = false ) const;
More | More

If used these functions in your code, you need to add a bool parameter.

k) ARX2019 changes the returned value and parameter of findLayoutNamed() function in AcDbLayoutManager class, for example:

virtual AcDbLayout * AcDbLayoutManager::findLayoutNamed (const ACHAR * name, bool leaveRecordOpen = false) = 0;

-> virtual AcDbObjectId AcDbLayoutManager::findLayoutNamed (const ACHAR* name, const AcDbDatabase* pDb = NULL) = 0;

If you use this functions in your code, please modify your code accordingly.

l) ARX2019 adds const to partial function return values, for example：

ARX2008 | ARX2019
virtual ACHAR * AcDbHostApplicationServices::getAlternateFontName() const; | virtual const ACHAR * AcDbHostApplicationServices::getAlternateFontName() const;
virtual ACHAR * AcDbHostApplicationServices::getFontMapFileName() const; | virtual const ACHAR * AcDbHostApplicationServices::getFontMapFileName() const;
AcDbVoidPtrArray* reactors(); | const AcDbVoidPtrArray* reactors() const
More | More

If you use these functions in your code, you need to change the type of variable that receives the return value or cast it, as shown below:

AcDbVoidPtrArray *pReactors = NULL;

pReactors = pReactor->reactors();

change to

const AcDbVoidPtrArray *pReactors = NULL;

pReactors = pReactor->reactors();

or

AcDbVoidPtrArray *pReactors = NULL;

pReactors = (AcDbVoidPtrArray*)pEnt->reactors();

m) Some function parameter types in ARX2019 change from LPCTSTR to const wchar_t*, from LPTSTR to wchar_t*, from TCHAR to wchar_t*, from ZTCHAR to wchar_t*, for example：

ARX2008 | ARX2019
virtual PathErr Parse( LPCTSTR, const BOOL wildcard_ok = FALSE ); | virtual PathErr Parse( const wchar_t* , bool wildcard_ok = false ) override;
bool CAdUiPathname::GetFullPath( LPTSTR pBuf, size_t strBuffLen ) const; | bool CAdUiPathname::GetFullPath( wchar_t * pBuf, size_t strBuffLen ) const;
bool acedLoadPartialMenu( const TCHAR* pszMenuFile ); | bool acedLoadPartialMenu( const wchar_t* pszMenuFile );
BOOL CAcUiPathname::Open( IZwFile** fdp, const ACHAR *openmode ); | bool CAcUiPathname::Open( IZwFile** fdp, const wchar_t *openmode );
More | More

Since the project USES Unicode character set, LPCTSTR is equivalent to const wchar_t*, LPTSTR is equivalent to wchar_t*, TCHAR* is equivalent to wchar_t*, and the typedef wchar_t ZTCHAR is also equivalent to wchar_t*.

n) ARX2019 changes the parameter of some functions from __time64_t& to Adesk::Time64&, for example：

ARX2008 | ARX2019
AcFdFieldValue::ZcFdFieldValue( const __time64_t& date ); | AcFdFieldValue::ZcFdFieldValue( const Adesk::Time64& date );
AcValue& ZcValue::operator= ( __time64_t date ); | AcValue& ZcValue::operator= ( Adesk::Time64 date );
More | More

If you use these functions in your code, you need to change the argument type from __time64_t& to Adesk::Time64&

o) ARX2019 changes the parameter of some functions from SYSTEMTIME& to std::tm&

AcFdFieldValue::AcFdFieldValue(const SYSTEMTIME& date);

->AcFdFieldValue::AcFdFieldValue(const std::tm& date);

If you use these functions in your code, you need to change the parameter type from SYSTEMTIME& to std ::tm&, but SYSTEMTIME to milliseconds and std ::tm to seconds.

p) The getElemAt() function for AcGiVariant in ARX2019 removes the parameter AcGiVariant & and changes the return value to AcGiVariant*, as shown below：

Acad::ErrorStatus AcGiVariant::getElemAt(int, ACHAR*&, AcGiVariant &) const

->AcGiVariant* AcGiVariant::getElemAt(int, ACHAR*&) const

If your code USES the getElemAt() function, you need to change the parameters passed and the type of return value received.

q) ARX2019 changes the function parameter type is from int to enumeration type, for example:

ARX2008 | ARX2019
virtual Acad::ErrorStatus AcGiTextStyle::setFont( const ACHAR * pTypeface, Adesk::Boolean bold, Adesk::Boolean italic, int charset, int pitchAndFamily ); | Virtual Acad::ErrorStatus AcGiTextStyle::setFont( const ACHAR * pTypeface, Adesk::Boolean bold, Adesk::Boolean italic, Charset charset, Autodesk::AutoCAD::PAL::FontUtils::FontPitch pitch, Autodesk::AutoCAD::PAL::FontUtils::FontFamily family );
virtual Acad::ErrorStatus AcGiTextStyle::font( ACHAR *& pTypeface, Adesk::Boolean& bold, Adesk::Boolean& italic, int& charset, int& pitchAndFamily ) const; | virtual Acad::ErrorStatus AcGiTextStyle::font( ACHAR *& pTypeface, bool& bold,bool& italic, Charset& charset, Autodesk::AutoCAD::PAL::FontUtils::FontPitch& pitch, Autodesk::AutoCAD::PAL::FontUtils::FontFamily& family ) const final;
AcString::AcString( int nCtorFlags, unsigned nArg ); | AcString::AcString( eFormat nCtorFlags, unsigned nArg );
More | More

If you use these functions in your code, you need to modify your code accordingly, for example：

int bBold, bItalic;

int tmp0, tmp1;

BOOL bWinFont = (m_textStyle.font(pTypeface, bBold, bItalic, tmp0, tmp1) == Acad::eOk);

Change to

bool bBold, bItalic;

Charset charset;

Autodesk::AutoCAD::PAL::FontUtils::FontPitch pitch;

Autodesk::AutoCAD::PAL::FontUtils::FontFamily family;

BOOL bWinFont = (m_textStyle.font(pTypeface, bBold, bItalic, charset, pitch, family) == Acad::eOk);

r) Add the parameter AcGsGraphicsKernel &kernel to some functions in ARX2019, for example：

ARX2008 | ARX2019
virtual AcGsModel* AcGsManager::createAutoCADModel (void) = 0; | virtual AcGsModel* AcGsManager::createAutoCADModel ( AcGsGraphicsKernel &kernel ) = 0;
virtual AcGsView* AcGsManager::createAutoCADViewport( AcDbViewportTableRecord *vp ) = 0; | virtual AcGsView* AcGsManager::createAutoCADViewport( AcGsGraphicsKernel &kernel, AcDbViewportTableRecord *pVTR ) = 0;
virtual AcGsView* AcGsManager::createAutoCADView( AcGiDrawable * drawable )= 0; | virtual AcGsView* AcGsManager::createAutoCADView( AcGsGraphicsKernel &kernel, AcGiDrawable *pDrawable )= 0;
More | More

Because some functions of AcGsManager have changed, getGSClassFactory() no longer exists, the AcGsGraphicsKernel class has replaced the AcGsClassFactory class, and GS functions such as createAutoCADModel also need to specify a specific kenel to create. Get kernel method by previous：

AcGsGraphicsKernel *pKernel = pGsManager->getGSClassFactory();

Change to:

AcGsKernelDescriptor descriptor;

descriptor.addRequirement(AcGsKernelDescriptor::k3DDrawing);

AcGsGraphicsKernel *pKernel = AcGsManager::acquireGraphicsKernel(descriptor);

But because AcGsKernelDescriptor class and AcGsManager: : acquireGraphicsKernel method internal implementation has not been completed, so the ZWCAD still use the original method:

AcGsGraphicsKernel* kernel= pGsManager ->getGSClassFactory();

Get and use the kernel, and you cannot create Model, Device, View, and so on with the specified kernel.The internal implementation of GS functions such as createZWCADModel(ZcGsGraphicsKernel &kernel) still follows the original logic, and the incoming kernel parameters are not used.

s) Some functions in RX2019 add a return value, for example：

ARX2008 | ARX2019
void AcString::formatV( const ACHAR *pszFmt, va_list args ); | AcString & ZcString::formatV( const ACHAR *pszFmt, va_list args );
void CAdUiOwnerDrawButton::SetBitmapOffsets( int nBorderOffset, int nFocusRectOffset ); | bool CAdUiOwnerDrawButton::SetBitmapOffsets( int nBorderOffset, int nFocusRectOffset );
void AcDbDatabase::addReactor( AcDbDatabaseReactor* pReactor ) const; | Acad::ErrorStatus AcDbDatabase::addReactor( AcDbDatabaseReactor* pReactor ) const;
More | More

If you use these functions in your code, you can define variables to receive their return values。

t) ARX2019 changes the parameter of some functions from CString& to AcString&

ARX2008 | ARX2019
void CAdUiPathname::GetFilename( CString& ) const; | void CAdUiPathname::GetFilename( AcString& ) const;
void CAdUiPathname::GetExtension( CString& ) const; | void CAdUiPathname::GetExtension( AcString& ) const;
Acad::ErrorStatus formatMeasurement( ACHAR *MTextContentBuffer, double measurement, ACHAR *dimensionText ); | Acad::ErrorStatus formatMeasurement( AcString & sMTextContent, double measurement, const ACHAR *dimensionText = nullptr );
AcDbField::EvalStatus AcDbField::evaluationStatus(int* pnErrCode = NULL, ACHAR ** pszErrMsg = NULL ) const; | AcDbField::EvalStatus AcDbField::evaluationStatus( int* pnErrCode , AcString * pszErrMsg ) const;
More | More

If you use these functions in your code, you need to change the parameter type to Acstring.

u) ARX2019 removes arguments from some functions, for example：

ARX2008 | ARX2019
AcadApp::ErrorStatus AcadAppInfo::writeToRegistry( bool bObjDbx = false, bool skipHKLM = false ); | AcadApp::ErrorStatus AcadAppInfo::writeToRegistry();
AcadApp::ErrorStatus AcadAppInfo::delFromRegistry( bool bObjDbx = false ); | AcadApp::ErrorStatus AcadAppInfo::delFromRegistry();
virtual bool AcGsConfig::configure ( const ACHAR * pszConfigInfo, bool bShowDialog ) = 0; | virtual bool AcGsConfig::configure (void) = 0;
More | More

If you use these functions in your code, you need to remove the arguments as they change。

v) In ARX2019, add and delete const modifiers for function parameters

ARX2008 | ARX2019
Acad::ErrorStatus AcDbGroup::prepend( AcDbObjectIdArray ids ); | Acad::ErrorStatus AcDbGroup::prepend( const AcDbObjectIdArray & ids );
Acad::ErrorStatus AcDbGroup::insertAt( Adesk::UInt32 idx, AcDbObjectIdArray ids ); | Acad::ErrorStatus AcDbGroup::insertAt( Adesk::UInt32 idx, const AcDbObjectIdArray & ids );
Acad::ErrorStatus AcDbPlotSettings::setShadePlot ( const AcDbPlotSettings::ShadePlotType type, const AcDbObjectId shadePlotId); | Acad::ErrorStatus AcDbPlotSettings::setShadePlot ( AcDbPlotSettings::ShadePlotType type, AcDbObjectId shadePlotId );
More | More

If you use these functions in your code, add or remove the const modifiers to the passed arguments depending on the changes.

w) ARX2019 changes the parameter of the acquireString() function in AcEdJig from a pointer to a pointer array, as shown below：

DragStatus AcEdJig::acquireString(ACHAR* str);

-> DragStatus ZcEdJig::acquireString(ACHAR* (&str)[2049]);

If your code use this interface, the code needs to be modified as shown below：

TCHAR KWord[20]

acquireString(KWord);

Change to:

TCHAR KWord[2049];

acquireString(KWord);

x) The return value of the function pointer has been modified in ARX2019, as shown below：

typedef BOOL (*AcedFilterWinMsgFn)(MSG*)

->typedef bool (*AcedFilterWinMsgFn)(MSG*)

bool acedRegisterFilterWinMsg(const AcedFilterWinMsgFn pfn);

bool acedRemoveFilterWinMsg(const AcedFilterWinMsgFn pfn);

If your code use the acedRegisterFilterWinMsg() and acedRemoveFilterWinMsg() interfaces, you need to change the parameter type from a BOOL to a bool, as shown below：

static BOOL MouseMoveMonitor(MSG* msg)

->static bool MouseMoveMonitor(MSG* msg) acedRegisterFilterWinMsg(MouseMoveMonitor);

acedRemoveFilterWinMsg(MouseMoveMonitor);

y) Some classes in ARX2019 add pure virtual functions, such as the AcGiGeometry class:：

virtual AcGeMatrix3d pushPositionTransform (AcGiPositionTransformBehavior behavior, const AcGePoint3d& offset) = 0;

virtual AcGeMatrix3d pushScaleTransform (AcGiScaleTransformBehavior

behavior, const AcGePoint3d& extents) = 0;

virtual AcGeMatrix3d pushOrientationTransform

(AcGiOrientationTransformBehavior behavior) = 0;

If you have a class in your code that derives from the AcGiGeometry class, you need to add a new pure virtual function implementation to the derived class.

z) ARX2019 remove some interfaces, for example:

AcGiVisualStyle:: faceStyle();

AcGiVisualStyle:: edgeStyle ();

AcGiVisualStyle:: displayStyle ();

int acedFindFile (const ACHAR *fname, ACHAR *result);

int acedGetEnv (const ACHAR *sym, ACHAR *var);

int acedGetCfg (const ACHAR *sym, ACHAR *var);

If any of the above interfaces are used in your code, please delete the code or use another interface instead。

aa) ARX2019 changes the parameter of readDwgFile () function in AcDbDatabase class, for example:

Acad::ErrorStatus readDwgFile(const ACHAR* fileName,

const int shmode = _SH_DENYWR,

bool bAllowCPConversion = false,

const wchar_t* wszPassword = nullptr);

-> Acad::ErrorStatus readDwgFile(const ACHAR* fileName,

const int shmode /*= _SH_DENYWR*/,

bool bAllowCPConversion = false,

const wchar_t* wszPassword = nullptr);

If you have use readDwgFile()，you need to check and change the code accordingly.

bb) ARX2019 changes the definition of Adesk::Boolean.

ARX2008：typedef int Boolean

ARX2019: typedef bool Boolean

Since both readItem() and writeItem implementations read and write only one bit. if you have use readItem(int) and writeItem(int) in the code, you can solve the problem by the following example:

readItem(int);

writeItem(int)

->readItem(Adesk::Boolean);

writeItem(Adesk::Boolean)

cc) ARX2019 changes the parameters of the interface acedSSLength()

ARX2008: int acedSSLength (const ads_name sname, long *len);

ARX2019: int acedSSLength (const ads_name sname, AdInt32 *len);

If you have used acedSSLength ()，you need to check and change the code accordingly.

dd) ARX2019 changes the header file of acdbGetPreviewBitmapFromDwg().

ARX2008: include<dbxutil.h>

ARX2019: include<acdbimageutils.h>

If you have used this interface, you need to change the header file .

ee) ARX2019 no longer defines macros MAKE_ACDBOPENOBJECT_FUNCTION, you need to use acdbOpenObject instead.

ARX2008: MAKE_ACDBOPENOBJECT_FUNCTION

ARX2019: acdbOpenObject