Здравствуйте.
Столкнулся со следующей проблемой. Есть программа написанная на 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 (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-ку. Если кто понял
мою проблему, пожалуйста помогите.
Заранее благодарен.