Todos que usam o Oracle Forms 6i já devem ter batido com o problema do Graphs não rodar em máquinas 64 bits. Não é que "não roda", na verdade o problema está na procedure RUN_PRODUCT. Se o relatório for executado "por fora", através do runtime, o Graphs executará sem problemas.
Então a solução é: não usar a procedure RUN_PRODUCT. Mas então, como fazer?
Para resolver isso, estou mapeando a função ShellExecute() da API do Windows, para invocar o Reports diretamente. A função ficou até simples, mas estou com alguns bugs que não consigo resolver. Agora preciso da ajuda de vocês. =)
Segue o código que fiz. A função executa corretamente na primeira vez, mas não funciona em uma segunda execução (ORA-304500).
PACKAGE SPEC:
PACKAGE RUNREPORTS IS
PROCEDURE RUN_REPORTS (XREP_NOME VARCHAR2,
XREP_PARAMS VARCHAR2);
END;
PACKAGE BODY RUNREPORTS IS
/*
HINSTANCE ShellExecute(
__in_opt HWND hwnd,
__in_opt LPCTSTR lpOperation,
__in LPCTSTR lpFile,
__in_opt LPCTSTR lpParameters,
__in_opt LPCTSTR lpDirectory,
__in INT nShowCmd
);
*/
LH_SHELL32 ORA_FFI.LIBHANDLETYPE;
FH_SHELLEXECUTE ORA_FFI.FUNCHANDLETYPE;
PROCEDURE LOAD IS
BEGIN
LH_SHELL32 := ORA_FFI.LOAD_LIBRARY ('C:\WINDOWS\SYSTEM32\', 'shell32.dll');
FH_SHELLEXECUTE := ORA_FFI.REGISTER_FUNCTION (LH_SHELL32,
'ShellExecuteA',
ORA_FFI.C_STD);
ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_INT);
ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_CHAR_PTR);
ORA_FFI.REGISTER_PARAMETER (FH_SHELLEXECUTE, ORA_FFI.C_INT);
ORA_FFI.REGISTER_RETURN (FH_SHELLEXECUTE, ORA_FFI.C_INT);
END LOAD;
PROCEDURE UNLOAD IS
BEGIN
ORA_FFI.UNLOAD_LIBRARY (LH_SHELL32);
END UNLOAD;
FUNCTION I_SHELLEXECUTE (
FUNCHANDLE ORA_FFI.FUNCHANDLETYPE,
HWND PLS_INTEGER,
LPOPERATOR VARCHAR2,
LPFILE VARCHAR2,
LPPARAMETERS VARCHAR2,
LPDIRECTORY VARCHAR2,
NSHOWCMD PLS_INTEGER)
RETURN PLS_INTEGER;
PRAGMA INTERFACE (C, I_SHELLEXECUTE, 11265);
FUNCTION API_SHELLEXECUTE (
HWND PLS_INTEGER,
LPOPERATOR VARCHAR2,
LPFILE VARCHAR2,
LPPARAMETERS VARCHAR2,
LPDIRECTORY VARCHAR2,
NSHOWCMD PLS_INTEGER)
RETURN PLS_INTEGER IS
RC PLS_INTEGER;
BEGIN
LOAD;
RC :=
I_SHELLEXECUTE (FH_SHELLEXECUTE,
HWND,
LPOPERATOR,
LPFILE,
LPPARAMETERS,
LPDIRECTORY,
NSHOWCMD);
UNLOAD;
RETURN RC;
END API_SHELLEXECUTE;
-- FUNÇÃO EXPORTADA
PROCEDURE RUN_REPORTS (
XREP_NOME VARCHAR2,
XREP_PARAMS VARCHAR2) IS
BEGIN
RETURN API_SHELLEXECUTE (0,
'OPEN',
'RWRUN60.EXE',
'MODULE=' || XREP_NOME || ' ' || XEXE_PARAMS,
'',
/*SW_SHOWNORMAL*/ 1) > 32;
END;
END;