Re: ORA_FFI problem in Forms 4.5(win9x) with Crystal Reports

From: Mark Tomlinson <marktoml_at_hotmail.com>
Date: Mon, 18 Sep 2000 20:52:32 -0400
Message-ID: <ssddfpgt9af01c_at_corp.supernews.com>


One thing to note is that forms will unload the library between calls. This is probably why you can't get it to work. Use a call to the WINDOWS API for LoadLibrary to force Forms to load the library outside the ORA FFI reference, this will keep an extra handle count incremented on the DLL so that Forms will not be able to unload it between the calls you are making.

"Sean McMurray" <smcmurray_at_aoce.utah.edu> wrote in message news:39BE7658.BCEAFD54_at_aoce.utah.edu...
> I am trying to lauch Crystal Reports 6 reports from Forms 4.5 using the
> crpe32.dll API.
> I am able to load_library, and register three functions: PEOpenEngine,
> PEPrintReport, and PECloseEngine.
>
> I can actually execute the PEOpenEngine and PECloseEngine without
> incident, but when I execute the PEPrintReport, I get an error.
> If anyone can set me straight, I'd be grateful.
>
> Below is the API definition for PEPrintReport, and my package body.
>
> short CRPE_API PEPrintReport (
> char FAR *reportFilePath,
> BOOL toDefaultPrinter,
> BOOL toWindow,
> char FAR *title,
> int left,
> int top,
> int width,
> int height,
> DWORD style,
> HWND parentWindow
> );
>
> PACKAGE BODY crys_rep IS
> lh_rep ora_ffi.libHandleType;
> fh_openeng ora_ffi.funcHandleType;
> fh_pr ora_ffi.funcHandleType;
> fh_closeeng ora_ffi.funcHandleType;
>
> CW_USEDEFAULT PLS_INTEGER DEFAULT -32768;
>
> FUNCTION ff_OpenEng(ff_handle IN ORA_FFI.FUNCHANDLETYPE)
> RETURN PLS_INTEGER;
> PRAGMA interface(C, ff_OpenEng, 11265);
>
> FUNCTION ff_PEPrintReport(ff_handle IN ORA_FFI.FUNCHANDLETYPE,
> reportFilePath IN OUT VARCHAR2,
> toDefaultPrinter IN BINARY_INTEGER, toWindow IN
> BINARY_INTEGER,
> title IN VARCHAR2,
> left IN PLS_INTEGER, top IN PLS_INTEGER,
> width IN PLS_INTEGER, height IN PLS_INTEGER,
> style IN PLS_INTEGER, parentWindow IN PLS_INTEGER)
> RETURN PLS_INTEGER;
> PRAGMA interface(C, ff_PEPrintReport, 11265);
>
> FUNCTION ff_CloseEng(ff_handle IN ORA_FFI.FUNCHANDLETYPE)
> RETURN PLS_INTEGER;
> PRAGMA interface(C, ff_CloseEng, 11265);
>
>
> PROCEDURE PrintRep(filename IN OUT VARCHAR2) IS
> pr_res PLS_INTEGER;
> BEGIN
> if (ff_OpenEng(fh_openeng) =1 then
> pr_res:=ff_PEPrintReport(fh_pr, filename, 0, 1, 'Report
> Results', CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
> CW_USEDEFAULT, NULL);
> message(to_char(ff_CloseEng(fh_closeeng)), ACKNOWLEDGE);
> end if;
> EXCEPTION
> WHEN OTHERS then
> message('Report Failed', ACKNOWLEDGE);
> message(to_char(ff_CloseEng(fh_closeeng)), ACKNOWLEDGE);
> END;
>
> BEGIN
> lh_rep := ora_ffi.load_library('c:\windows\system\', 'crpe32.dll');
>
> fh_openeng := ora_ffi.register_function(lh_rep,'PEOpenEngine',
> ora_ffi.PASCAL_STD);
> ora_ffi.register_return(fh_openeng, ORA_FFI.C_INT);
>
> fh_pr := ora_ffi.register_function(lh_rep,'PEPrintReport',
> ora_ffi.PASCAL_STD);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_CHAR_PTR);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_INT);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_INT);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_CHAR_PTR);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_INT);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_INT);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_INT);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_INT);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_LONG);
> ora_ffi.register_parameter(fh_pr, ORA_FFI.C_INT);
> ora_ffi.register_return(fh_pr, ORA_FFI.C_INT);
>
> fh_closeeng := ora_ffi.register_function(lh_rep,'PECloseEngine',
> ora_ffi.PASCAL_STD);
> ora_ffi.register_return(fh_closeeng, ORA_FFI.C_VOID_PTR);
> END;
>
> --
>
> Sean McMurray
>
>
Received on Tue Sep 19 2000 - 02:52:32 CEST

Original text of this message