| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 539 人关注过本帖
标题:关于调用dll的
只看楼主 加入收藏
wwslf11
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2013-1-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
关于调用dll的
如果要调用的dll中的函数参数是一个结构体地址的话,在VFP中怎么调用啊
搜索更多相关主题的帖子: 结构体 
2013-01-27 19:09
月沐庭轩
Rank: 9Rank: 9Rank: 9
来 自:京城
等 级:贵宾
威 望:17
帖 子:393
专家分:1106
注 册:2011-7-24
收藏(1)
得分:0 
注册一个外部共享库中的函数。库是 32-位动态链接库文件(.DLL)。
DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName]
   [cParamType1 [@] ParamName1, cParamType2 [@] ParamName2, ...]
说明:
在 Visual FoxPro 中调用一个共享库函数前,必须发出带有函数名、包含该函数的共享库名以及函数将要接收的参数类型的 DECLARE 命令。
为了提供向后兼容性,Visual FoxPro 仍然支持使用 SET LIBRARY 命令调用外部 API 库。(使用 SET LIBRARY,您可以访问 Foxtools.fll 中的函数。)但是,使用 DECLARE 是注册共享库函数的首选方法。
虽然 Visual FoxPro 添加了 OBJECT cFunctionType 到这个命令,但其主要是用于支持一些 ActiveX Accessibility API 例程,一般可以用于其它 Windows API 例程中。
有关调用共享库函数的更多信息,请参见您的操作系统或环境的程序员指南(例如,为了获得调用 DLL 的信息,可翻阅 Microsoft Win32 程序员指南)。

执行 DISPLAY STATUS 或 LIST STATUS 可显示已注册的函数名。执行 CLEAR ALL 或 CLEAR DLLS 可从内存中删除已注册的函数。

示例
这个示例用来为 Visual FoxPro 返回当前活动的 Windows 窗口句柄,或者如果您切换到其它 Windows 应用程序返回 0 。当显示 WAIT 窗口时,可在 5 秒内按下 ALT+TAB ,来切换到不同的 Windows 应用程序,或您可以作为活动的应用程序离开 Visual FoxPro。
CLEAR
DECLARE INTEGER GetActiveWindow IN win32api
WAIT WINDOW "现在您可以切换到另一个应用程序了" TIMEOUT 5
? GetActiveWindow( )

坚持学习vfp,QQ:306805680
2013-01-27 19:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
需要把结构体数据主动转换为符合规格的内存块,然后把该块(或地址)传送给DLL对应的参数即可。

授人以渔,不授人以鱼。
2013-01-27 21:01
wwslf11
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2013-1-27
收藏
得分:0 
回复 3楼 TonyDeng
在VFP中怎么读这个内存块里面的内容呢?比如说结构体中有一个成员是字符型的数组,应该用什么方法将这个数组读出来?
2013-01-28 09:54
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:0 
以下是引用wwslf11在2013-1-28 09:54:15的发言:

在VFP中怎么读这个内存块里面的内容呢?比如说结构体中有一个成员是字符型的数组,应该用什么方法将这个数组读出来?
具体说明是一下是哪个api函数

个性太多,无法显示
2013-01-28 10:03
wwslf11
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2013-1-27
收藏
得分:0 
回复 5楼 taohua300
function ReadIcCardMessage(CustomerInfo:PCustomerCard;aCom:integer):integer;StdCall;
API就是上面这个,其中PCustomerCard的成员有以下几个。前面三个我已经读出来了,第四个是整形的,应该怎么从内存中读出来?
CardNo:   array[0..7] of char ;  //卡号
    CardName: array[0..7] of char;   //姓名
    pwd:      array[0..3] of char;  //高额消费密码
    Money: Integer;   //金 额
2013-01-28 10:30
taohua300
Rank: 12Rank: 12Rank: 12
来 自:光
等 级:贵宾
威 望:14
帖 子:1636
专家分:3906
注 册:2009-3-11
收藏
得分:10 
试试
?Ctob(Substr(CustomerInfo,18),'2rs')

个性太多,无法显示
2013-01-28 11:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
对应的C结构:
struct CustomerCard
{
    char CardNo[8];
    char CardName[8];
    char pwd[4];
    int Money;
}
假设你的API对应Integer是32位(4字节)的,那么整个内存块是24字节的字符串。开头8个字节对应CardNo,前面7个就是你所需要的字符,最后一个是0,舍弃即可。整块的最后4个字节是Money整数,要视你的API使用大端还是小端而定,用256进制转换成数字——把每一位的内码逐次乘以256加上去。

[ 本帖最后由 TonyDeng 于 2013-1-28 13:26 编辑 ]

授人以渔,不授人以鱼。
2013-01-28 13:22
wwslf11
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2013-1-27
收藏
得分:0 
OK!可以了,多谢各位。
2013-01-28 15:14
wjgsw
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-1-3
收藏
得分:0 
专家就是专家!
2018-01-23 22:18
快速回复:关于调用dll的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035222 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved