Re: Forms + MS Help ?

From: Lee Levy <levy.lee.ls_at_bhp.com.au>
Date: 1996/06/05
Message-ID: <4p2jdr$e9_at_gossamer.itmel.bhp.com.au>


In article <1996Jun4.053653.14268_at_van.oz.au>, tim_at_van.oz.au (Tim Nguyen) says:

>
>Anyone know how to call a MS Help file from within Forms but can still
>working on the called form. If I use HOST command to call the external
>winhelp.exe then it won't release the control back until I close the
>Help program. 

ORA_FFI may let you do it - I'm not sure. The ORA_FFI package provides a foreign function interface for invoking C functions in a dynamic library.
DDEs would also work, provided winhelp will allow itself to called as a server, not just a client (read up on DDEs)

Anyway, I have the following code which may be of use, using ORA_FFI. I havent tried it, so no guarantees:

FROM: Mark Mason <mmason_at_c-s-p.com>

TO: Lee levy

SUBJECT: Re: Calling winhelp from Oracle Forms 4.5.6.3.3



Here's the WINHELP package that I just implemented. I wrote a "wrapper" procedure called "CALL_WINHELP" that made the interface for my system a little easier. The rest of the unreadable code is the ora_ffi calls to the real winhelp. Sorry in advance if theres a problem. Like I say, I just got it going this morning and tried it a few times with great success.

PACKAGE WinHelp IS

  FUNCTION Help_Convert(command IN VARCHAR2)

                        RETURN PLS_INTEGER  ;

  PROCEDURE call_winhelp (
      ls_helpFile IN varchar2,
      ls_command  IN varchar2,
      ls_context  IN varchar2);

  FUNCTION WinHelp ( hwnd IN PLS_INTEGER, lpszHelpFile IN  VARCHAR2,
                     fuCommand IN PLS_INTEGER, dwData IN PLS_INTEGER )
  RETURN PLS_INTEGER;
END; PACKAGE BODY WinHelp IS
  lh_USER ora_ffi.libHandleType;
  fh_WinHelp ora_ffi.funcHandleType;

    FUNCTION Help_Convert(command IN VARCHAR2)

                          RETURN PLS_INTEGER  
    IS
    BEGIN
/* The windows.h definitions for command */

/* HELP_CONTEXT 0x0001 */
/* HELP_QUIT 0x0002 */
/* HELP_INDEX 0x0003 */
/* HELP_CONTENTS 0x0003 */
/* HELP_HELPONHELP 0x0004 */
/* HELP_SETINDEX 0x0005 */
/* HELP_SETCONTENTS 0x0005 */
/* HELP_CONTEXTPOPUP 0x0008 */
/* HELP_FORCEFILE 0x0009 */
/* HELP_KEY 0x0101 */
/* HELP_COMMAND 0x0102 */
/* HELP_PARTIALKEY 0x0105 */
/* HELP_MULTIKEY 0x0201 */
/* HELP_SETWINPOS 0x0203 */

      if command = 'HELP_CONTEXT'    then return(1);   end if;   if
      command = 'HELP_KEY'        then return(257); end if;  if
      command = 'HELP_PARTIALKEY' then return(261); end if;  if
      command = 'HELP_QUIT'       then return(2);   end if;  /* If
      nothing else go to the contents page */  return(3);      
    END;
--
  procedure call_winhelp (
      ls_helpFile IN varchar2,
      ls_command  IN varchar2,
      ls_context  IN varchar2
  ) is
  nRetVal  PLS_INTEGER;
  hWnd     PLS_INTEGER;
  htype    PLS_INTEGER;
  ln_command PLS_INTEGER;
  ln_context PLS_INTEGER;
  BEGIN
   if(UPPER(SUBSTR(ls_helpFile, -3, 3)) = 'HLP') then
    ln_command := help_convert ( ls_command );
    if ls_context is not null then
       ln_context := TO_PLS_INTEGER ( to_number(ls_context));
    end if;
    hWnd :=
    TO_PLS_INTEGER(GET_ITEM_PROPERTY(NAME_IN('SYSTEM.CURSOR_ITEM'),
    WINDOW_HANDLE)); nRetVal := WinHelp(hWnd, ls_helpfile, ln_command,
    ln_context); Message('Return value :'||TO_CHAR(nRetVal),
    ACKNOWLEDGE);
   else
    fp_msg('Invalid help file name: '||ls_helpFile);
   end if;  
  END;

  FUNCTION i_WinHelp ( funcHandle IN ora_ffi.funcHandleType, 
                       hwnd IN PLS_INTEGER, 
                       lpszHelpFile IN OUT VARCHAR2,
                       fuCommand IN PLS_INTEGER,
                       dwData IN PLS_INTEGER )
    RETURN PLS_INTEGER;
    PRAGMA INTERFACE(C,i_WinHelp,11265);

  FUNCTION WinHelp ( hwnd IN PLS_INTEGER, lpszHelpFile IN  VARCHAR2,
                     fuCommand IN PLS_INTEGER, dwData IN PLS_INTEGER )
    RETURN PLS_INTEGER IS 
      hwnd_l PLS_INTEGER := hwnd;
      lpszHelpFile_l VARCHAR2(512) := lpszHelpFile;
      fuCommand_l PLS_INTEGER := fuCommand;
      dwData_l PLS_INTEGER := dwData;
      rc PLS_INTEGER;
      BEGIN 
        rc  := i_WinHelp ( fh_WinHelp, hwnd_l, lpszHelpFile_l, 
                           fuCommand_l, dwData_l );
        RETURN (rc);
      END ;

  BEGIN 
    BEGIN 
      lh_USER := ora_ffi.find_library ( 'USER.EXE' );
    EXCEPTION WHEN ora_ffi.FFI_ERROR THEN 
      lh_USER := ora_ffi.load_library ( NULL, 'USER.EXE' );
    END ;
    fh_WinHelp := ora_ffi.register_function ( lh_USER, 'WinHelp',
                                              ora_ffi.PASCAL_STD );
    ora_ffi.register_parameter ( fh_WinHelp, ORA_FFI.C_INT );
    ora_ffi.register_parameter ( fh_WinHelp, ORA_FFI.C_CHAR_PTR );
    ora_ffi.register_parameter ( fh_WinHelp, ORA_FFI.C_INT );
    ora_ffi.register_parameter ( fh_WinHelp, ORA_FFI.C_LONG );
    ora_ffi.register_return ( fh_WinHelp, ORA_FFI.C_INT );

  END WinHelp;

---------------------------------------------------
  Lee Levy, ISSD Technical Dream Team, Del Code (34)
  BHP Information Technology,  ACN 006 476 213
  PO Box 261, Warrawong, NSW 2502, Australia
  PH: +61 42 75-5485  Fax: -5500  Tie: 8855- 
  Internet :  levy.lee.ls_at_bhp.com.au
---------------------------------------------------
Opinions expressed are mostly my own, so give me some credit.
Received on Wed Jun 05 1996 - 00:00:00 CEST

Original text of this message