回 帖 发 新 帖 刷新版面

主题:[原创]请教用VC++给VFP编DLL函数的问题

我用VC++6.0编写了一个DLL函数,在VFP9中调用这个函数。
VFP 给数组tdx(1)赋值2008, tdx(2)赋值88,然后调用动态链接库函数readday( ),
把数组tdx( )的地址和两个整数变量m_date、m_open的地址传递给readday( ).
readday( ) 把tdx(1)的原始值赋值给m_date, tdx(2)的原始值赋值给m_open.并给tdx(1)和tdx(2)
赋值2001和20。
调用后的返回值应该是
i=20   m_date=2008  m_open=88
tdx(1)=2001 tdx(2)=20
   
但是程序返回的结果不正确:
i=20   m_date=2008  m_open=0
tdx(1)=2001 tdx(2)=2001
请问如何才能得到正确结果?
如果readday( ) 用一个结构代替数组tdx,又应如何写程序?(我试过,VFP提示数据类型不对)
请高手指教,不胜感激!

E_mail: wanghuihe163@163.com

//myfox.cpp
#include "stdafx.h"
#include <iostream.h> 
#include   <stdio.h>   

BOOL  APIENTRY  DllMain(HANDLE hModule, DWORD ul_reason_for_call,  LPVOID lpReserved )
{
    return TRUE;
}

  int _stdcall readday(int *tdx,int *pdate,int *popen)   
  {   
      *pdate=*tdx;
      *popen=*(tdx+1);
      *tdx=2001;
      *(tdx+1)=20;
   return *(tdx+1);
       
  }


//myfox.def

LIBRARY myfox
EXPORTS 
readday @1
readday @2


**vfp test.prg

CLEAR
 decla integer readday IN myfox.dll integer @tdx,inte @pdate,inte @popen

dime tdx(8) 
tdx(1)=2008
tdx(2)=88
publi m_date as inter,m_open as inter
?"readdy go!"
WAIT

i=readday(@tdx,@m_date,@m_open)

?"returned value is"
?"i=",i,"m_date=",m_date,"m_open=",m_open
?"tdx(1)=",tdx(1),"tdx(2)=",tdx(2)

CLEAR DLLS
RETURN


回复列表 (共3个回复)

沙发

在VFP中调用DLL时,参数复杂时,如数组或结构,必须首先创建一个字符串缓冲区(初始内容为空格).然后将字符串的地址传递给函数.返回后,必须以两个字符为单元进行分析,提取数据.你的例子中:

declare integer readday IN myfox.dll string @tdx,integer @pdate,integer @popen
tdx=space(8)

板凳


也就是说不能够用数组传递整数型值,必须在DLL函数内先转化成字符串再回传给foxpro?这样处理行是行,只是要增加了转化过程,增加了运行时间,有没有直接传递整数型数组的方法?[em18]

3 楼

VFP外部库(FLL文件),通过特殊协议和vfp共享数据,FLL文件和DLL文件很相似.可以用VC++6创建

我来回复

您尚未登录,请登录后再回复。点此登录或注册