Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

И снова форма в dll : инициализация [D7, WinXP]


Страницы:   1 2

parovoZZ ©   (2006-05-23 00:36:00) 

Здарова

У меня в dll две формы - одна рабочая (с визуальными компонентами), а вторая DataModule. Вот её то и не получается инициализировать (рабочая с компонентами в данный момент не нужна). Т.е. нужны компоненты ADOcommand, ADOConnection и ADODataSet. Делаю следующее:
unit DF;

interface

uses
 Windows, Classes, DB, ADODB, Forms;

type
 TDMd = class(TDataModule)
   ADOConnection: TADOConnection;
   ADOCmd: TADOCommand;
   ADODS: TADODataSet;
 private

 public
   { Public declarations }
 end;

//procedure DllEntryPoint (Reason : DWord);
procedure InitData; stdcall;

var
 DMd: TDMd;

implementation

{$R *.dfm}

procedure InitData; stdcall
begin

 DMd := TDMd.Create (Application);

end;

{
initialization
//if (DllProc = nil) then
 begin
  DllProc := @DllEntryPoint;
  DllEntryPoint (DLL_PROCESS_ATTACH);
 end;
finalization    }

exports
InitData name 'InitData';

end.


Так вот на строчке   DMd := TDMd.Create (Application); возникает ошибка EOleSysError with message "Не был произведён вызов CoInitialize". Чего я такого не сделал?
Да, вызывающий exe написан на апях.


DrPass   (2006-05-23 23:51:00) [21]


> А смысл заменять у Application Handle?

Ровным счетом никакого. Сообщения-то все равно будут приходить в оконную функцию, объявленную в основной программе, а не в Application.
А в том Application, которое объявлено в DLL, вообще не создается ни оконная функция, ни дескриптор (это тоже фича, начиная с D6)


isasa   (2006-05-23 23:42:00) [22]

А подумать?

...
DMd := TDMd.Create (Application);
...


parovoZZ   (2006-05-23 22:53:00) [23]

Ура, заработало.


> Если есть uses ... Forms,...то имеется :)


Если я говорю, что Api, значит Api. Ну нравятся мне exe весом 50 кило.

А смысл заменять у Application Handle?


isasa   (2006-05-23 21:43:00) [24]

parovoZZ ©   (23.05.06 20:14) [5]

Exe у меня на апях,

Если есть
uses ... Forms,...
то имеется :)

В общем, идея такая, Application.Handle в DLL, заполняется ручками ...


isasa   (2006-05-23 21:39:00) [25]

{$Delphi}\Source\Rtl\Common\ComObj.pas


parovoZZ   (2006-05-23 20:38:00) [26]

А где объявлена эта функция? на мсдн написан objbase, но у меня нет такого.


parovoZZ   (2006-05-23 20:14:00) [27]

Exe у меня на апях, там нет никакого Application. Есть просто MainHandle.


isasa   (2006-05-23 10:53:00) [28]

Собирался добавить, так добавь. :)

procedure DLLEntryPoint(Reason: Integer); // stdcall;
begin
 case Reason of
   DLL_PROCESS_DETACH: //= 0;
 CoUninitialize;
   DLL_PROCESS_ATTACH: //= 1;
       CoInitializeEx( nil, COINIT_MULTITHREADED);      // MTA
       // или CoInitializeEx( nil, COINIT_APARTMENTTHREADED);  // STA
 end;
end;
из MSDN
CoInitializeEx provides the same functionality as CoInitialize and also provides
a parameter to explicitly specify the thread's concurrency model.
The current implementation of CoInitialize calls CoInitializeEx and specifies
the concurrency model as single-thread apartment.
Applications developed today should call CoInitializeEx rather than CoInitialize.

И что такое Application в DLL? Оно такое, как в EXE? Выставь, хотя бы
Application(из DLL).Handle:=Application(из EXE).Handle


parovoZZ   (2006-05-23 09:14:00) [29]

Ладно, будем попробовать.


evvcom   (2006-05-23 08:32:00) [30]

Ну так произведи вызов CoInitialize перед Create. Примеров в VCL куча, ты клавишами Ctrl+F пользоваться умеешь?


DrPass   (2006-05-23 00:48:00) [31]

Наступил на грабли VCL - она в общем случае не предназначена для использования в DLL. В данном случае в модуле ComObj не выполнилась секция инициализации (это не ошибка, это фича :-). В этой секции кроме всего прочего производился вызов CoInitialize - необходимое условие для работы основанных на COM компонент, например, ADO


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо