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() и без условий, вдруг получится ?
|
|
Shagg |
Отправлено: 06.07.2006, 08:59 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 69
|
да тут дело не в условиях
функции грузятся и запускаются нормально
просто мне нужно правильно передать в дллку указатель на объект
кстати а может нужно передавать абсолютнгый указатель?
кто нить знает как это сделать??? |
|
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 *) |
|