Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.037 c
14-1093120730
i-s-v
2004-08-22 00:38
2004.09.12
Ancient


3-1092727581
REA
2004-08-17 11:26
2004.09.12
Добавление detail данных


11-1080485261
nester
2004-03-28 18:47
2004.09.12
Ктонибудь пользовался KOLHTTP?


1-1093538910
JohnJ
2004-08-26 20:48
2004.09.12
TMsgDlgButtons


4-1090918020
aval0n
2004-07-27 12:47
2004.09.12
сообщения Windows





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский