![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
И снова форма в dll : инициализация [D7, WinXP]
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