Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-53432
stud
2004-01-28 14:04
2004.02.17
IP подключенных к базе ользователей


9-53352
McSimm
2003-08-01 17:23
2004.02.17
Просьба высказаться в опросе Стоит ли объединить Media / Игры?


1-53525
rel_
2004-02-05 15:48
2004.02.17
Переадресация сообщения


4-53811
comwad
2003-12-11 09:08
2004.02.17
Какие *.pas при использовании функции DeviceIoControl нужны?


11-53437
dataMaster
2003-06-02 12:57
2004.02.17
Как распечатать форму?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский