How to get a string, from a pointer

145 views
Skip to first unread message

HBQuerier

unread,
May 31, 2020, 2:23:13 PM5/31/20
to Harbour Users
Hi,

If a C function in a DLL returns a string pointer, how do you get the value?


So for example if this is defined as an LPSTR Pointer, and returns a number, how to you obtain the contents of that pointer:





 
Result_call := hb_DynCall( {"CallGoal", Lib_h, HB_DYN_CALLCONV_STDCALL}, Prolog_Id_n )








HBQuerier

unread,
Jun 17, 2020, 6:19:03 PM6/17/20
to Harbour Users
Mr. Antonio Lineras, of FiveWin/FiveTech fame, was kind enough to write the entire api.

Thank you, sir.


#include "hbdyn.ch"

static hLib

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

function Main()

   local nId, nRetCode

   hLib = hb_libLoad( "INT386W.DLL" )

   if ! Empty( hLib )
      ? "INT386W.DLL loaded!"

      nId = LoadProlog()
      ? "Calling LoadProlog: " + If( nId > 0, "Succeeded!", "Failed!" )

      ? InitGoal( nId, "write('Hello World'). " )
      ? CallGoal( nId )

      ? InitGoal( nId, "input( `Please tell me your name`, Name ). " )
      ? CallGoal( nId )
      ? TellGoal( nId, "brian. " )

      ? InitGoal( nId, "write('What the,...World?'). " )
      ? CallGoal( nId )

      ? InitGoal( nId, "member( brown, [the,quick,brown,fox] ). " )
      ? CallGoal( nId )
      ? ExitGoal( nId )

      ? HaltProlog( nId )

      hb_libFree( hLib )
   endif

return nil

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

function LoadProlog( cCommandLine, nBufferSize, nEncryption, nTickle )

   hb_default( @cCommandLine, "" )
   hb_default( @nBufferSize, 0 )
   hb_default( @nEncryption, 0 )
   hb_default( @nTickle, 0 )

return hb_DynCall( { "LoadProlog", hLib, hb_bitOr( HB_DYN_CALLCONV_STDCALL, HB_DYN_CTYPE_LONG ),;
                   HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CTYPE_LONG, HB_DYN_CTYPE_LONG, HB_DYN_CTYPE_LONG },;
                   cCommandLine, nBufferSize, nEncryption, nTickle )    

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

function InitGoal( nId, cGoal )

return hb_DynCall( { "InitGoal", hLib, hb_bitOr( HB_DYN_CALLCONV_STDCALL, HB_DYN_CTYPE_CHAR_PTR ),;
                   HB_DYN_CTYPE_LONG, HB_DYN_CTYPE_CHAR_PTR }, nId, cGoal )    

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

function CallGoal( nId )

return hb_DynCall( { "CallGoal", hLib, hb_bitOr( HB_DYN_CALLCONV_STDCALL, HB_DYN_CTYPE_CHAR_PTR ),;
                   HB_DYN_CTYPE_LONG }, nId )    

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

function TellGoal( nId, cGoal )

return hb_DynCall( { "TellGoal", hLib, hb_bitOr( HB_DYN_CALLCONV_STDCALL, HB_DYN_CTYPE_CHAR_PTR ),;
                   HB_DYN_CTYPE_LONG, HB_DYN_CTYPE_CHAR_PTR }, nId, cGoal )    

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

function ExitGoal( nId )

return hb_DynCall( { "ExitGoal", hLib, hb_bitOr( HB_DYN_CALLCONV_STDCALL, HB_DYN_CTYPE_BOOL ),;
                    HB_DYN_CTYPE_LONG }, nId )                      

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

function HaltProlog( nId )

return hb_DynCall( { "HaltProlog", hLib, hb_bitOr( HB_DYN_CALLCONV_STDCALL, HB_DYN_CTYPE_BOOL ),;
                    HB_DYN_CTYPE_LONG }, nId )                      

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

function CallOneGoal( nId, cGoal )

   local cResult := InitGoal( nId, cGoal ) + CallGoal( nId, cGoal )
 
   ExitGoal( nId )

return cResult    

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


Reply all
Reply to author
Forward
0 new messages