VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 915|回复: 9

调用C写的DLL问题

[复制链接]

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-3-14 09:30:01 | 显示全部楼层 |阅读模式
'typedef struct _state_now{
'    unsigned char ifTel:1;
'    unsigned char ifRing:1;
'    unsigned char ifError:1;
'    unsigned char ifDtmf:1;
'    unsigned char dtmf:4;
'    unsigned char hd;
'} STATE_NOW;

'功能:查询状态
'入口:1 port, 端口号(0-7 对应 USB口的64-71),state 状态
'出口:1 成功;0 失败。
'int WINAPI GetKHTState(int port, STATE_NOW * state)

别人用VB写的
Declare Sub GetKHTState Lib "mtudll.DLL" (ByVal port As Long, ByRef state As Integer)


我用DELPHI来调用的代码如下
type
  STATE_NOW=packed record
    ifTel:char;
    ifRing:char;
    ifError:char;
    ifDtmf:char;
    dtmf:array[1..4] of char;
    hd:pchar;
  end;
  PSTATE_NOW=^STATE_NOW;

function GetKHTState(port:integer; state:PSTATE_NOW):integer;stdcall; external 'mtudll.DLL' name 'GetKHTState';

Var
st:pSTATE_NOW;
begin
if GetKHTState(64,st)=1 then   //这里执行时为真,说明返回成功
   edit1.Text :=st.ifTel        //可是没有得到任何数据,是空的

我错在那里,应该什么办?
很急,帮帮忙呀?
回复

使用道具 举报

0

主题

14

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-6-10 22:00:01 | 显示全部楼层
Var
st:pSTATE_NOW;
begin
new( st );
if GetKHTState(64,st)=1 then //这里执行时为真,说明返回成功
edit1.Text :=st.ifTel //可是没有得到任何数据,是空的
dispose( st );
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-14 08:30:01 | 显示全部楼层
今天再试没有错误提示了
可还是没有返回任何数据,还是空值,我真不知道什么办了
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-14 09:15:01 | 显示全部楼层
'typedef struct _state_now{
'    unsigned char ifTel:1;
'    unsigned char ifRing:1;
'    unsigned char ifError:1;
'    unsigned char ifDtmf:1;
'    unsigned char dtmf:4;
'    unsigned char hd;
'} STATE_NOW;

type
  STATE_NOW=packed record
    ifTel:char;
    ifRing:char;
    ifError:char;
    ifDtmf:char;
    dtmf:array[1..4] of char;
    hd:char;   //hd:pchar;改一下这里
  end;
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-14 13:15:01 | 显示全部楼层
试过了
还是不行
回复

使用道具 举报

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-7-14 18:15:01 | 显示全部楼层
delphi中是没有C/C++的位字段的(VB同理,所以它是用integer)
由于在C中PSTATE_NOW为指针,所以delphi中要这样定义
function GetKHTState(port:integer; var state:word):integer;stdcall; external 'mtudll.DLL' name 'GetKHTState';
然后,将state分别用and和shr来得到各个状态的值
var
  state:word;
  i:integer;
  ifTel,ifRing,ifError,ifDtmf,dtmf,hd:integer;
begin
  i:=GetKHTState(1,state);
  Edit1.Text:=inttostr(i);
  ifTel:=state and 1;
  ifRing:=(state shr 1) and 1;
  ifError:=(state shr 2) and 1;
  ifDtmf:=(state shr 3) and 1;
  dtmf:=(state shr 4) and $f;
  hd:=(state shr 8) and $ff;
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-15 09:45:01 | 显示全部楼层
问题好像不是出在这里

ufoprc
   delphi中是没有C/C++的位字段的(VB同理,所以它是用integer)
由于在C中PSTATE_NOW为指针,所以delphi中要这样定义
function GetKHTState(port:integer; var state:word):integer;stdcall; external 'mtudll.DLL' name 'GetKHTState';
然后,将state分别用and和shr来得到各个状态的值
var
  state:word;
  i:integer;
  ifTel,ifRing,ifError,ifDtmf,dtmf,hd:integer;
begin
  i:=GetKHTState(1,state);
  Edit1.Text:=inttostr(i);
  ifTel:=state and 1;
  ifRing:=(state shr 1) and 1;
  ifError:=(state shr 2) and 1;
  ifDtmf:=(state shr 3) and 1;
  dtmf:=(state shr 4) and $f;
  hd:=(state shr 8) and $ff;

试了
所有位都是0,因为是整型数,初始就是0,所以实际什么都没有返回

用他们给的VB来写的程序可以得到整数4098,二进制为1000000000010
就是ifRing位为1

为什么用DELPHI就是得不到返回数呢
回复

使用道具 举报

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-7-20 15:00:01 | 显示全部楼层
我做了个测试程序,应该可以的,注意对state一定要定义成 var state:word
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-7-20 21:00:02 | 显示全部楼层
试试  edit1.Text :=inttostr(st.ifTel);
回复

使用道具 举报

1

主题

5

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-7-24 10:00:01 | 显示全部楼层
我也是定义成 var state:word的
问题还没有解决
但还是谢谢你们的热心帮助。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表