Chamar funções da API Windows do Forms/Reports 6i

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Estou tentando chamar a função "MessageBoxA" (User32.dll), mas estou tendo muitos erros estranhos... Alguém conseguiu fazer isso usando ORA_FFI?

Criei um pll conforme abaixo:

Selecionar tudo

PACKAGE USER32DLL IS
  FUNCTION MESSAGE (XMESSAGE VARCHAR2, XTITLE VARCHAR2, XTYPE PLS_INTEGER)
    RETURN PLS_INTEGER;
END;
----------
PACKAGE BODY USER32DLL IS
  LIB      ORA_FFI.LIBHANDLETYPE;
  F_MESSAGE     ORA_FFI.FUNCHANDLETYPE;

  FUNCTION I_MESSAGE (FUNCHANDLE IN ORA_FFI.FUNCHANDLETYPE, XHWND VARCHAR2, XMESSAGE VARCHAR2, XTITLE VARCHAR2, XTYPE VARCHAR2) RETURN PLS_INTEGER;

  PRAGMA INTERFACE (C, I_MESSAGE, 11265);

  FUNCTION MESSAGE(XMESSAGE VARCHAR2, XTITLE VARCHAR2, XTYPE PLS_INTEGER) RETURN PLS_INTEGER IS
  BEGIN
	LIB := ORA_FFI.LOAD_LIBRARY (NULL, 'User32.dll');
	  
  	F_MESSAGE := ORA_FFI.REGISTER_FUNCTION (LIB, 'MessageBoxA', ORA_FFI.C_STD);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_INT);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_CHAR_PTR);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_CHAR_PTR);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_INT);
  	ORA_FFI.REGISTER_RETURN (F_MESSAGE, ORA_FFI.C_INT);
    
    RETURN I_MESSAGE (F_MESSAGE, 0, XMESSAGE, XTYPE, XTYPE);
  END;
END;
Chamando a função, a mensagem é exibida, mas com erros estranhos, que mudam a cada chamada (às vezes sem ícones, às vezes sem botões, sem formato padrão do windows etc...).

Estou tentando criar esse pll para ser invocado do Reports 6i, mas nem mesmo no Forms estou conseguindo.

Alguma sugestão?
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Consegui aqui.

Selecionar tudo

PACKAGE USER32DLL IS
  PROCEDURE INFORMATION (XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2);
  FUNCTION QUESTION (XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2) RETURN BOOLEAN;
  PROCEDURE ERROR (XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2);
END;
-------------------------
PACKAGE BODY USER32DLL IS
  LIB      		ORA_FFI.LIBHANDLETYPE;
  F_MESSAGE     ORA_FFI.FUNCHANDLETYPE;
  
	MSG_OK CONSTANT PLS_INTEGER := 64;
	MSG_SIM_não CONSTANT PLS_INTEGER := 36;
	MSG_ERRO CONSTANT PLS_INTEGER := 16;
	
	RET_SIM CONSTANT PLS_INTEGER := 6;
	RET_não CONSTANT PLS_INTEGER := 7;
  
  PROCEDURE INIT IS
  BEGIN
    LIB := ORA_FFI.LOAD_LIBRARY ('C:\WINDOWS\SYSTEM32\', 'User32.dll');
	  
  	F_MESSAGE := ORA_FFI.REGISTER_FUNCTION (LIB, 'MessageBoxA', ORA_FFI.C_STD);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_INT);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_CHAR_PTR);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_CHAR_PTR);
  	ORA_FFI.REGISTER_PARAMETER (F_MESSAGE, ORA_FFI.C_INT);
  	ORA_FFI.REGISTER_RETURN (F_MESSAGE, ORA_FFI.C_INT);
  END;

  FUNCTION I_MESSAGE (FUNCHANDLE IN ORA_FFI.FUNCHANDLETYPE,
  									  XHWND IN BINARY_INTEGER, 
  									  XMESSAGE IN VARCHAR2, 
  									  XTITLE IN VARCHAR2, 
  									  XTYPE IN PLS_INTEGER) RETURN PLS_INTEGER;

  PRAGMA INTERFACE (C, I_MESSAGE, 11265);

  FUNCTION MESSAGE(XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2, XTYPE IN PLS_INTEGER) RETURN PLS_INTEGER IS
  BEGIN
    INIT;
    RETURN I_MESSAGE (F_MESSAGE, 0, XMESSAGE, XTITLE, XTYPE);
  END;

	--FUNÇÕES EXPORTADAS
  PROCEDURE INFORMATION (XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2) IS
  	RET NUMBER;
  BEGIN
  	RET := MESSAGE(XMESSAGE, XTITLE, MSG_OK);
  END;
  
  FUNCTION QUESTION (XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2) RETURN BOOLEAN IS
  BEGIN
  	RETURN MESSAGE(XMESSAGE, XTITLE, MSG_SIM_não) = RET_SIM;
  END;
  
  PROCEDURE ERROR (XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2) IS
  	RET NUMBER;
  BEGIN
  	RET := MESSAGE(XMESSAGE, XTITLE, MSG_ERRO);
  END;

END;
Agora meus relatórios terão mensagens decentes ao invés do horrível SRW.MESSAGE(). :D
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Legal !!

Tem como você enviar um print pra gente ver como que ficaram as novas mensagem ? PARABENS!
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Exemplo simples:

Selecionar tudo

function XPAR1ValidTrigger return boolean is
begin
	if :XPAR1 is null then
  	USER32DLL.ERROR('Informe a data inicial!', 'Erro');
  	return (FALSE);
  end if;
  return (TRUE);
end;
Imagem

Selecionar tudo

function XPAR2ValidTrigger return boolean is
begin
  return USER32DLL.QUESTION('Com a data final não informada, o relatório irá buscar informações até' || chr(10) ||'a data atual. Deseja prosseguir?', 'Pergunta');
end;
Imagem

Havia um problema no código que enviei no post anterior. Como não é passado o handle da aplicação, a caixa de mensagem fica "desligada" do reports; se clicar na janela do fundo a mensagem perdia o foco, e o relatório ficava travado. Contornei usando uma opção da função MessageBoxA() que mantém a janela no topo:

Selecionar tudo

MSG_TOPO 				CONSTANT PLS_INTEGER := 262144; --'0x040000'

--///////////////////////////////

FUNCTION MESSAGE(XMESSAGE IN VARCHAR2, XTITLE IN VARCHAR2, XTYPE IN PLS_INTEGER) RETURN PLS_INTEGER IS
  BEGIN
    INIT;
    RETURN I_MESSAGE (F_MESSAGE, 0, XMESSAGE, XTITLE, XTYPE + MSG_TOPO);
  END;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes