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

 
DLL & VCL, VCL компоненты в DLL
mxn
  Отправлено: 05.10.2006, 09:40


Ученик-кочегар

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



Подскажите пожалуйста КАК можно использовать в DLL, в котором нет форм, не визуальные компоненты VCL (например TADOConnection, TADOCommand) ??? Смутно догадываюсь, что для этого в качестве контейнера надо использовать DataModule... Но КАК??? И почему он создается как DataModule2 ? А где DataModule1 ?
olegenty
Отправлено: 05.10.2006, 09:43


Ветеран

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



использовать можно где и как угодно.

а какая тебе разница, с каким именем эксперт создаёт модуль, ты же его всё равно переименуешь в то, что тебе нужно?
mxn
  Отправлено: 05.10.2006, 12:13


Ученик-кочегар

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



Создаю DLL c функцией, которая при вызове просто показывает мессагу. Делаю динамическое связывание в проге. Вызываю функцию — все отлично, мессага вылезает. Добавляю в DLL DataModule. На DataModule бросаю ADOCommand. В той же самой функции дописываю:

DataModule->ADOCommand->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\DownLoad\DLL\db1.mdb";

DataModule->ADOCommand->CommandText = "CREATE table TestTable(ID Counter, Field_1 integer)";

DataModule->ADOCommand->Execute();

DLL компилируется без ошибок.

Вызываю из проги — вылезает месага, а потом Access Violation...

Подскажите пожалуйста, где ошибка???
olegenty
Отправлено: 05.10.2006, 12:23


Ветеран

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



экземпляр модуля данных кто за тебя создаст?
mxn
Отправлено: 05.10.2006, 12:29


Ученик-кочегар

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



Извините за назойливость, уважаемый olegenty, не могли бы вы поподробнее растолковать начинающему что значит создать экземпляр модуля данных и как это сделать? Я только смутно догадываюсь, информации толковой найти не смог...
gvg
Отправлено: 05.10.2006, 12:37


Машинист паровоза

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



что ж тут непонятного? То, что datamodule описан в исходниках dll-ки не означает, что он существует. Надо его создать

TDataModule2 *dm = new TDataModule2();
olegenty
Отправлено: 05.10.2006, 13:04


Ветеран

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



да как тебе сказать... модуль данных — это КЛАСС. для его использования тебе наобходимо что? правильно — переменная.

когда ты создаешь приложение, эксперт билдера ЗА ТЕБЯ создаёт код инициализации глобальных экземпляров классов форм, модулей данных, etc, посредством вызова метода Application->CreateForm в главном модуле приложения. это тебя расслабляет (а управляется через Project->Options->Forms).

с DLL история совсем другая. в DLL эксперт за тебя НИЧЕГО не создаёт. ты добавляешь модуль данных, появляется его определение, реализация, но НЕ ИНИЦИАЛИЗАЦИЯ переменной класса. это ты должен сделать сам в том месте и таким образом, как тебе требуется.
mxn
Отправлено: 05.10.2006, 13:51


Ученик-кочегар

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



Огромное спасибо уважаемый olegenty и qvq!!! Все заработало!

Перед использованием TDataModule как вы и говорили надо было написать:

TDataModule2 * DM = new TDataModule2(Application);
DM->ADOCommand....

Но при этом при вызове функции вылезала ошибка EOleSysError
А если так:

CoInitialize(NULL);

TDataModule2 * DM = new TDataModule2(Application);
DM->ADOCommand....

то все ОК и никаких ошибок...

Правда, что делает CoInitialize(NULL) и зачем это надо я понять не смог.
olegenty
Отправлено: 05.10.2006, 14:51


Ветеран

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



CoInialize инициализирует COM

да, и количество вызовов CoInialize должно быть идентично количеству вызовов CoUninialize, дабы не было утечки ресурсов. делать это можно прямо в DllMain, в зависимочти от Reason

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