Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

StringGrid и Dll   Найти похожие ветки 

 
bjohny   (2004-02-09 09:24) [0]

Привет.
Есть Dll с одной экспортируемой функцией. В функцию передаю StringGrid.
Dll подгружается динамически.
В проге передаю в эту функцию stringgrid на форме, Dll заполняет его, выгружается, но потом вылетает av, при выходе из процедуры(в которой вызывается Dll). как правильно передать грид в Dll и как с ним в этой Dll работать???

Привожу исходники:
Dll:
library XMLParsing;

uses
SysUtils,
Classes,Grids, Dialogs, Forms;

{$R *.res}
function test(hideoid, hideworkrow, MustBeOID:boolean; FillGrid:TStringGrid):integer;
begin
if Assigned(FillGrid) then
begin
showmessage("пишем");
FillGrid.RowCount:=FillGrid.RowCount+1;
showmessage("пишем1");
FillGrid.Cells[1,FillGrid.RowCount-1]:="Test";
end
else
showmessage("Not assigned");
showmessage("gggg");
result:=1;
end;

function GetXMLForGrid(Form:TForm;Grid:TStringGrid; hideoid, hideworkrow, MustBeOID:boolean; Query:pchar):Integer;stdcall;
begin
try
test(hideoid, hideworkrow, MustBeOID, grid);
result:=1
finally
end;
end;
exports
GetXMLForGrid;
begin
end.

Программа:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
Button3: TButton;
Grid: TStringGrid;
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
var
Handle: THandle;
MyProc: function(Form: TForm; Grid:TStringGrid; hideoid, hideworkrow, MustBeOID:boolean; Query:pchar):Integer;stdcall;
begin
try
@MyProc:=nil;
Handle := LoadLibrary("Dll\XMLParsing");
if Handle >= 32 then
begin
@MyProc := GetProcAddress(Handle, "GetXMLForGrid");
if @MyProc <> nil then
MyProc(Self, Grid, false, true, false, "select oid, * from student_general_info limit 100");
end;
finally
showmessage("Done");
FreeLibrary(Handle);
end;
end;

end.

Подскажите как побороть ошибки.
Подключение модуля ShareMem ничего не изменяет.


 
Digitman ©   (2004-02-09 09:49) [1]

собери и EXE и DLL с Run-Time Packages


 
bjohny   (2004-02-09 10:24) [2]

Статика не подойдет...


 
Digitman ©   (2004-02-09 10:48) [3]

какая такая "статика" ? у тебя как раз сейчас "статика" и есть , коль уж на то пошло !

у тебя AV на какой модуль указывает, на какую строчку ?
ты трассировал пошагово вызов ф-ции и ее исполнение ?


 
bjohny   (2004-02-09 11:02) [4]

@MyProc:=nil;
Handle := LoadLibrary("Dll\XMLParsing");
if Handle >= 32 then
begin
@MyProc := GetProcAddress(Handle, "GetXMLForGrid");
if @MyProc <> nil then
MyProc(Self, Grid, false, true, false, "select oid, * from student_general_info limit 100");
end;
finally
showmessage("Done");
FreeLibrary(Handle);
Это разве статика- это динамика.
Ошибка после выхода из процедуры после
FreeLibrary(Handle);
Необходима возможность обновдения Dll во время работы приложения.
Run-Time пакеты, если я не ошибаюсь, загружаются при старте приложения... или я не прав???


 
alex_*** ©   (2004-02-09 11:19) [5]

Разница не в том как ты подгружаешь ДЛЛ, а как собрана сама ДЛЛ


 
Digitman ©   (2004-02-09 11:29) [6]


> Run-Time пакеты, если я не ошибаюсь, загружаются при старте
> приложения... или я не прав???


а тебе до ран-тайм-пакетов какое дело ? ты же не их обновляешь, а свою DLL, которая при загрузке будет использовать ТЕ ЖЕ пакеты, что и хост-приложение !

при исп-нии стандартных ран-тайм-пакетов (в 1-ю очередь vclXX.bpl) у тебя и в DLL и в хост-приложении будет задействован единый менеджер памяти (и что еще важней - единая RTTI), что позволяет не задействовать Sharemem и при этом существенно уменьшить размер EXE и DLL


 
bjohny   (2004-02-09 12:00) [7]

А поподробнее можно, как собрать... :(
Чавот собираю ниче не получается...


 
Digitman ©   (2004-02-09 12:01) [8]


> Чавот собираю ниче не получается...


подробней - что не получается ?


 
bjohny   (2004-02-09 12:01) [9]

Извиняюсь, скомпилил


 
bjohny   (2004-02-09 12:04) [10]

Большой всем спасиб



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
3-53390
denmin
2004-01-28 15:32
2004.02.17
Помогите если можно


3-53402
suric
2004-01-26 15:12
2004.02.17
InterBase и хранимые процедуры


1-53496
Spy.RU
2004-02-05 08:05
2004.02.17
The project already contains a form or module named Unit2!!!


11-53435
Dimaxx
2003-06-03 21:22
2004.02.17
Как у Toolbar а получить вертикальную полоску


3-53424
}|{yk
2004-01-26 10:46
2004.02.17
Как в run-time узнать все поля результируещего запроса?