我有一个用于扫描向我的应用程序发送消息的图像的 DLL。文档是这样描述的:
如果扳机被拉动,图像数据将被发送到 DLL。WM_XFERSTATUS 与有关图像大小的信息一起发送到主机应用程序。当接收到第一个传输状态消息时,主机应用程序应通过调用 SNAPI_SetImageBuffer 为图像提供目标缓冲区。将整个图像从扫描仪传输到 DLL 后,应用程序会收到一条 Windows 消息,指示图像数据已存储。
第一条消息记录如下:
消息 WM_XFERSTATUS
描述 图像数据正在从扫描仪传输。
表 1-1 Windows 消息(续)
属性 描述
DLL 数据、错误报告、消息和哔声代码 1 - 5
值 WM_APP+7参数
- wParam – 指向 DWPARAM 结构的指针(转换为 DWPARAM *)。
- LODWORD (wparam) – 到目前为止接收的字节总数。
- HIDWORD (wparam) – 预期的总字节数。
- lParam – 发布消息的设备的句柄。
第二条消息,当图像完成传输时,是这样的:
消息 WM_IMAGE
描述 图像数据可从扫描仪获得,并存储在先前调用 SNAPI_SetImageBuffer 提供的缓冲区中。
值 WM_APP+2参数
- wParam – 指向 DWPARAM 结构的指针(转换为 DWPARAM *)
- LODWORD (wparam) – 存储数据的缓冲区状态
- HIDWORD (wparam) – 数据的长度(以字节为单位)
- lParam – 发布消息的设备句柄
数据格式 实际图像数据。
我使用这段代码来获取消息,但是当我设置数据的长度时,会引发异常:
type
TScanner = class
public
Device: THandle;
Connected: Boolean;
ImageData: array of Byte;
Pending: Boolean;
procedure Connect;
procedure Disconnect;
procedure RequestSnapshot;
procedure SetImageBuffer(Size: Integer);
end;
procedure TMyform.FormCreate(Sender: TObject);
var
Devices: array[0..MAX_SCANNER-1] of THandle;
NumScanners, I: Integer;
Scanner: TScanner;
begin
Scanners := TObjectList.Create;
ScannerWnd := AllocateHWnd(ScannerWndProc);
CheckSNAPIStatus(SNAPI_Init(ScannerWnd, Devices[0], NumScanners));
for I := 0 to NumScanners-1 do
begin
Scanner := TScanner.Create;
Scanner.Device := Devices[I];
Scanners.Add(Scanner);
// add it to the UI somewhere...
end;
end;
procedure TMyform.FormDestroy(Sender: TObject);
begin
DeallocateHWnd(ScannerWnd);
Scanners.Free;
end;
procedure TScanner.SetImageBuffer(Size: Integer);
begin
SetLength(ImageData, Size); //Hear I get the error
SNAPI_SetImageBuffer(Device, Pointer(ImageData), Length(ImageData));
end;
procedure TMyform.ScannerWndProc(var Message: TMessage);
var
Scanner: TScanner;
begin
case Message.Msg of
WM_XFERSTATUS:
begin
Scanner.SetImageBuffer(HiDWord(Message.WParam));
end;
WM_IMAGE:
begin
if (LO(Message.WParam) and BUFFERSIZE_MASK) <> BUFFERSIZE_GOOD then
raise Exception.Create('Image buffer error');
// use Scanner.ImageData up to HIDWORD(Message.WParam) bytes as needed...
SetLength(Scanner.ImageData, 0);
end;
注意:我使用了该HIDWORD
功能,但它在 Delphi 中不起作用。我用HIWORD
函数替换了它。
请问如何获取图像数据