德尔福吐温问题的帮助

时间:2009-04-06 15:22:14

标签: delphi twain

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

  1. 每次扫描后,还会保留更多内存。
  2. 重复扫描一小时左右后,扫描的图像大约放大10倍,并且只存储左上方的英寸。
  3. 有没有人有类似的问题,或者有一些建议?

    以下代码......

    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 个答案:

答案 0 :(得分: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 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

答案 1 :(得分:2)

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

TwainAcquireHandler;
TwainSourceFileTransfer;
TwainSourceSetupFileXfer;

这些是否会在不释放任何对象的情况下创建任何对象?

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

 ReportMemoryLeaksOnShutdown := True;

然后重现内存泄漏,关闭你的应用......它将详细描述泄漏。关于此can be found here的更多信息。

另一方面,我建议更换

Twain.Destroy;

FreeAndNil(Twain);

.Destroy会直接调用析构函数,而FreeAndNil是一个更安全的替代品,它也会阻止“Twain”变量指向任何危险的地方。 (参见接受的answer to this question)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

出了什么问题,我需要做些什么呢?