用Developer2000開發POS機程式常見問題的解決-2

lilong發表於2004-11-13
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章