Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Arrays & APIs
Message
De
14/04/2003 12:44:42
 
 
Information générale
Forum:
Visual FoxPro
Catégorie:
Fonctions Windows API
Titre:
Divers
Thread ID:
00776993
Message ID:
00777284
Vues:
8
Hi Sergey/Anotoliy:

This contains a detailed explanation of my problem, containing code snippets (long thread). Just deal with this if you have free time. Many thanks in advance.

Problem summary: The return array, dStart, is not populated with the correct values. Not even sure if the dNeeds array is properly passed/received by the API, eventhough the API did not return error value.

I noticed that the array wasn't actually passed in VB, just the first element. This is
how it was defined in VB:
'------------------------------------------------------------
' This is in a module file: module1.bas
'------------------------------------------------------------
Public Declare Function LScreateEnvLng _
Lib "LINGD80.DLL" () As Long
Public Declare Function LSsetPointerLng _
Lib "LINGD80.DLL" (ByVal pLINGO As Long, ByRef dObject As Double, _
ByRef nPointersNow As Long) As Long

'------------------------------------------------------------
' The following codes are in a click event of a form that accepts the values of dNeeds
'------------------------------------------------------------
' Create the LINGO environment object
' Assume that the environment will be created successfully
   Dim pLINGO As Long
   pLINGO = LScreateEnvLng()

dim dNeeds(7) as double
' sample value of dNeeds; this is entered through textboxes
' dNeeds(1)=2
' dNeeds(2)=3
' dNeeds(3)=1
' dNeeds(4)=1
' dNeeds(5)=2
' dNeeds(6)=2
' dNeeds(7)=2

Dim dStart(7) As Double

' nPointersNow is not even defined!
' @POINTER(1) this is the receiving entity of the API
   nError = LSsetPointerLng(pLINGO, dNeeds(1), nPointersNow)
   If nError <> 0 Then GoTo ErrorExit
   
' @POINTER(2) this is the receiving entity of the API
   nError = LSsetPointerLng(pLINGO, dStart(1), nPointersNow)
   If nError <> 0 Then GoTo ErrorExit

' there is a script here to run the LINGO model
' nError does not return <> 0 (meaning successfully ran the model).

' assign returned values to textboxes
' clean up codes

ErrorExit:
  ' clean up codes   
In the first pointer, I just need to pass the values of dNeeds to the API, but in the second pointer, I need to get the values filled-in by API.

I've used CLSHEAP functions: CopyDoubleToString & DoubleToNum to convert the data back and forth.

This is a snippet of my VFP code:
*------------------------------------------------
* LINGO API 
*------------------------------------------------
declare integer LScreateEnvLng in "c:\lingo8\lingd80.dll"
declare long LSsetPointerLng in "c:\lingo8\lingd80.dll" long, string @, integer @

*------------------------------------------------
* conversion APIs:
*------------------------------------------------
* converts double to number
declare RtlMoveMemory in WIN32API as ConvDoubleToNum ;
	double @DestNumeric, ;
	string @pVoidSource, ;
	integer nLength
*  converts double to string
declare RtlMoveMemory in WIN32API as ConvDoubleToStr ;
	string @DestString, ;
	double @pVoidSource, ;
	integer nLength

*------------------------------------------------
* conversion API implementation:
*------------------------------------------------
*  converts double to string
function DoubleToNum
	lparameter cDoubleInString
	local nNum
	nNum = 0.000000000000000000
	=ConvDoubleToNum(@nNum, cDoubleInString, 8)
	return nNum
endfunc
function DoubleToStr
	lparameter nDoubleToCopy
	local cString
	cString = space(8)
	=ConvDoubleToStr(@cString, nDoubleToCopy, 8)
	return cString
endfunc

*------------------------------------------------
* click event of my test form
*------------------------------------------------
with thisform
* create the LINGO environment
   .pLINGO = LScreateEnvLng()
   if .pLINGO = 0
      messagebox('Unable to create environment')
      return .f.
   endif
   local nError as long
   private nPointersNow
   nPointersNow = 0

   * pointer 1; dNeeds array is the values of the textboxes of my test form
   * assume that these data are properly assigned.
   private cNeeds
   cNeeds = ''
   for i = 1 to 7
      cNeeds = cNeeds + DoubleToStr(dNeeds[i])
   endfor
   * pointer 1; array to be passed to API
   nError = LSsetPointerLng(.pLINGO, @cNeeds, @nPointersNow)
   if nError <> 0
      set step on
   endif
   * pointer 2; array to be updated with values from API
   dimension dStart[7] as double
   dStart = 0.0
   private cStart
   cStart = ''
   for i = 1 to 7
      cStart = cStart + DoubleToStr(0.0)
   endfor
   nError = LSsetPointerLng(.pLINGO, @cStart, @nPointersNow)
   if nError <> 0
      set step on
   endif
   * run the LINGO script here, returns <> 0 which means successful
   * these values are not the same as the values returned in the VB sample
   * by this magnitude
   * VB=1 vs VFP=0.38E-300!!!
   .text8.value=DoubleToNum(substr(cStart,1,8))
   .text9.value=DoubleToNum(substr(cStart,9,8))
   .text10.value=DoubleToNum(substr(cStart,17,8))
   .text11.value=DoubleToNum(substr(cStart,25,8))
   .text12.value=DoubleToNum(substr(cStart,33,8))
   .text13.value=DoubleToNum(substr(cStart,41,8))
   .text14.value=DoubleToNum(substr(cStart,49,8))
ramil
~~ learning to stand still
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform