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

Вниз

Ошибка при закрытии   Найти похожие ветки 

 
Chcnger   (2004-03-15 20:47) [0]

Почему после того как я из своей программы вызываю процедуру из этой ДЛЛ, то при закрытии моей программы происходит ошибка :,,

library Atwain;

uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls, DelphiTwain;

type
TEvent = procedure(I: Integer) of object;

type
 TMyClass = class(TObject)
   private
      procedure TwainTwainAcquire(Sender: TObject; const Index: Integer;
                Image: TBitmap; var Cancel: Boolean);
       procedure TwainAcquireProgress(Sender: TObject;
                const Index: Integer; const Image: HBITMAP; const Current,
              Total: Integer);

 public   Twain: TDelphiTwain;
end;

var
  BITMAP:Tbitmap;
  TOT:integer;
procedure TMyClass.TwainAcquireProgress(Sender: TObject;
 const Index: Integer; const Image: HBITMAP; const Current,
 Total: Integer);
begin
       tot:=Current;
end;

procedure TMyClass.TwainTwainAcquire(Sender: TObject; const Index: Integer;
 Image: TBitmap; var Cancel: Boolean);
begin
//  ImageHolder.Picture.Assign(Image);
//  Cancel := TRUE;  {Only want one image}
 BITMAP.Assign(Image);
 BITMAP.SaveToFile("c:\lol.bmp");
 BitMap.Free;
end;
procedure SetColorType(Index:integer);
begin
{   Case Index of
  0:s.Twain.Source[SelectedSource].SetIPixelType(tbdBw);
  1:s.Twain.Source[SelectedSource].SetIPixelType(tbdGray);
  2:s.Twain.Source[SelectedSource].SetIPixelType(tbdRgb);
  3:s.Twain.Source[SelectedSource].SetIPixelType(tbdCmyk);
  4:s.Twain.Source[SelectedSource].SetIPixelType(tbdYuvk);
  end;}
end;

procedure SetSourceAndAcquire(UI:boolean;TransferMode,DPI,ImageWidth,ImageHeight,BitDepth,IPixelType:integer);stdcall;//(UI:boolea n;transfer:integer);stdcall;
var
  s:TMyClass;
  SelectedSource: Integer;
begin
  Bitmap := TBitmap.Create ;
  Bitmap.Width :=ImageWidth;
  Bitmap.Height :=ImageHeight;
  s.Twain:=TDelphiTwain.Create(Nil);
  s.Twain.OnTwainAcquire:=s.TwainTwainAcquire;
  s.Twain.OnAcquireProgress:=s.TwainAcquireProgress;
 {It is always recommended to load library dynamically, never forcing}
 {final user to have twain installed}
 if s.Twain.LoadLibrary then
 begin

   {Load source manager}
   s.Twain.SourceManagerLoaded := TRUE;
   {Allow user to select source}
   SelectedSource := s.Twain.SelectSource;
   if SelectedSource <> -1 then
   begin
     {Load source, select transference method and enable (display interface)}
     s.Twain.Source[SelectedSource].Loaded := TRUE;
      case IPixelType of
       0:s.Twain.Source[SelectedSource].SetIPixelType(tbdBw);
       1:s.Twain.Source[SelectedSource].SetIPixelType(tbdGray);
       2:s.Twain.Source[SelectedSource].SetIPixelType(tbdRgb);
       3:s.Twain.Source[SelectedSource].SetIPixelType(tbdCmyk);
       4:s.Twain.Source[SelectedSource].SetIPixelType(tbdYuvk);
      end;
      case TransferMode of
       0:s.Twain.Source[SelectedSource].TransferMode := ttmMemory;
       1:s.Twain.Source[SelectedSource].TransferMode := ttmFile;
       2:s.Twain.Source[SelectedSource].TransferMode := ttmNative;
      end;
     s.Twain.Source[SelectedSource].SetIYResolution(DPI);
     s.Twain.Source[SelectedSource].SetIYResolution(DPI);
     s.Twain.Source[SelectedSource].SetIBitDepth(BitDepth);
     s.Twain.Source[SelectedSource].TransferMode := ttmMemory;
     s.Twain.Source[SelectedSource].ShowUI:=UI;
     s.Twain.Source[SelectedSource].Enabled := TRUE;
   end {if SelectedSource <> -1}
 end
 else
  begin
    showmessage("Twain is not installed.");
   end;

 While Tot<100 do begin ShowmEssage(IntTostr(tot)) end;
 s.Free;
end;

exports SetSourceAndAcquire;
begin
end.


 
YuRock ©   (2004-03-15 20:52) [1]

Как минимум потому, что Вы не вычищаете память "из-под" объектов. Так, мельком глянув можно заметить:

1. Bitmap не удаляется;
2. s.Twain не удаляется;
3. s вообще не создается! должно валиться еще при первом обращении (s.Twain в четвертой строке ф-ции SetSourceAndAcquire)


 
Petr V. Abramov ©   (2004-03-15 20:57) [2]

Если "происходит ошибка" - это Runtime error 216/217, Access Violation, Invalid Pointer Operation и т.п. - либо Вы не освобождаете память ( не уничтожаете объекты), либо ошибки в деструкторах ( например, что-то уже удалено, возможно, автоматически, а Вы к этому чему-то обращаетесь). Короче, простое правило - все, что насоздавали/навыделяли ручками убить/освободить, желательно в порядке, обратном порядку создания. Если какие-то другие ошибки - обратитесь к разработчику.


 
Petr V. Abramov ©   (2004-03-15 20:59) [3]

Кстати - в 20:54 сообщение YuRock ©   (15.03.04 20:52) [1] у меня видно не было


 
YuRock ©   (2004-03-15 21:16) [4]

> Кстати - в 20:54 сообщение YuRock ©   (15.03.04 20:52) [1] у меня видно не было

А это я машину времени изобрел :))


 
Chcnger   (2004-03-15 21:32) [5]

Runtime error 216/217, Access Violation, Invalid Pointer Operation  да именно это ошибка.

2YuRock
Вродже создаю  ? :  s.Twain:=TDelphiTwain.Create(Nil);
 s.Twain.OnTwainAcquire:=s.TwainTwainAcquire;

И еще почему я не могу указать s:TMyClass; как глобальную переменную(постоянно возникают ошибки), а как локально все работает ?


 
YuRock ©   (2004-03-15 21:34) [6]

Перед s.Twain:=

надо, наверно, :)),

s := TMyClass.Create;


 
Chcnger   (2004-03-15 22:21) [7]

:))))))) Спасибо :)


 
Chcnger   (2004-03-15 22:28) [8]

Вот добавил процедуру. Перед закрытием формы ее вызываю(очищаю все объекты), но все равно происходит ошибка -
Access Violation, Invalid Pointer Operation

procedure FREEALL; stdcall;
begin
  s.Twain.Free;
  s.free;
  BitMap.Free;
end;


library Atwain;

uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ExtCtrls, StdCtrls, DelphiTwain;

type
TEvent = procedure(I: Integer) of object;

type
 TMyClass = class(TObject)
   private
      procedure TwainTwainAcquire(Sender: TObject; const Index: Integer;
                Image: TBitmap; var Cancel: Boolean);
       procedure TwainAcquireProgress(Sender: TObject;
                const Index: Integer; const Image: HBITMAP; const Current,
              Total: Integer);

 public   Twain: TDelphiTwain;
end;

var
  BITMAP:Tbitmap;
  TOT:integer;
  s:TMyClass;
 
procedure TMyClass.TwainAcquireProgress(Sender: TObject;
 const Index: Integer; const Image: HBITMAP; const Current,
 Total: Integer);
begin
       tot:=Current;
end;

procedure TMyClass.TwainTwainAcquire(Sender: TObject; const Index: Integer;
 Image: TBitmap; var Cancel: Boolean);
begin
//  ImageHolder.Picture.Assign(Image);
//  Cancel := TRUE;  {Only want one image}
 BITMAP.Assign(Image);
 BITMAP.SaveToFile("c:\lol.bmp");
end;
procedure SetColorType(Index:integer);
begin
{   Case Index of
  0:s.Twain.Source[SelectedSource].SetIPixelType(tbdBw);
  1:s.Twain.Source[SelectedSource].SetIPixelType(tbdGray);
  2:s.Twain.Source[SelectedSource].SetIPixelType(tbdRgb);
  3:s.Twain.Source[SelectedSource].SetIPixelType(tbdCmyk);
  4:s.Twain.Source[SelectedSource].SetIPixelType(tbdYuvk);
  end;}
end;

procedure SetSourceAndAcquire(UI:boolean;TransferMode,DPI,ImageWidth,ImageHeight,BitDepth,IPixelType:integer);stdcall;//(UI:boolea n;transfer:integer);stdcall;
var
  SelectedSource: Integer;
begin
  Bitmap := TBitmap.Create ;
  Bitmap.Width :=ImageWidth;
  Bitmap.Height :=ImageHeight;
  s := TMyClass.Create;
  s.Twain:=TDelphiTwain.Create(Nil);
  s.Twain.OnTwainAcquire:=s.TwainTwainAcquire;
  s.Twain.OnAcquireProgress:=s.TwainAcquireProgress;
 {It is always recommended to load library dynamically, never forcing}
 {final user to have twain installed}
 if s.Twain.LoadLibrary then
 begin

   {Load source manager}
   s.Twain.SourceManagerLoaded := TRUE;
   {Allow user to select source}
   SelectedSource := s.Twain.SelectSource;
   if SelectedSource <> -1 then
   begin
     {Load source, select transference method and enable (display interface)}
     s.Twain.Source[SelectedSource].Loaded := TRUE;
      case IPixelType of
       0:s.Twain.Source[SelectedSource].SetIPixelType(tbdBw);
       1:s.Twain.Source[SelectedSource].SetIPixelType(tbdGray);
       2:s.Twain.Source[SelectedSource].SetIPixelType(tbdRgb);
       3:s.Twain.Source[SelectedSource].SetIPixelType(tbdCmyk);
       4:s.Twain.Source[SelectedSource].SetIPixelType(tbdYuvk);
      end;
      case TransferMode of
       0:s.Twain.Source[SelectedSource].TransferMode := ttmMemory;
       1:s.Twain.Source[SelectedSource].TransferMode := ttmFile;
       2:s.Twain.Source[SelectedSource].TransferMode := ttmNative;
      end;
     s.Twain.Source[SelectedSource].SetIYResolution(DPI);
     s.Twain.Source[SelectedSource].SetIYResolution(DPI);
     s.Twain.Source[SelectedSource].SetIBitDepth(BitDepth);
     s.Twain.Source[SelectedSource].TransferMode := ttmMemory;
     s.Twain.Source[SelectedSource].ShowUI:=UI;
     s.Twain.Source[SelectedSource].Enabled := TRUE;
   end {if SelectedSource <> -1}
 end
 else
  begin
    showmessage("Twain is not installed.");
   end;
end;
exports SetSourceAndAcquire;

procedure FREEALL; stdcall;
begin
  s.Twain.Free;
  s.free;
  BitMap.Free;
end;

exports FreeAll;
begin
end.


 
YuRock ©   (2004-03-15 22:48) [9]

1. Зачем переменные Bitmap и s глобальные? Почему их не объявить локально и удалять прямо в ф-ции? Ведь такой подход может привести к тому, что этих объектов создастся несколько, а удалятся - в лучшем случае только 1 экземпляр.

И вообще, где конкретно возникает ошибка? В Delphi в Run - Parameters - HostApplication можно прописать exe-файл, который выполняет работу с dll, таким образом можно отлаживать библиотеку. Пройдись отладчиком.


 
Chcnger   (2004-03-16 21:51) [10]

Прямо в фу-ии нельзя, т.к. нужно, чтобы сначала выпрлнилось событие OnTwainAcquire, поэтому и переменные глобальные. !!


 
Chcnger   (2004-03-17 19:41) [11]

.



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

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

Наверх




Память: 0.49 MB
Время: 0.041 c
4-1074685059
Alibaba
2004-01-21 14:37
2004.04.04
Thread, Excel


3-1078404138
AlexA
2004-03-04 15:42
2004.04.04
как в run-time создать обработчик CalcFields


6-1074876404
WM
2004-01-23 19:46
2004.04.04
Как сохранить файл, который сейчас загружен в TWebBrowser?


7-1073810584
TankMan
2004-01-11 11:43
2004.04.04
На счет бут сектора...


14-1078861792
LAMER-XP
2004-03-09 22:49
2004.04.04
исходник тестера





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