Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c