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