Как обратиться к глобальным данным dll из CPP

Автор статьи: Емельянов Максим

Иногда в проекте требуется написать модуль не на кларионе, а на с++.
Также иногда требуется в exe не только вызвать процедуру из dll, но и
обратиться к глобальным данным dll. Если мы пишем на кларионе (или на
с++ в среде того же MSVC++6.0), компилятор сам правильно генерит код
обращения к этим данным. Но что делать, если нужно обратиться из кода
на c++ к глобальным данным dll?
Предлагаю решение, которое давно
используется, и, возможно, будет для кого-либо полезным. Изначально
это было сделано для того, чтобы опращаться по одному и тому же
идентификатору к одним данным как в dll, так и в exe, например в тех
же макросах, да и процедурах.
Описывать все буду на реальном примере.

Поехали.

! Структура, которую мы хотим использовать и в exe и в dll
! (в коде на c++)
DllDataType  Group,Pre(),TYPE ! Defines объявить CLA_DLL и CLA_EXE в
 dll и exe соответственно.

 Теперь, обратившись к DllData->ProgramPath мы получим:
 в dll:
 Обращение к _$DLLDATA, которая является нашим указателем на структуру
 $DLLDATA (так эту кларионовскую переменную видно из си).

 в exe:
 Обращение к $DLLDATA, которую сам кларион трактует как указатель на
 структуру в dll,
 т.е. в обоих случаях получается правильное обращение по одному и тому
 же имени переменной.

 С массивами все точно так же:
class TCommPlayer;

#ifdef  CLA_DLL
extern TCommPlayer *$COMMS[8];// claglobal
extern TCommPlayer *(*_$COMMS)[8];// cppinternal
#define Comms _$COMMS
#else
#ifdef  CLA_EXE
extern TCommPlayer *(*$COMMS)[8];// claglobal,external
#define Comms $COMMS
#else
#error !!! Error: EXE/DLL module type not specified !!!
#endif  // CLA_EXE
#endif  // CLA_DLL
#define COMM(i) ((*Comms)[i])

 Обращение:
 COMM(i)->OpenAndInit();