Автор статьи: Емельянов Максим
Иногда в проекте требуется написать модуль не на кларионе, а на с++.
Также иногда требуется в 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();