Текущий архив: 2003.03.17;
Скачать: CL | DM;
Вниз
Работа с DLL .. Найти похожие ветки
← →
Yagoda © (2003-03-03 16:43) [0]Вобщем есть проблемы:
1) Не получаеться динамически загрузить и использовать dll(Вылетает екзепшн.. access violation ...) Делаю все как тут:
http://delphi.mastak.ru/articles/usedll/index.html
2) С формами проблема:
Создаю форму в DLL:
function ShowMyDialog(Application:TComponent;Msg: PChar): Boolean; stdcall;
exports ShowMyDialog;
function ShowMyDialog(Application:TComponent,Msg: PChar): Boolean;
begin
Form1 := TForm1.Create(Application);
Form1.Label1.Caption := StrPas(Msg);
Result :=Form1.ShowModal;
Form1.Free;
end;
При вызове из приложения- форма показываеться - но при закрытии, опять таки вылетает с той же ошибкой что в первом пункте.
Есть у кого какие мысли ? А то у бедной девушки совсем нету никаких идей ..
← →
Strumpf © (2003-03-03 16:54) [1]> но при закрытии,
При закрытии чего?
← →
Yagoda © (2003-03-03 17:19) [2]Модальной формы!(котрая в dll)
← →
Strumpf © (2003-03-03 17:25) [3]В CloseQuery у Вас caHide?
← →
Strumpf © (2003-03-03 17:47) [4]Я, не желая Вас обидеть, пытаюсь получить от Вас информацию. Пока не получил... По приведенному Вами коду нельзя сказать ничего определенного. Access violation - ошибка памяти. Возможно, к моменту вызова Free Ваша форма уже не существует.
← →
Rurick (2003-03-03 17:55) [5]Подключи в вызывающем приложении и в библиотеке модуль ShareMem (обязательно первым в списке модулей).
← →
Yagoda © (2003-03-03 18:39) [6]to Strumpf: Я и не обижаюсь ... А как мне узнать существует она или нет ? Ведь я ее содаю(передаю Application).Тоесть я насколько понимаю она должна существовать столько.. сколько существует апликейшн. Или я не права ?
← →
Yagoda © (2003-03-03 22:24) [7]Люди вот текст DLL: Помогите кто-чем может
library DllProject;
uses
ShareMem,
SysUtils,
Classes,
dllform in "dllform.pas" {Form1};
{$R *.res}
function GetLenText(text:PChar): integer; stdcall;
var ttext:string;
begin
ttext:= StrPas(text);
Result :=Length(ttext);
end;
function Kvadrat(t:real): real; stdcall;
begin
Result:=Sqr(t);
end;
function ShowMyDialog(Application:TComponent;Msg: PChar): integer;
var App:TComponent;
begin
Form1 := TForm1.Create(Application);
Form1.Label1.Caption := StrPas(Msg);
Form1.ShowModal;
Form1.Free;
Result := 1;
end;
exports GetLenText,Kvadrat index 2,
ShowMyDialog name "smd";
begin
end.
← →
Rurick (2003-03-04 17:29) [8]Попробуй так:
procedure CreateFormNow(AHandle: THandle; FormName: PChar);
begin
Application.Handle := AHandle;
Form1 := TForm1.Create(Application);
try
with Form1 do
begin
Caption := FormName;
ShowModal;
end;
finally
Form1.Free;
end;
end;
← →
Mystic © (2003-03-04 18:19) [9]Еще можно заменить Free на Release:
Use Release to destroy the form and free its associated memory.
Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form"s event queue are processed before the form is released. Any event handlers of the form should use Release instead of Free. Failing to do so could lead to an access violation.
Note: Release returns immediately to the caller. It does not wait for the form to be freed before returning.
Note: When writing a DLL that uses VCL forms, assign the window handle of the host EXE’s main window to the DLL’s Application.HandleApplication->Handle property. This makes the DLL’s form part of the host application. Never assign to the Handle property in an EXE.
← →
Mystic © (2003-03-04 18:20) [10]Кроме того может иметь смысл хранить форму не в DLL, а в пакете
← →
Strumpf © (2003-03-04 19:28) [11]> Yagoda © (03.03.03 18:39)
> Тоесть я насколько понимаю она должна существовать столько.. > сколько существует апликейшн. Или я не права ?
Не совсем. Форма существует до тех пор, пока ее не удалили из памяти (если не предпринимать никаких действий, до форму удалит ее владелец (Owner) - Application в данном случае). Вы удаляете форма путем Free().
Могу предложить перенести удаление формы в новую (другую) экспортируемую процедуру и вызывать эту процедуру из основной программы (тем более, что форма в dll - модальная).
← →
Yagoda © (2003-03-04 22:40) [12]Странно это все странно .. вот эксперементальным путем выяснила, что ежели функцию дергать из другой процедуры то все ок: то есть:
function smd(Msg: PChar): integer;stdcall;external "DLLProject.DLL"
...
...
...
procedure TMainForm.Button2Click(Sender: TObject);
begin
smd(PChar("asdasd")); // Вот тут вылетает
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
A: array[0..79] of Char;
begin
StrPCopy(A, Edit1.Text);
smd(PChar("sad")); // А вот тут все работает
Label1.Caption:=IntToStr(GetLenText(A));
end;
И где логика ???
← →
Palladin © (2003-03-04 22:46) [13]подключи в dll и приложении ShareMem
и используй String вместо PChar
Страницы: 1 вся ветка
Текущий архив: 2003.03.17;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.013 c