Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Внизпочему на этих строчках вылезает АV ?? Найти похожие ветки
← →
bloodman © (2004-08-30 23:48) [0]есть программа и есть длл , в длл экспортируется функция AboutPlugin , которая возвращает структуру :
type
TPluginInfo = packed record
Name : PChar;
About: PChar;
Author: PChar;
EMail: PChar;
Url : PChar;
end;
в программе есть класс TPlugin в нем метод AboutPlugin , он вызывает экспортируюмую функцию.В самой программе пишу так:
info.Name:=GetMemory(80);
info.About:=GetMemory(80);
info.Author:=GetMemory(80);
info.EMail:=GetMemory(80);
info.Url:=GetMemory(80);
IF PluginAr[i].AboutPlugin(info) then
begin
MenuItem:=TMenuItem.Create(MainMenu1);
MenuItem.Caption:=StrPas(info.Name);
MenuItem.Tag:=i;
MenuItem.OnClick:=MenuItemClick;
AboutPlugins.Add(MenuItem);
end;
{ try
FreeMemory(info.Name);
FreeMemory(info.About);
FreeMemory(info.Author); // вот здесь происходит AV причем на 2 плагине а не на первом.
FreeMemory(info.EMail);
FreeMemory(info.Url);
except
end; }
код библиотечной функции:
function AboutPlugin():TPluginInfo;stdcall;
var
about : TPluginInfo;
begin
about.Name:=PChar("dff");
about.About:=PChar("lalal");
about.Author:=PChar("nini");
about.EMail:=PChar("lala@lala.ru");
about.Url:=PChar("http://adfd.ru");
result:=about;
end;
пожалуйста помогите, а то уже вообще не знаю из-за чего это...
← →
GuAV © (2004-08-31 00:08) [1]
> GetMemory
> FreeMemory
Шо это по ним же хелпа нет ?
Раздупли меня лмера почему не просто GetMem/FreeMem
← →
jack128 © (2004-08-31 00:17) [2]bloodman © (30.08.04 23:48)
Для начала, у тя с синтаксисом, что то не то
> IF PluginAr[i].AboutPlugin(info)
> function AboutPlugin():
← →
bloodman © (2004-08-31 00:52) [3]jack128 © (31.08.04 00:17) [2]
с ним все то
PluginAr[i].AboutPlugin(info) - метод класса
function AboutPlugin(): экспортируемая функция
так вот метод класса ее вызывает.
function TPlugin.AboutPlugin(var info: TPluginInfo): boolean;
begin
IF @FAboutPlugin <> nil Then
begin
try
info := FAboutPlugin;
except
end;
result := true;
end
else
result := false;
end;
...
function GetMemory(Size: Integer): Pointer; cdecl;
begin
Result := MemoryManager.GetMem(Size);
end;
function FreeMemory(P: Pointer): Integer; cdecl;
begin
if P = nil then
Result := 0
else
Result := MemoryManager.FreeMem(P);
end;
это VCL обертки , юнит system
← →
jack128 © (2004-08-31 00:55) [4]а.. понятно.
>function AboutPlugin():TPluginInfo;stdcall;
>var
>about : TPluginInfo;
>begin
>about.Name:=PChar("dff");
>about.About:=PChar("lalal");
>about.Author:=PChar("nini");
>about.EMail:=PChar("lala@lala.ru");
>about.Url:=PChar("http://adfd.ru");
>result:=about;
> end;
все это на свалку...
должнно быть так
function AboutPlugin(var Info: TPluginInfo): boolean;stdcall;
begin
StrCopy(Info.Name, PChar("dff"));
StrCopy(Info.About, PChar("lalal"));
Result := True;
end;
У тя ошибка потому что ты
> info := FAboutPlugin;
вот здесь ты затираешь указатели на выделенную память..
← →
Palladin © (2004-08-31 00:58) [5]
> about.Name:=PChar("dff");
> about.About:=PChar("lalal");
> about.Author:=PChar("nini");
> about.EMail:=PChar("lala@lala.ru");
> about.Url:=PChar("http://adfd.ru");
Присваивать PChar можно и без приведения типа. Компилятор присвоит всем переменным адрес уже существующей строки. В связи с этим полученный адрес при GetMemory теряется и при FreeMemory происходит нелегальная попытка освобождения совсем другого адреса.
← →
bloodman © (2004-08-31 00:59) [6]а почему тогда 1 вая длл ка нормально отрабатывает?
к тому же память я выделяю в проге а не в dll??
← →
bloodman © (2004-08-31 01:00) [7]Palladin © (31.08.04 00:58) [5]
спасиб а что тогда делать? как сказал jack128 © (31.08.04 00:55) [4]??
← →
Palladin © (2004-08-31 01:04) [8]Можно и копировать, но тогда GetMem FreeMem, можно просто присвоить, отказавшись от GetMem и FreeMem (рекомендую) память и строка уже есть, компилятор позаботился, не нужно ничего под нее выделять
← →
jack128 © (2004-08-31 01:06) [9]Palladin © (31.08.04 1:04) [8]
отказавшись от GetMem и FreeMem (рекомендую) память и строка уже есть, компилятор позаботился, не нужно ничего под нее выделять
Это прокатит, только если строка - константа. Если её нужно формировать динамически, будут проблемы (когда память из под строки освобождать??)
В общем случае я бы так не делал ;-)
← →
Palladin © (2004-08-31 01:11) [10]
> about.Name:=PChar("dff");
> about.About:=PChar("lalal");
> about.Author:=PChar("nini");
> about.EMail:=PChar("lala@lala.ru");
> about.Url:=PChar("http://adfd.ru");
Дык константы ж :) В общем случае Вы правы на все 100.01%
← →
bloodman © (2004-08-31 01:12) [11]то есть так:
function AboutPlugin():TPluginInfo;stdcall;
var
about : TPluginInfo;
begin
StrCopy(Info.Name, PChar("dff"));
StrCopy(Info.About, PChar("lalal"));
result:=about;
end;
а в программе так:
IF PluginAr[i].AboutPlugin(info) then
begin
MenuItem:=TMenuItem.Create(MainMenu1);
MenuItem.Caption:=StrPas(info.Name);
MenuItem.Tag:=i;
MenuItem.OnClick:=MenuItemClick;
AboutPlugins.Add(MenuItem);
end;
??
← →
jack128 © (2004-08-31 01:24) [12]bloodman © (31.08.04 1:12) [11]
то есть так:
function AboutPlugin():TPluginInfo;stdcall;
var
about : TPluginInfo;
begin
StrCopy(Info.Name, PChar("dff"));
StrCopy(Info.About, PChar("lalal"));
result:=about;
end;
Нет, не так. Во первых что такое Info? Ну предположим, что ты описался и на самом деле это about. Все равно бред.
Куда ты данные копируешь? Ты память под них выделил? Нет. Если выделишь, то возникнет другой вопрос, когда эту память освобождать? Нужно делать именно так как сказал я в [9] или (если тя устраивает часный случай с константами), то как предлагает Palladin.
И вообще посмотрик как работает, например, GetWindowText и сделай по аналогии..
← →
bloodman © (2004-08-31 01:33) [13]в девять ты не написал как бы ты сделал... а как предлагает Palladin я к сожалению видимо не понял...
← →
bloodman © (2004-08-31 01:36) [14]а где кстати посмотреть как работает GetWindowText?
← →
jack128 © (2004-08-31 01:45) [15]bloodman © (31.08.04 1:33) [13]
девять ты не написал как бы ты сделал...
имелось в виду [4]
bloodman © (31.08.04 1:36) [14]
а где кстати посмотреть как работает GetWindowText?
не знаю, примеров сети навалом..Имелось в виду не эта конкретная функция. В winapi навалом функций которые должны вернуть строки - посмотри примеры работы с этими функциями...
← →
bloodman © (2004-08-31 01:48) [16]ок, спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c