Форум: "Основная";
Текущий архив: 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.042 c