1

使用来自http://delphitwain.sourceforge.net/的 DelphiTwain 文件,我得到了一些奇怪的行为。

  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;
4

5 回答 5

3

由于 TDelphiTwain 似乎是您在代码中创建的组件,因此我建议为构造函数传入nil并调用 .Free 方法或(如 Joseph 所建议的)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;

我还建议更好的异常处理,但与您提出的问题无关。用户唯一会看到并向您报告(或者更糟糕的是,角落里负责您的 IT 支持的安静的人,他喜欢从用户那里得到非描述性错误)是“做某事时出错”

祝你好运

另一个需要关注的领域是扫描仪是否支持 WIA(Windows 图像采集)

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

于 2009-04-06T17:46:03.310 回答
2

检查这些调用中的代码可能会很有成效:

TwainAcquireHandler;
TwainSourceFileTransfer;
TwainSourceSetupFileXfer;

这些中的任何一个是否在不释放它们的情况下创建了任何对象?

如果您使用的是 Delphi 2006 或更高版本,则可以将此行添加到您的 .DPR 文件中:

 ReportMemoryLeaksOnShutdown := True;

然后重现内存泄漏,关闭您的应用程序......它将详细描述泄漏。可以在此处找到有关此的更多信息。

另一方面,我建议更换

Twain.Destroy;

FreeAndNil(Twain);

.Destroy 将直接调用析构函数,而 FreeAndNil 是一种更安全的替代方法,它还可以防止“Twain”变量指向任何危险的地方。(请参阅此问题的已接受答案)。

于 2009-04-06T17:21:00.830 回答
0

致 KevinRF:
我需要在 Delphi 7 项目中使用 WIA 自动化。我在我的系统中注册了 WIAAut.dll,将此库导入 Delphi 并将您的程序代码传递到我的项目中,但出现了一些错误:

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

“Item”中实际和形式var参数的类型必须相同
,必须是Item[var Index: OleVariant],但“1”是整数

怎么了,我需要什么让它工作?

于 2009-05-06T06:54:54.957 回答
0

当你得到图像时你在做什么,你记住了吗?或者库可能有一些内存泄漏,您可以使用 FastMM4 检查是否属实。

于 2009-04-06T17:22:37.830 回答
0

我无法解决您报告的问题,但是您那里有一个繁忙的循环,会占用 CPU 时间。

于 2009-04-06T16:46:00.117 回答