PDA

View Full Version : Call DWord... etc



David
21-10-2013, 10:18
Hi all,

This code works like a charm into PowerBasic


#COMPILE DLL "ThinBasic_NeoSDK"
#INCLUDE "Win32Api.inc"
#INCLUDE "ThinCore.inc"
'---------------------------------------------------

GLOBAL nbGetVar AS DWORD
GLOBAL nbSetVar AS DWORD
GLOBAL nbPlayAction AS DWORD
GLOBAL nbInterface AS DWORD
GLOBAL nbWinHandle AS DWORD
GLOBAL zData AS ASCIIZ * 64
GLOBAL zz AS ASCIIZ PTR
GLOBAL dwData AS DWORD

'---------------------------------------------------

DECLARE SUB GetVarProcType(BYREF VarName AS ASCIIZ, BYREF Value AS ASCIIZ)
DECLARE SUB SetVarProcType(BYREF VarName AS ASCIIZ, BYREF Value AS ASCIIZ)
DECLARE SUB PlayActionProcType(BYREF s AS ASCIIZ)
DECLARE FUNCTION InterfaceProcType(BYVAL InterfaceID AS LONG, BYREF zData AS ASCIIZ) AS LONG
DECLARE SUB dllHandlerProcType(BYVAL Reason AS LONG)

'---------------------------------------------------

SUB Exec_NeoSDK_SetVariable(BYVAL Variable$,BYVAL vuelta$)
CALL DWORD nbSetVar USING SetVarProcType(BYCOPY variable$, BYCOPY vuelta$)
END SUB

'---------------------------------------------------

SUB Exec_NeoSDK_PlayScript(BYVAL Script$)
CALL DWORD nbPlayAction USING PlayActionProcType(BYCOPY Script$)
END SUB

'---------------------------------------------------

FUNCTION Exec_NeoSDK_GetVariable (VarName AS STRING) AS STRING
LOCAL sName AS ASCIIZ * 40
LOCAL sptr AS ASCIIZ PTR
zData = ""
sName = VarName
CALL DWORD nbGetVar USING GetVarProcType(BYREF sName, BYREF zData)
sPtr = VARPTR(zData)
sName = @@sptr
FUNCTION = Sname
END FUNCTION

'---------------------------------------------------

FUNCTION Exec_NeoSDK_GetObjectHandle (sname AS STRING) AS LONG
LOCAL sptr AS ASCIIZ PTR
sPtr = VARPTR(sname)
zData = @sptr
CALL DWORD nbInterface USING InterfaceProcType (BYVAL 7, BYREF zData)
zz = VARPTR(zData)
FUNCTION = VAL(@@zz)
END FUNCTION

'---------------------------------------------------

FUNCTION Exec_NeoSDK_Get_nbInterface (ID AS LONG, texto AS STRING) AS STRING
LOCAL sptr AS ASCIIZ PTR
sPtr = VARPTR(texto)
zData = @sptr
CALL DWORD nbInterface USING InterfaceProcType (BYVAL ID, BYREF zData)
zz = VARPTR(zData)
FUNCTION = @@zz
END FUNCTION

'*********************************************************
' ***** Following function may not be modificate ********
'*********************************************************
SUB nbRegisterScriptProcessor ALIAS "_nbRegisterScriptProcessor@4" (BYVAL PlayActionProc AS DWORD) EXPORT
'***************************** Do Not MODIFY ********************************
nbPlayAction = PlayActionProc
'****************************************************************************
END SUB

'*********************************************************
' ***** Following function may not be modificate ********
'*********************************************************
SUB nbRegisterInterfaceAccess ALIAS "_nbRegisterInterfaceAccess@4" (BYVAL InterfaceProc AS DWORD) EXPORT
'***************************** Do Not MODIFY ********************************
nbInterface = InterfaceProc
'****************************************************************************
END SUB

'----------------------------------------------------------------------------
FUNCTION LoadLocalSymbols ALIAS "LoadLocalSymbols" (OPTIONAL BYVAL sPath AS STRING) EXPORT AS LONG
' This function is automatically called by thinCore whenever this DLL is loaded.
' This function MUST be present in every external DLL you want to use
' with thinBasic
' Use this function to initialize every variable you need and for loading the
' new symbol (read Keyword) you have created.
'----------------------------------------------------------------------------
thinBasic_LoadSymbol "NeoSDK_PlayScript" , %thinBasic_ReturnNone , CODEPTR(Exec_NeoSDK_PlayScript) , %thinBasic_ForceOverWrite
thinBasic_LoadSymbol "NeoSDK_SetVariable", %thinBasic_ReturnNone , CODEPTR(Exec_NeoSDK_SetVariable), %thinBasic_ForceOverWrite
thinBasic_LoadSymbol "NeoSDK_GetVariable", %thinBasic_ReturnString, CODEPTR(Exec_NeoSDK_GetVariable), %thinBasic_ForceOverWrite
END FUNCTION

'----------------------------------------------------------------------------
FUNCTION UnLoadLocalSymbols ALIAS "UnLoadLocalSymbols" () EXPORT AS LONG
' This function is automatically called by thinCore whenever this DLL is unloaded.
' This function CAN be present but it is not necessary. If present, this function
' will be executed by thinBasic core when module will be released.
' Use this function to perform uninitialize process, if needed.
'----------------------------------------------------------------------------
FUNCTION = 0&
END FUNCTION


'*********************************************************
' ***** Following function may not be modificate ********
'*********************************************************
FUNCTION LIBMAIN(BYVAL hInstance AS DWORD, _
BYVAL Reason AS LONG, _
BYVAL Reserved AS LONG) AS LONG
SELECT CASE Reason
CASE %DLL_PROCESS_ATTACH
FUNCTION = %True
EXIT FUNCTION
CASE %DLL_PROCESS_DETACH
FUNCTION = %True
EXIT FUNCTION
CASE %DLL_THREAD_ATTACH
FUNCTION = %True
EXIT FUNCTION
CASE %DLL_THREAD_DETACH
FUNCTION = %True
EXIT FUNCTION
END SELECT
END FUNCTION


I know the syntax is not thinBasic friendly...

But problem is in this line:


CALL DWORD nbPlayAction USING PlayActionProcType(BYCOPY Script$)

Are there any way to migrate this code to thinBasic style ?

Thanks in advance,
David

Petr Schreiber
21-10-2013, 13:28
Hi David,

ThinBASIC does have some form of CALL DWORD syntax, but it has one better approach. Let's have a look:

Step 1: Define the function prototype
In your case it would be something like this, the same as in PB:


DECLARE SUB GetVarProcType(BYREF VarName AS ASCIIZ, BYREF Value AS ASCIIZ)
...


Step 2: Retrieve the procedure address
Using GetProcAddress, LoadLibrary, as in PB...

Step 3: Assign the address to the function prototypes
The DECLARE SET ADDRESS can do it for you:

DECLARE SET ADDRESS GetVarProcType, nbGetVar


Step 4: Call that function as any other
Yes, it is just as simple as:


GetVarProcType(sName, zData)


Petr

David
24-10-2013, 01:32
Thanks a bunch Petr,

After a couple of days plenty of attempts, your suggestions does not work for me...

But, i found the way to put in work the functions i need use.
Solution is very simple... now...


Declare SUB PlayScript Lib "NeoThinBasic.nbp" (BYVAL Script as string)
Declare SUB SetVariable Lib "NeoThinBasic.nbp" (BYVAL Variable as String, BYVAL sValue as String)
Declare FUNCTION GetVariable Lib "NeoThinBasic.nbp" (ByRef VarName AS STRING) as String
Declare FUNCTION GetObjectHandle Lib "NeoThinBasic.nbp" (ByRef sname AS STRING) AS LONG

NeoThinBasic.nbp is the name of the (PowerBasic) plugin that interacts between NeoBook & thinBasic.
Listed functions are used from NeoBook compatibility.

Now, the plugin is almost complete.
Thanks again,

David

Petr Schreiber
24-10-2013, 09:42
Hi David,

I am happy you find a way around the issue, do you think you have somewhere the code with my suggestion not working? I would like to check - maybe it could indicate I explained it wrong, maybe it could indicate problem in SET ADDRESS.


Petr

David
25-10-2013, 00:31
Hi Petr,

Problem was i did a false start, going to a wrong way...
I suposed If i call the NeoBook connection from thinBasic, i can do the job...
But, the only way to do the job, is calling the plugin that communicates with neobook.
Plugin is called from the Neobook program like LoadLibrary does, and preserve the connection while the program is executed.
Is possible your function and my edited version works, but as the "call dword... etc" are trying to connect directly from a service outside de "bubble" that the plugin creates, obviously never will work really.

Is pretty confusing, isn't it ?

Thanks again,
David

Petr Schreiber
25-10-2013, 09:20
Hehe,

thanks for the explanation :)


Petr