C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Куда уходят объекты...
Shagg
  Отправлено: 06.07.2006, 08:21


Дежурный стрелочник

Группа: Участник
Сообщений: 69



Люди помогите кто может
У меня есть дллка, в которой объявлен указатель на TADOQuery, для того,чтоб работать с бд.
при инициализации я передаю в длл указатель на ADOQuery, расположенный на форме
но любое последующее обращение к ADOQuery выдает аксесс виолейшн
почему???
ShibaOn
Отправлено: 06.07.2006, 08:26


Дежурный стрелочник

Группа: Участник
Сообщений: 37



А какие действия с объектом выполняет dll на настоячий момент? Может быть она освобождает его?
ShibaOn
Отправлено: 06.07.2006, 08:27


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Приведи код проги и dll, который отвечает за передачу указателя в в dll.
Shagg
Отправлено: 06.07.2006, 08:38


Дежурный стрелочник

Группа: Участник
Сообщений: 69



в dll
CODE

struct TInitData
{
 TADOQuery *iADOQuery;
............
}

__declspec(dllexport) void Init(TInitData *InitData)
{
 ADOQuery    = InitData->iADOQuery;
..........
}

__declspec(dllexport) void Load()
{
.........
 ADOQuery->SQL->Clear();
 ADOQuery->SQL->Add("select * from table1");
 ADOQuery->Open();
 ADOQuery->First();
.........
}

в exe
CODE

typedef void (*pfvvFunc) (void);
typedef void (*pinitFunc) (TInitData *InitData);

{
.....
 hLibHandle = NULL;
 hLibHandle = LoadLibrary("examtpl.dll");

 TInitData *InitData = new TInitData();

 InitData->iADOQuery = ADOQuery;

 pinitFunc fInit = (pinitFunc)GetProcAddress(hLibHandle, "_Init");
 pfvvFunc fLoad = (pfvvFunc)GetProcAddress(hLibHandle, "_Load");

 if (fInit) (*fInit)(InitData);
 if (fLoad) (*fLoad)();
}

в том то и дело, что объект я не разрушаю
даже обращение к ADOQuery после строки " ADOQuery = InitData->iADOQuery;" выдает ошибку
ShibaOn
Отправлено: 06.07.2006, 08:56


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Ты пробовал отключать/включать RTL, Buid With Runtime Packages попробуй поменять. А вобще меня смутило:

CODE

(fInit) (*fInit)(InitData);
(fLoad) (*fLoad)();


Наврятли тут косяк есть, если код внутри void Init(TInitData *InitData) выполняется, но все таки попробуй fInit(InitData) и fLoad() и без условий, вдруг получится ? smile.gif
Shagg
Отправлено: 06.07.2006, 08:59


Дежурный стрелочник

Группа: Участник
Сообщений: 69



да тут дело не в условиях
функции грузятся и запускаются нормально
просто мне нужно правильно передать в дллку указатель на объект

кстати а может нужно передавать абсолютнгый указатель? wink.gif
кто нить знает как это сделать???
ShibaOn
Отправлено: 06.07.2006, 09:26


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Дык, ты итак абсолютный передаешь. Попробуй передать указатель на чило какое-нибудь, и проверь ShowMessage'ем в dll-ке правильный ли указатель получен.
ShibaOn
Отправлено: 06.07.2006, 09:27


Дежурный стрелочник

Группа: Участник
Сообщений: 37



RTL пробовал вырубать?
olegenty
Отправлено: 06.07.2006, 09:31


Ветеран

Группа: Модератор
Сообщений: 2412



1. Как собраны DLL и EXE? Build With Runtime Packages, или нет? Должны быть собраны именнт Build With Runtime Packages, при этом если используемый пакет (*.bpl) эксплуатируется и EXE и DLL, то он должен динамически собираться с обоими модулями.
2. Use Dynamic RTL? Должно быть ДА для EXE и DLL.
Shagg
Отправлено: 06.07.2006, 11:13


Дежурный стрелочник

Группа: Участник
Сообщений: 69



усе нормально разобрался
оказывается просто
CODE

ADOQuery = InitData.ADOQuery;

не проходит указатель ADOQuery получает какойто левый адрес
а вызов
CODE

ADOQuery    = &(*(InitData->iADOQuery));

работает без проблем
Shagg
Отправлено: 06.07.2006, 11:14


Дежурный стрелочник

Группа: Участник
Сообщений: 69



ЗЫ:: собираются Build With Runtime Packages — NO, Use Dynamic RTL — Yes

всем спасибо тема закрыта
Shagg
Отправлено: 06.07.2006, 11:20


Дежурный стрелочник

Группа: Участник
Сообщений: 69



а сорри еще один вопрос...
в той же дллке динамически создаются лэйблы и бросаются наформу проги
так вот каждому лэйблу нужно повесить событие OnClick причем событие должно быть реализовано в длл
как это сделать не подскажете???
olegenty
Отправлено: 06.07.2006, 12:05


Ветеран

Группа: Модератор
Сообщений: 2412



Label->OnClick = YourDLLMethod
Shagg
Отправлено: 06.07.2006, 12:16


Дежурный стрелочник

Группа: Участник
Сообщений: 69



ругается что не может сконвертить в
void (_fastcall * (_closure )(TObject *))(TObject *)

Вернуться в Вопросы программирования в C++Builder