• Sábado 4 de Mayo de 2024, 22:05

Autor Tema:  Vfp + Com  (Leído 2635 veces)

Gaston

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Vfp + Com
« en: Lunes 22 de Agosto de 2005, 23:07 »
0
Hola,

Inclui una OCX (desarrollado en VB6) en un form en FoxPro.

En la OCX se encuentra un metodo al cual deseo invocar:

Public Function BioSaveTemplate(ByRef UsrTemplates() As RecordTemplate, ByVal EnrollHandle As Integer, ByVal FingerOrder As Integer, ByVal FingerNumber As Integer) As Long

El primer parametro de la funcion es un array de la siguiente estructura declarada en VB:

Public Type RecordTemplate
Template(1 To TplSize) As Byte ' Template data
FingerN As Integer ' Enrolled finger number
Stability As Integer ' Image stability of this template
Quality As Integer ' Image Quality of this template
Content As Integer ' Image Contents of this template
End Type

Como puedo crear y pasarle la estructura RecordTemplate desde Visual FOX 6?

Muchas gracias,
Gaston.

DrakerDG

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
    • http://drakerdg.xbot.es/wordpress/
Re: Vfp + Com
« Respuesta #1 en: Miércoles 31 de Agosto de 2005, 21:31 »
0
:comp: Encontre esto en el help de visual fox 6.

Código: Text
  1.  
  2. Algunas funciones de DLL requieren parámetros más complejos, como estructuras o matrices. Si la función requiere un puntero a una estructura, debe determinar la distribución de la estructura y emularla como una cadena en Visual FoxPro antes de transferirla o recibirla de la función de DLL. Por ejemplo, la función del sistema de Windows GetSystemTime( ) espera un puntero a una estructura formada por ocho palabras o enteros de 16 bits sin signo que indican el año, el mes, el día, etc. La estructura se define de esta forma:
  3.  
  4. typedef struct _SYSTEMTIME {
  5.    WORD wYear&#59;
  6.    WORD wMonth&#59;
  7.    WORD wDayOfWeek&#59;
  8.    WORD wDay&#59;
  9.    WORD wHour&#59;
  10.    WORD wMinute&#59;
  11.    WORD wSecond&#59;
  12.    WORD wMilliseconds&#59;
  13. } SYSTEMTIME
  14.  
  15. Para pasar datos entre Visual FoxPro y la función GetSystemTime( ), tiene que crear un búfer de cadena de 40 bytes (formado inicialmente por espacios) y, a continuación, pasar la dirección de esta cadena a la función para llenarla. Cuando se devuelve la cadena, debe dividirla en trozos de 2 bytes para extraer los campos individuales de la estructura. El siguiente fragmento demuestra cómo podría extraer tres de los campos de la estructura:
  16.  
  17. DECLARE INTEGER GetSystemTime IN win32api STRING @
  18. cBuff=SPACE(40)
  19. =GetSystemTime(@cBuff)
  20.  
  21. tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) * &#59;
  22.    256 + ASC(SUBSTR(cBuff,1))))
  23. tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) *&#59;
  24.    256 + ASC(SUBSTR(cBuff,3))))
  25. tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6)) *&#59;
  26.    256 + ASC(SUBSTR(cBuff,5))))
  27.  
  28. Para obtener más información, puede examinar el formulario de ejemplo Systime.scx del directorio ...\Samples\Vfp98\Solution\Winapi de Visual Studio. Para ver otros ejemplos de cómo pasar parámetros a funciones de DLL, vea el programa Registry.prg que se encuentra en el directorio ...\Samples\Vfp98\Classes de Visual Studio.
  29.  
  30. Si los datos con los que está trabajando en Visual FoxPro son una matriz, debe recorrer varias veces la matriz y concatenarlos en una única cadena que representa una matriz de tipo C antes de pasarlos a la función de DLL. Si la función de Windows espera valores de 16 bits o de 32 bits, tiene que convertir los valores a sus equivalentes hexadecimales antes de concatenarlos en una cadena. Cuando pasa la cadena que contiene los datos de la matriz, Visual FoxPro pasa la dirección de la variable de tipo cadena a la DLL, que puede manipularla como matriz. Para ver un ejemplo de esto, vea el formulario de ejemplo Syscolor.scx que se encuentra en el directorio ...\Samples\Vfp98\Solution\Winapi de Visual Studio.
  31.  
  32.  
  33.  

Este es un ejemplo de código de una funsión del API que utilizo con frecuencia

Código: Text
  1.  
  2. FUNCTION GetPath(nHex) && Numero Hexadecimal
  3. LOCAL sPathP
  4. Declare SHGetSpecialFolderPath In 'shell32.dll'&#59;
  5.         Long hWnd, String @sPath, Long Folder, Long Create
  6. *Regresa el path de carpetas en el sistema, como:
  7. *Mis documentos (de usuario actual o todos los usuarios)
  8. *Mis imagenes "
  9. *Usuario actual
  10. *Archivos de Programa, etc.
  11.  
  12. sPathP = SPACE(256) && Tamaño del string en blanco.
  13.  
  14. = SHGetSpecialFolderPath(1, @sPathP, nHex, .F.) && Llama el valor al API.
  15. *--- NOTA: @variable, pasa el parametro por referencia, es decir para que
  16. *--- sea modificado y retorne su valor.
  17.  
  18. sPathP = LEFT(sPathP,AT(Chr(0),sPathP) - 1) && Asigna el valor del Path.
  19.  
  20. RETURN sPathP
  21. ENDFUNC
  22.  
  23.  
  24.  

 :suerte:
Saludos desde Guatemala, C. A.
Electrobotics