使用来自http://delphitwain.sourceforge.net/的DelphiTwain文件并得到一些奇怪的行为。
有没有人有类似的问题,或者有一些建议?
以下代码......
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;
答案 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”是整数
出了什么问题,我需要做些什么呢?