| 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 *)  | 
  |