Передать в DLL указатели на проперти.
От: Аноним  
Дата: 30.04.10 10:53
Оценка:
Здравствуйте.
Столкнулся со следующей проблемой. Есть программа написанная на C++Builder 6 и ddl-ка написанная на C++Builder 5.
в dll-ке написаны функции для печати разного рода отчетов. Из программы эти функции вызываются и, помимо прочих параметров,
в эти функции передаются указатели на заполненные DataSet-ы. В dll-ке при генерации отчетов используются свойства и методы
DataSet-ов, передаваемых из основной программы, такие как First(),Next(),Eof,RecordCount и.т.д.

Раньше основная программа была написана на C++Builder5 как и dll-ка и проблем не возникало. При переносе программы на 6ю
версию возникла следующая проблема: Описание класса TDataSet в 6 версии расширено новыми методами и свойствами. Причем, что
немного удивило, новые свойства добавлены не в конец старых а прям в середину. Из-за этого часть методов в dll-ке работает
правильно, а другая часть приводит к падениям с Асекс виалейшн.

Было принято такое решение, создать некую структуру, которую передавать в dll-ку. А внутри структуры записывать адреса свойств
и методов DataSet-а из основной программы(6-ой версия). При этом внутри dll-ки заменить все обращения вида:
pDataSet->Open(),pDataSet->Eof,pDataSet->Next() и.т.д. на обращения к соответствующим полям новой структуры.

С передачей функций я разобрался и выглядит это следующим образом:

Описание структуры:
typedef void __fastcall (__closure *PPCLOSE)(void);
typedef void __fastcall (__closure *PPNEXT)(void);
typedef void __fastcall (__closure *PPFIRST)(void);

struct forDS1
{
int* RecordCount;
int* Tag;
bool* Eof;
TFields* Fields;

PPCLOSE Close;
PPNEXT Next;
PPFIRST First;
};


Заполнение в основной программе:
typedef void (pascal *PREPEAR_FUNCTION)(forDS1);
PREPEAR_FUNCTION PatchFunc;
PatchFunc = (PREPEAR_FUNCTION)GetProcAddress(DllHandle,"getDSStruct");

forDS1 xxx;
xxx.Close = ADOQ->Close;
PatchFunc(xxx); // Передача структуры в dll



Код из dll
extern "C" void __declspec(dllexport) pascal getDSStruct(forDS1 x)
{
fDS1 = x;
fDS1.Close();
}

Вообщем такой синтаксис передачи функций в dll-ку и вызов их внутри нее нормально работает.
Не могу понять как правильно описать(синтаксис) аналогичную передачу свойств в dll-ку. Если кто понял
мою проблему, пожалуйста помогите.
Заранее благодарен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.