Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Error 217   Найти похожие ветки 

 
Aleksey   (2005-10-04 18:45) [0]

Люди, ПОМОГИТЕ!
Приложение работает нормально, но при закрытии говорит:
Project raised exception class EInvalidPointer with message "Invalid Pointer Operation". Process stoped .....
А потом говорит ошибка 217
ЧЕ мне делать???????
Кода много, мне его приводить?


 
GuAV ©   (2005-10-04 19:10) [1]


> ЧЕ мне делать???????

Трассировать.
Искать где именно освобождаеся невыделенная память (скорее всего, вызов деструктора для уже несущесвующего объекта).


 
Leonid Troyanovsky ©   (2005-10-04 19:14) [2]


> GuAV ©   (04.10.05 19:10) [1]

> Трассировать.
> Искать где именно освобождаеся невыделенная память (скорее
> всего, вызов деструктора для уже несущесвующего объекта).



А ошибка 217 подсказывает, что это могло бы быть в finalization
or in an exception handler.

--
Regards, LVT.


 
GuAV ©   (2005-10-04 20:29) [3]

Правда, не обязательно, что само освобождение неверно. Может затиратся память под указатель. Причём, 217, EInvalidPointer в отличии от 216, AV указывает на то, что память была занята менеджером памяти Delphi.

Пример, выдающий ту же ошибку:
var
 S: string;

procedure TForm1.FormCreate(Sender: TObject);
begin
 S := string(Self);
end;


 
Aleksey   (2005-10-04 20:38) [4]

Спасибо!
Тока вот такая проблемка:
Я в Delphi пишу 9 дней (у меня 9 дней назад началась практика)
Мне дали задание накарябать графический редактор.
Я хочу сделать что бы он динамисиськи загружал инструменты рисования (кисти) и добавлял их на панельку с кнопучками
Функции из Длл получаются так:


procedure TForm1.FormCreate(Sender: TObject);
var lib: LongInt;
begin
lib:=LoadLibrary("project2.dll");
СписокУтилитРисования.Утилита[i].Ф-яРисования:=getProcAddress(lib, "myF");
end;


Сейчас дописал до того места, где они (Ф-и) должны рисовать.
При событии OnMouseMove на Image, где они должны рисовать Delphi мне вежливо говорит, что нефига мне читать адресс 000000000

Все бы ничего, но мне эту штуку ужо сдать надо :(


 
Aleksey   (2005-10-04 20:48) [5]

Может текст положить ?
Он гдето 450 - 470 строк


 
GuAV ©   (2005-10-04 21:13) [6]


>procedure TForm1.FormCreate(Sender: TObject);
>var lib: LongInt;
>begin
>lib:=LoadLibrary("project2.dll");
> СписокУтилитРисования.Утилита[i].Ф-яРисования:=getProcA
>ddress(lib, "myF");
> end;


1. Результат loadlibrary и getProcAddress следует проверять, и в случае ошибки обработать её и вывести сообщение, удобнее всего воспользваться исключениями для этого.

 lib := LoadLibrary("project2.dll");
 if not Assigned(lib) then
   RaiseLastOsError;


2. Хендл библитеки следует сохранять до завершнеия работы с ней, вызывая при завершении FreeLibrary. В любом случае, разумеется библиотека будет выгружена, но удаление всего созданного сбой - "правило хорошего тона"; и в данном случае вызов FreeLibrary будет полезен, т.к. пзволит увидеть, генерируется шибка программой или библитекой.

3. "СписокУтилитРисования.Утилита[i].Ф-яРисования" - лучше привести реальный код.

4. По вопросу [0] - есть существенные подозрения в невернй рабооте со строками. File->New->Other->New->DLL Wizard генерирует код пустй DLL, содержащий кментарий. Был ли этт комментарий прочитан и принят к сведению ?


 
Aleksey   (2005-10-04 22:10) [7]

Код основного юнита

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, Menus, ExtCtrls, ToolWin, NewFormUnit,
 ExtDlgs, EditWin, ImgList, SettingsUnit, IniFiles;
type
 TMainForm = class(TForm)
   MainMenu1: TMainMenu;
   N1: TMenuItem;
   N2: TMenuItem;
   ColorPanel: TPanel;
   BgCl: TShape;
   FgCl: TShape;
   SwapCls: TShape;
   ColorGradient: TImage;
   MenuNew: TMenuItem;
   MenuOpen: TMenuItem;
   OpenPictureDialog: TOpenPictureDialog;
   Splitter1: TSplitter;
   ToolsImagesList: TImageList;
   ToolsBox: TScrollBox;
   ToolBar: TToolBar;
   Frame21: TFrame2;
   procedure FormCreate(Sender: TObject);
   procedure SwapClsMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure ColorGradientMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure MenuNewClick(Sender: TObject);
   procedure MenuOpenClick(Sender: TObject);
   procedure AddPaintTool (i: Integer);
   procedure OnToolbarBtnClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 ToolsCount: Integer;
 MainForm: TMainForm;
 SearchRec: TSearchRec;
 Icon: Ticon;
 Ini: TIniFile;
implementation
{$R *.dfm}
Uses DocsUnit;
procedure TMainForm.FormCreate(Sender: TObject);
Var i: integer;
begin
 BgColor:=clBlack;
 BgCl.Brush.Color:=BgColor;
 FgColor:=clWhite;
 FgCl.Brush.Color:=FgColor;
 ColorGradient.Picture.LoadFromFile(".\grad.bmp");
 Documents:=TList.Create;
If FileExists(".\Settings.ini")
Then Begin
     Ini:=TIniFile.Create(".\Settings.ini");
     Try
     ToolsCount:=Ini.ReadInteger("Main","Tools",0);
     If ToolsCount<>0 Then Begin
                      SetLength(PaintToolArray,ToolsCount);
                      For i:=1 to ToolsCount Do
                      AddPaintTool(i)
                      End
                 Else Application.MessageBox ("Отсутствуют инструменты рисования"
                                               ,"Error",MB_OK);

     Except
      Application.MessageBox ("Ошибка в INI файле","Error",MB_OK);
     End;
     Ini.Free;
    End
Else Application.MessageBox("Файл настроек не найден."+
                            #10#13+"Редактор не может загрузить"+
                            " инструменты рисования","Error",MB_OK);
end;

Procedure TMainForm.AddPaintTool (i: integer);
Var Num: String;
   Name: String;
   lib: LongInt;
   Icon: TIcon;
   btn: TToolButton;
Begin
 Num:=IntToStr(i);
 If (Ini.ReadString("Tool_"+Num,"Name","")<>"")
    and FileExists(".\tools\"+Ini.ReadString("Tool_"+Num,"Dll",""))
    and FileExists(".\tools\"+Ini.ReadString("Tool_"+Num,"Icon",""))
 Then Begin
       /// Load tool from Dll
       Name:=Ini.ReadString("Tool_"+Num,"Name","");
       lib:=LoadLibrary(PAnsiChar(".\tools\"+Ini.ReadString("Tool_"+Num,"Dll","")));
       PaintToolArray[i].ToolUp:=getProcAddress(lib,PAnsiChar(Name+"ToolUp"));
       PaintToolArray[i].ToolMove:=getProcAddress(lib,PAnsiChar(Name+"ToolMove"));
       PaintToolArray[i].ToolDown:=getProcAddress(lib,PAnsiChar(Name+"ToolDown"));
       PaintToolArray[i].TFGetPointer:=getProcAddress(lib,PAnsiChar(Name+"TFGetPointer"));
       PaintToolArray[i].Name:=Name;
       /// Load Icon For tool
       Icon:=TIcon.Create;
       Icon.LoadFromFile(".\tools\"+Ini.ReadString("Tool_"+Num,"Icon",""));
       /// Make ToolButton
       btn:=TToolButton.Create(ToolBar);
       btn.Parent:=ToolBar;
       btn.Tag:=i;
       btn.Caption:=Name;
       btn.ImageIndex:=ToolsImagesList.AddIcon(Icon);
       btn.OnClick:=OnToolbarBtnClick;
       /// Init tool"s control frame
//      PaintToolArray[i].TFPointer:=PaintToolArray[i].TFGetPointer(Self);
       End
 Else Begin
        If Ini.SectionExists ("Tool_"+Num,)
        Then Application.MessageBox ("Секция Tool_ отсутствует",
                                     "Error",MB_OK);

        If Ini.ReadString("Tool_"+Num,Name,"")=""
        Then Application.MessageBox ("Секция Tool_ не содержит имени",
                                     "Error",MB_OK);
        Application.MessageBox("Ошибка в Tool_ секции",
                               "Error",MB_OK)
      End;
End;

procedure TMainForm.SwapClsMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
Var Cl: TColor;
begin
 Cl:=BgCl.Brush.Color;
 BgCl.Brush.Color:=FgCl.Brush.Color;
 FgCl.Brush.Color:=Cl;
 BgColor:=BgCl.Brush.Color;
 FgColor:=FgCl.Brush.Color;
end;

procedure TMainForm.ColorGradientMouseUp(Sender: TObject;
 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 Case Button of
  mbLeft: Begin
           FgColor:=ColorGradient.Canvas.Pixels [x,y];
           FgCl.Brush.Color:=FgColor;
          End;
  mbRight:Begin
           BgColor:=ColorGradient.Canvas.Pixels [x,y];
           BgCl.Brush.Color:=BgColor;
          End;
 End;
end;

procedure TMainForm.MenuNewClick(Sender: TObject);
begin
 NewForm.ShowModal;
end;

procedure TMainForm.MenuOpenClick(Sender: TObject);
begin
  If OpenPictureDialog.Execute
  Then Begin
       NewDoc.FileName:=OpenPictureDialog.FileName;
       New (p);
       NewDoc.FormPointer:=P;
       Documents.Add(p);
       p^:=TPaintWin.Create(Self);
       End;
end;

procedure TMainForm.OnToolbarBtnClick(Sender: TObject);
Begin
 If Sender is TToolButton
 Then ToolSelected:=TToolButton(Sender).Tag;
End;
end.



unit DocsUnit;
interface
Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, Menus, ExtCtrls, ToolWin;
Type TNewDoc=record
    Width,Height,
    WidthOld, HeightOld: Word;
    Color: TColor;
    FileName: TFileName;
    FormPointer: Pointer;
end;

Type TPaintTool=record
    Name: String [7];
    ToolUp: function (Canvas: TCanvas; X,Y:LongInt; FgColor,BgColor:TColor; Var Hist: Boolean):Pointer stdcall;
    ToolMove: function (Canvas: TCanvas; X,Y:LongInt; FgColor,BgColor:TColor; Var Hist: Boolean):Pointer stdcall;
    ToolDown: function (Canvas: TCanvas; X,Y:LongInt; FgColor,BgColor:TColor; Var Hist: Boolean):Pointer stdcall;
    TFGetPointer: function(owner: TComponent): Pointer;
    TFPointer: pointer;
end;

Var
 FgColor,BgColor,NewDocColor: TColor;
 SaveNeed: Boolean;
 Documents: TList;
 NewDoc: TNewDoc;
 PaintToolArray: Array of TPaintTool;
 ToolSelected: Integer;
implementation

end.


 
Aleksey   (2005-10-04 22:19) [8]

2GuAV
Комент я читал и понял из него:
Если у меня в Длл есть процедуры/функции со строками-параметрами, то надо юзать ShareMem?
Я правильно понял (плохо знаю англ.)?

У меня ф-и в Длл вроде строки не принимают....


 
GuAV ©   (2005-10-05 00:43) [9]


> Если у меня в Длл есть процедуры/функции со
> строками-параметрами, то надо юзать ShareMem?

Где то так, но не только строки но и любые объекты выделяемые менеджером памяти, которые могут быть освобождены в другом модуле (модуль с т.з. Windows). В частности, дин. масссивы. И структуры, содержащие такие объекты.

> Canvas: TCanvas;

Вот например это не следует передавать без ShareMem (такая передача - наиболее вероятная причина [0]), да и передача с sharemem тоже не рекомендуется.

Также см [6] пп 1 и 2

Динамический массив индексируетсяс нуля и до count - 1, а не с 1 до count. Для статических, динамических и открытых массивов можно использовать Low и High.


 
Leonid Troyanovsky ©   (2005-10-05 08:49) [10]


> GuAV ©   (04.10.05 20:29) [3]

> Причём, 217, EInvalidPointer  в отличии от 216, AV


Вообще-то, run time error 217 это не EInvalidPointer, а EControlC.
А почему она генерируется при ошибках в finalization & etc
одному Борланду известно.

Ну, и как ты верно заметил, что при использовании библиотек
сочетание 204, 217 происходит, в основном, благодаря
неиспользованию ShareMem (properly).

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.058 c
2-1128840523
Lumen
2005-10-09 10:48
2005.10.30
Установка компонентов


2-1128877637
intel
2005-10-09 21:07
2005.10.30
модули


5-1107261048
Yagovdik
2005-02-01 15:30
2005.10.30
ListView a la ACDCee


1-1128523688
X9
2005-10-05 18:48
2005.10.30
Работа с TXMLDocument и IXMLNode


4-1125003411
Nazi
2005-08-26 00:56
2005.10.30
условное объявление функции





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