Delphi Twain выдача справки - PullRequest
       32

Delphi Twain выдача справки

1 голос
/ 06 апреля 2009

Используя файлы DelphiTwain из http://delphitwain.sourceforge.net/, я получаю странное поведение.

  1. После каждого сканирования удерживается немного больше памяти.
  2. Примерно через час повторных сканирований отсканированное изображение увеличивается примерно в 10 раз и сохраняется только верхний левый квадратный дюйм.

У кого-нибудь были похожие проблемы или есть предложения?

Код ниже ...

try
  try
    Twain := TDelphiTwain.Create(self);

    Twain.OnTwainAcquire := TwainAcquireHandler; //manually set the event handler
    Twain.OnSourceFileTransfer := TwainSourceFileTransfer;
    Twain.OnSourceSetupFileXfer := TwainSourceSetupFileXfer;

    Twain.LoadLibrary;
    Twain.LoadSourceManager;
    Twain.Source[0].Loaded := TRUE;
    Twain.Source[0].TransferMode := ttmFile;
    Twain.Source[0].EnableSource(false, false);
  except on e : exception do
    showmessage('Error loading Scanner.');
  end;

  try
    while Twain.Source[0].Enabled do
      Application.ProcessMessages;
  except on e : exception do
    showmessage('Error Scanning Packing List.');
  end;
finally
  Twain.Source[0].Loaded := FALSE;
  Twain.UnloadSourceManager(true);
  Twain.UnloadLibrary;
  Twain.Destroy;
end;

Ответы [ 5 ]

3 голосов
/ 06 апреля 2009

Поскольку TDelphiTwain представляется компонентом, который вы создаете в коде, я бы рекомендовал передать nil для конструктора и вызвать метод .Free или (как предложил Джозеф) FreeAndNil.

Twain := TDelphiTwain.Create(nil);
try
  try
    Twain.OnTwainAcquire := TwainAcquireHandler; //manually set the event handler
    Twain.OnSourceFileTransfer := TwainSourceFileTransfer;
    Twain.OnSourceSetupFileXfer := TwainSourceSetupFileXfer;

    Twain.LoadLibrary();
    Twain.LoadSourceManager();
    Twain.Source[0].Loaded := True;
    Twain.Source[0].TransferMode := ttmFile;
    Twain.Source[0].EnableSource(False, False);
  except on e : exception do
    showmessage('Error loading Scanner.');
  end;

  try
    while Twain.Source[0].Enabled do
      Application.ProcessMessages;
  except on e : exception do
    showmessage('Error Scanning Packing List.');
  end;
  Twain.Source[0].Loaded := False;
  Twain.UnloadSourceManager(True);
  Twain.UnloadLibrary();
finally
  FreeAndNil(Twain);
end;

Я бы также рекомендовал улучшить обработку исключений, но это не относится к заданному вами вопросу. Единственное, что пользователи увидят и сообщат вам (или, что еще хуже, тихий парень в углу, ответственный за вашу ИТ-поддержку, который любит получать неописуемые ошибки от пользователей), это «Ошибка при выполнении чего-либо»

Удачи

Еще одна область, на которую следует обратить внимание, это если сканер поддерживает WIA (Windows Image Acquisition)

var
  DevMgr: IDeviceManager;
  Scanner: Idevice;
  Picture: IItem;
  Image: OleVariant;
  AImage: IImageFile;
begin
  DevMgr := CreateOleObject('WIA.DeviceManager') as IDeviceManager;

  // Figure out which device is the scanner
  Scanner:= DevMgr.DeviceInfos.Item[1].Connect;

  //Command: Figure out which command scans..
  Picture := Scanner.ExecuteCommand(Scanner.Commands.Item[1].CommandID);

  //Transfer as JPG
  Image := Picture.Transfer(Picture.Formats.Item[1]);

  //Save the image
  AImage := IImageFile(Image);
  AImage.SaveFile('c:\wia_viaScanner\image.' + AImage.FileExtension);
end;

Более подробную информацию о библиотеке WIA можно найти здесь .. http://msdn.microsoft.com/en-us/library/ms629859(VS.85).aspx

2 голосов
/ 06 апреля 2009

Проверка кода в рамках этих вызовов может быть плодотворной:

TwainAcquireHandler;
TwainSourceFileTransfer;
TwainSourceSetupFileXfer;

Кто-нибудь из них создает объекты, не освобождая их?

Если вы используете Delphi 2006 или новее, вы можете добавить эту строку в ваш файл .DPR:

 ReportMemoryLeaksOnShutdown := True;

Затем воспроизведите утечку памяти, закройте ваше приложение ... и оно подробно опишет утечки. Немного больше информации об этом можно найти здесь .

В другой заметке я бы предложил заменить

Twain.Destroy;

с

FreeAndNil(Twain);

.Destroy будет вызывать деструктор напрямую, в то время как FreeAndNil - более безопасная альтернатива, которая также не позволяет переменной Twain указывать куда-либо опасное. (См. Принятый ответ на этот вопрос ).

0 голосов
/ 06 мая 2009

в KevinRF:
Мне нужно использовать автоматизацию WIA в проекте Delphi 7. Я зарегистрировал WIAAut.dll в своей системе, импортировал эту библиотеку в Delphi, вставил код вашей программы в мой проект и получил несколько ошибок:

Scanner:= DevMgr.DeviceInfos.Item[1].Connect;

Типы фактических и формальных параметров var должны быть идентичны
в «Item» должен быть Item [var Index: OleVariant], но «1» является целым числом

Что не так, что мне нужно, чтобы это работало?

0 голосов
/ 06 апреля 2009

Что ты делаешь, когда получаешь Изображение, ты сохранил в памяти? Или библиотека может иметь некоторые утечки памяти, вы можете проверить, правда ли это с FastMM4.

0 голосов
/ 06 апреля 2009

Я не могу решить проблему, о которой вы сообщаете, но у вас там занятый цикл, который поглотит процессорное время.

...