Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

почему на этих строчках вылезает АV ?? [D6, Win2k]


bloodman ©   (2004-08-30 23:48:00) 

есть программа и есть длл , в длл экспортируется функция 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;

пожалуйста помогите, а то уже вообще не знаю из-за чего это...


bloodman   (2004-08-31 01:48:00) [1]

ок, спасибо.


jack128   (2004-08-31 01:45:00) [2]

bloodman ©   (31.08.04 1:33) [13]
девять ты не написал как бы ты сделал...

имелось в виду [4]
bloodman ©   (31.08.04 1:36) [14]
а где кстати посмотреть как работает GetWindowText?

не знаю, примеров сети навалом..Имелось в виду не эта конкретная функция. В winapi навалом функций которые должны вернуть строки - посмотри примеры работы с этими функциями...


bloodman   (2004-08-31 01:36:00) [3]

а где кстати посмотреть как работает GetWindowText?


bloodman   (2004-08-31 01:33:00) [4]

в девять ты не написал как бы ты сделал... а как предлагает Palladin я к сожалению видимо не понял...


jack128   (2004-08-31 01:24:00) [5]

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:12:00) [6]

то есть так:
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;

??


Palladin   (2004-08-31 01:11:00) [7]


> 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%


jack128   (2004-08-31 01:06:00) [8]

Palladin ©   (31.08.04 1:04) [8]
отказавшись от GetMem и FreeMem (рекомендую) память и строка уже есть, компилятор позаботился, не нужно ничего под нее выделять


Это прокатит, только если строка - константа. Если её нужно формировать динамически, будут проблемы (когда память из под строки освобождать??)

В общем случае я бы так не делал ;-)


Palladin   (2004-08-31 01:04:00) [9]

Можно и копировать, но тогда GetMem FreeMem, можно просто присвоить, отказавшись от GetMem и FreeMem (рекомендую) память и строка уже есть, компилятор позаботился, не нужно ничего под нее выделять


bloodman   (2004-08-31 01:00:00) [10]

Palladin ©   (31.08.04 00:58) [5]
спасиб а что тогда делать? как сказал jack128 ©   (31.08.04 00:55) [4]??


bloodman   (2004-08-31 00:59:00) [11]

а почему тогда 1 вая длл ка нормально отрабатывает?
к тому же память я выделяю в проге а не в dll??


Palladin   (2004-08-31 00:58:00) [12]


> 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 происходит нелегальная попытка освобождения совсем другого адреса.


jack128   (2004-08-31 00:55:00) [13]

а.. понятно.


>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;

вот здесь ты затираешь указатели на выделенную память..


bloodman   (2004-08-31 00:52:00) [14]

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:17:00) [15]

bloodman ©   (30.08.04 23:48)
Для начала, у тя с синтаксисом, что то не то


> IF PluginAr[i].AboutPlugin (info)


> function AboutPlugin ():


GuAV   (2004-08-31 00:08:00) [16]


> GetMemory


> FreeMemory

Шо это по ним же хелпа нет ?
Раздупли меня лмера почему не просто GetMem/FreeMem


Наверх

Титульная страница Поиск, карта сайта Написать письмо