ITPub博客

首页 > 应用开发 > IT综合 > 用Developer2000开发POS机程序常见问题的解决-2

用Developer2000开发POS机程序常见问题的解决-2

原创 IT综合 作者:lilong 时间:2004-11-13 08:29:11 0 删除 编辑
POS机的开发很重要的一点就是解决各种设备的驱动,比如打印机、顾客显示屏、钱箱等。 [@more@]

以打印机为例,在FORM中可以用TEXT_IO来完成打印功能,程序如下:

PROCEDURE prn(linebuf varchar2) IS
BEGIN
declare
out_file text_io.file_type;
begin
out_file:=text_io.fopen('PRN','w');
text_io.putf(out_file,' %sn',linebuf);
text_io.fclose(out_file);
null;
end;
END;

注:需要先在Windows系统下添加相应的打印机驱动程序。

但有时打印机的驱动就是一个dll文件,TEXT_IO就不适用了,需要用ORA_FFI来解决。以下是一个调用dll的例子:

PACKAGE my IS
FUNCTION print(comname in out varchar2,dispstr in out varchar2)
RETURN PLS_INTEGER;
function iniCOM(comname in out varchar2,BaudRates pls_integer,Parity pls_integer,BteSize pls_integer,StopBits pls_integer)
return pls_integer;
FUNCTION closecom(comname in out varchar2)
RETURN PLS_INTEGER;
END;

PACKAGE BODY my IS
my_lhandle ORA_FFI.LIBHANDLETYPE;
print_fhandle ORA_FFI.FUNCHANDLETYPE;
closecom_fhandle ORA_FFI.FUNCHANDLETYPE;
inicom_fhandle ora_ffi.funchandletype;

FUNCTION ff_print(fhandle ORA_FFI.FUNCHANDLETYPE,
comname in out varchar2,
dispstr in out varchar2)
RETURN PLS_INTEGER;
PRAGMA interface(C, ff_print, 11265);
FUNCTION print(comname in out varchar2,dispstr in out varchar2)
RETURN PLS_INTEGER IS
BEGIN
RETURN(ff_print(print_fhandle,comname,dispstr));
END;

FUNCTION ff_closecom(fhandle ORA_FFI.FUNCHANDLETYPE,comname in out varchar2)
RETURN PLS_INTEGER;
PRAGMA interface(C, ff_closecom, 11265);
FUNCTION closecom(comname in out varchar2)
RETURN PLS_INTEGER IS
BEGIN
RETURN(ff_closecom(closecom_fhandle,comname));
END;

FUNCTION ff_inicom(fhandle ORA_FFI.FUNCHANDLETYPE,
ComName in out varchar2,BaudRates pls_integer,Parity pls_integer,BteSize pls_integer,StopBits pls_integer)
RETURN PLS_INTEGER;
PRAGMA interface(C, ff_inicom, 11265);
FUNCTION inicom(
comname in out varchar2,BaudRates pls_integer,Parity pls_integer,BteSize pls_integer,StopBits pls_integer)
RETURN PLS_INTEGER IS
BEGIN
RETURN(ff_inicom(inicom_fhandle,ComName,BaudRates,Parity,BteSize,StopBits));
END;

BEGIN
my_lhandle := ORA_FFI.LOAD_LIBRARY('d:', 'Custlist.dll'); --打印驱动程序,具体的功能函数必须参考说明

print_fhandle := ORA_FFI.REGISTER_FUNCTION
(my_lhandle, 'writeCOM', ORA_FFI.PASCAL_STD);
inicom_fhandle := ORA_FFI.REGISTER_FUNCTION
(my_lhandle, 'iniCOM', ORA_FFI.PASCAL_STD);
closecom_fhandle := ORA_FFI.REGISTER_FUNCTION
(my_lhandle, 'CloseCOM', ORA_FFI.PASCAL_STD);

ora_ffi.register_parameter(print_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_parameter(print_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_return(print_fhandle,ora_ffi.c_int);

ora_ffi.register_parameter(closecom_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_return(closecom_fhandle,ora_ffi.c_int);

ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_char_ptr);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_parameter(inicom_fhandle,ora_ffi.c_int);
ora_ffi.register_return(inicom_fhandle,ora_ffi.c_int);
END;

PROCEDURE prn(linebuf varchar2) IS
BEGIN
declare
sl pls_integer;
str varchar2(200);
comname varchar2(200);
cl pls_integer;
BaudRates pls_integer;
Parity pls_integer;
BteSize pls_integer;
StopBits pls_integer;
begin
str:=linebuf;
comname:='COM4'; --COM口
BaudRates:=9600; --波特率
Parity:=0; --无奇偶校验
BteSize:=8; --数据位
StopBits:=1; --停止位
cl:=my.inicom(comname,BaudRates,Parity,BteSize,StopBits); --初始化,其实初始化一次就行,不需要每次都初始化
sl:=my.print(comname,str); --打印输出
end;
END;

钱箱、客显都与打印机类似,只要有相对的dll。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18966/viewspace-780594/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    50
  • 访问量
    904718