-
Почему когда в demomodalvcl2koldll.7z вместо
procedure CallKOLFormModal; external 'KOLDll.dll' name 'CallKOLFormModal';
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin CallKOLFormModal; end;
написать
//procedure CallKOLFormModal; external 'KOLDll.dll' name 'CallKOLFormModal'; {$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); type PCallKOLFormModal=procedure; var hDll:THandle; CallKOLFormModal:PCallKOLFormModal; begin if(FileExists('KOLDLL.dll' ))then begin hDll:=LoadLibrary('KOLDLL.dll'); @CallKOLFormModal:=GetProcAddress(hDll,'CallKOLFormModal'); CallKOLFormModal; freeLibrary(hDll); end; end;
при выходе вылазит ошибка? Как это исправить?
-
Какая ошибка? Или отладчик ничего не говорит?
-
Project VCLProject1.exe raised exception class EACcessViolation with message 'Access violation at address 003C20C0. Read of address 003C20C0.'
Если freeLibrary(hDll) не делать, то ошибки нет.
-
А если отлаживать со стороны dll, подключая основное приложение как host?
-
Ошибка появляется с любой стороны.
Нашел одно решение,если в dll добавить:
function TKOLForm1.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean; begin Result:=false; if Msg.message=WM_CLOSE then begin Applet.Close; end; end;
то ошибка исчезает.
-
Но и ведут себя основное и модальное окна неправильно, даже если вызывать модальное ShowModalEx.
Пример: запускаю VCLProject, открываю модальное окно. Запускаю другую программу. Если переключиться на VCLProject Alt+Tab появляется одно модальное окно, если кликнуть значок на панели задач появляется одно основное окно. А когда закрываю модальное,основное прячется за другими окнами, если они есть.
-
У меня та же проблема. Притом, метод от AlexM на счет WM_CLOSE не помогает. Вот часть кода
library settings;
uses
KOL, Windows, Messages,
advTypes in '..\..\FlexTest\advTypes.pas';
type
PForm1 = ^TForm1;
TForm1 = object(TObj)
Form1 : PControl;
ButtonOk : PControl;
ButtonCl : PControl;
Panel : PControl;
Tabs : PControl;
ConPortLabel : PControl;
ConSpeedLabel : PControl;
cboxPort : PControl;
cboxSpeed : PControl;
lblLogMode : PControl;
cboxLogMode : PControl;
lblCacheRecords : PControl;
lblLastEvents : PControl;
cboxCacheRecords : PControl;
cboxLastEvents : PControl;
chbxAutoLoad : PControl;
chbxArchTrace : PControl;
editDBHost : PControl;
editDBPort : PControl;
editDBName : PControl;
editDBUser : PControl;
editDBPassword : PControl;
lblDBHost : PControl;
lblDBPort : PControl;
lblDBName : PControl;
lblDBUser : PControl;
lblDBPassword : PControl;
lblGuardColor : PControl;
lblAlarmColor : PControl;
lblSuspendColor : PControl;
btnGuardColor : PControl;
btnAlarmColor : PControl;
btnSuspendColor : PControl;
grpActiveList : PControl;
grpDisabledList : PControl;
btnActiveLColor : PControl;
btnActiveLFont : PControl;
btnDisabledLColor : PControl;
btnDisabledLFont : PControl;
cboxLogFileMode : PControl;
cboxLogFileBuff : PControl;
lblLogFileMode : PControl;
lblLogFileBuff : PControl;
ColorDialog : PColorDialog;
procedure InitControlsWithSettings;
procedure ApplySettings;
function Form1Message(var Msg: TMSG; var Rslt: Integer): Boolean;
end;
var
MainForm1 : PForm1;
Applet : PControl;
_settings : PSettings;
MustChange: Boolean;
procedure OnCancelBtnClick(Stub, Sender: PObj);
begin
MustChange:=True;
MainForm1.Form1.Close;
end;
procedure OnOkBtnClick(Stub, Sender: PObj);
begin
MustChange:=False;
MainForm1.Form1.Close;
end;
function NewForm1(Parent: PControl):PForm1;
var i:byte;
s:String;
begin
New(Result,Create);
with Result^ do
begin
Form1:=NewForm(Parent,'Íàñòðîéêè'). SetSize(500,350).CenterOnParent;
Form1.Add2AutoFree(Parent);
Form1.Font.FontName:='Arial';
Form1.Font.FontHeight:=14;
Form1.Font.FontStyle:=[];
ButtonOk.OnClick:=TOnEvent(MakeMethod(nil,@OnOkBtnClick));
ButtonCl.OnClick:=TOnEvent(MakeMethod(nil,@OnCancelBtnClick));
btnGuardColor.OnClick:=TOnEvent(MakeMethod(nil,@OnGuardColorBtnClick));
btnAlarmColor.OnClick:=TOnEvent(MakeMethod(nil,@OnAlarmColorBtnClick));
Form1.OnMessage:=Form1Message;
end;
end;
function ShowSettingsForm(ptrSettings: PSettings):boolean;stdcall;export;
begin
Result:=False;
_Settings:=ptrSettings;
Applet:=NewForm(nil,'Íàñòðîéêè');
Applet.Visible:=false;
MainForm1:=NewForm1(Applet);
Run(Applet);
MainForm1.Form1.ShowModal;
MainForm1.Form1.Free;
MainForm1.Form1:=nil;
Result:=MustChange;
end;
exports
ShowSettingsForm name 'ShowSettingsForm';
function TForm1.Form1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:=false;
if Msg.message=WM_CLOSE then
begin
Applet.Close;
end;
end;
begin
end.
При вызове из VCL - форма отлично показывается, все работает, закрывается но при закрытии самого VCL приложения выскакиевает ошибка по адресу ... Где причина?
-
Если выполнять приложение через отладчик Дельфи, то после возникновения ошибки загляните в меню (щас не помню хоть убейте название и расположение). Кароче там есть пункт для поиска ошибки по адресу. Введите в окне адрес, который вам сообщается, и вас "ткнут носом" в строку кода, на которой возникла ошибка.
-
... которая иногда бывает в недрах самой винды...
такое случается при работе с динамическими массивами и ошибками с их длиной.
-
хм, разобрался вроде... заработало при вызове, форма нормально отображается, кнопочки реагируют на события и тому подобное, но теперь возникла проблема - при освобождении библиотеки, память которая занималась под контролы не освобождается (около 30 Кб), и при последующих вызовах библиотеки память засоряется на ~30 Кб... здается мне что проблема в осовождении контролов посоветуйте как правильно их освободить (уничтожить) если объект формы выглядит так
TForm1 = object(TObj)
Form1 : PControl;
ButtonOk : PControl;
ButtonCl : PControl;
Panel : PControl;
....
lblLogFileMode : PControl;
lblLogFileBuff : PControl;
procedure InitControlsWithSettings;
procedure ApplySettings;
end;
процедура создания формы
function NewForm1(Parent: PControl):PForm1;
var i:byte;
s:String;
begin
New(Result,Create);
with Result^ do
begin
Form1:=NewForm(Parent,'Íàñòðîéêè'). SetSize(500,350).CenterOnParent;
Add2AutoFree(Form1);
Form1.Font.FontName:='Arial';
Form1.Font.FontHeight:=14;
Form1.Font.FontStyle:=[];
Panel:=NewPanel(Form1,esLowered).SetAlign(caBottom);
Panel.Height:=40;
ButtonOk:=NewButton(Panel,'Îê').SetSize(60,25).SetAlign(caRight);
ButtonCl:=NewButton(Panel,'Cancel').SetSize(60,25).SetAlign(caRight);
...
end;
собственно процедура экспорта вызова формы из KOL DLL
function ShowSettingsForm(ptrSettings: PSettings):boolean;stdcall;
begin
Result:=False;
_Settings:=ptrSettings;
if not Assigned(MainForm1) then MainForm1:=NewForm1(nil);
Run(MainForm1.Form1);
MainForm1:=Nil;
Result:=MustChange;
end;
exports
ShowSettingsForm name 'ShowSettingsForm'; Где должны уничтожаться все контролы расположенные на форме? или они уничтожаются автоматически? или при уничтожении обьекта MainForm1? если дописывать MainForm1.Free то вылетает ошибка (скорее всего изза того что Form1 уже уничтожен при вызове Close) Вобщем как корректно осовободить всю память из под DLL?
-
Контролы уничтожаются автоматом вместе с родиетелем. Пример смотрели? Разве там так написано?
-
> при выходе вылазит ошибка?
Сейчас я сам столкнулся с этим. И это первая проблема. Вторая в том, что в моей КОЛ программе есть два плагина, тоже на КОЛ, и когда я запускаю первый, всё работает (ну про то, что на выходе из хостового приложения вылазит AV, я не говорю). А когда я запускаю второй плагин, он вылетает со страшным треском. Причём не именно данный плагин, а любой ВТОРОЙ, т.е. после запуска первого что-то не так освобождается и т.п. Во время ShowModalEx форма не появляется, а появляются только некоторые контролы, без формы, а через 3-4 секунды плагин вылетает.
Итак, вопросы. Первая проблема имеет место всегда, при любых обстоятельствах, плагинах и т.д. Как решить первую проблему? Вторая проблема возникает, когда на моей dll-форме имеется много контролов, среди них editbox, listview, pagecontrol, button, label. Как решить вторую проблему? Конкретного места с ошибкой я не нашёл. По адресу ошибки бывает то ShowModalEx формы, то какие-то строки в модуле КОЛ...
Пояснение. В каждом моём плагине есть dpr, модуль с формой и модуль с тремя функциями. Вот та, которая выводит окно:
function PluginRun(PlugInfo: PPluginInfo): integer; stdcall; var Form1: PForm1; begin Result := 0; ... Applet := NewApplet(''); Applet.Hide; NewForm1(Form1, Applet); Form1.Form.ShowModalEx; Form1.Form.Free; Form1 := nil; Free_And_Nil(Applet); AppletTerminated := false; end;
Специально вызов формы сделал в точности как в демо-примере.
-
> хм, разобрался вроде... заработало
А рассказать?
-
Кажется, нашёл выход. В процедуре пишу: function PluginRun(PlugInfo: PPluginInfo): integer; stdcall;
var Form1: PForm1;
begin
Result := 0;
...
Applet := NewApplet('');
Applet.Hide;
NewForm1(Form1, Applet);
Form1.Form.ShowModalEx;
Form1.Form.Free;
Form1 := nil;
Free_And_Nil(Applet);
AppletTerminated := false;
end;
При выходе, как известно, выпадает АВ. Я открыл модульформы_1.inc и в начале создающей окно процедуры вижу такой код:
Result := PForm1.Create;
New( Result, Create );
Result.Form := NewForm( AParent, 'Form1' ).SetPosition( 476, 142 ).SetClientSize( 564, 302 );
Applet := Result.Form;
Result.Form.Add2AutoFree( Result ); Так вот, в предпоследней строке фигурирует апплет. Если закомментировать эту строчку, ошибка исчезает :) Правда, не знаю, насколько такой подход правильный.
-
Короче, не знаю, что и делать... Чётвёртый день пытаюсь найти ошибку, но нет, не нахожу. То всё работает, то программа вылетает.
Владимир, на вас надежда, помогите! Хелп! Или моя затея пойдёт прахом ;(
-
yaw arkadaşlar turkçe bilen yokmu neden kol projelerinde görsellik yok ben daha güzel formlar yapmak istiyorum lütfen yardımcı olun
-
> yaw arkadaşlar turkçe bilen yokmu > neden kol projelerinde görsellik yok ben daha güzel formlar > yapmak istiyorum lütfen yardımcı olun
Круто выгядит. И, главное, абсолютно всё понятно
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
|