您的位置:程序门 -> delphi -> windows sdk/api



调用c写的dll问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


调用c写的dll问题[已结贴,结贴人:mingyue99]
发表于:2007-01-05 16:00:49 楼主
'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                 //可是没有得到任何数据,是空的

我错在那里,应该什么办?
很急,帮帮忙呀?
发表于:2007-01-05 16:04:271楼 得分:25
var
st:pstate_now;
begin
new(   st   );
if   getkhtstate(64,st)=1   then   //这里执行时为真,说明返回成功
edit1.text   :=st.iftel   //可是没有得到任何数据,是空的
dispose(   st   );
发表于:2007-01-05 16:10:512楼 得分:0
不得呀,出错
发表于:2007-01-06 08:10:223楼 得分:0
错误信息?
发表于:2007-01-06 14:10:514楼 得分:0
-_#!
发表于:2007-01-06 15:31:255楼 得分:0
今天再试没有错误提示了
可还是没有返回任何数据,还是空值,我真不知道什么办了
发表于:2007-01-06 15:34:116楼 得分:25
'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;
发表于:2007-01-06 15:58:167楼 得分:0
试过了
还是不行
发表于:2007-01-06 16:25:238楼 得分:50
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;
发表于:2007-01-06 16:55:209楼 得分:0
问题好像不是出在这里

  keiy()  
      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就是得不到返回数呢
发表于:2007-01-07 16:10:3910楼 得分:0
我做了个测试程序,应该可以的,注意对state一定要定义成   var   state:word
发表于:2007-01-07 17:20:0611楼 得分:0
试试     edit1.text   :=inttostr(st.iftel);
发表于:2007-01-08 10:38:3912楼 得分:0
我也是定义成   var   state:word的
问题还没有解决
但还是谢谢你们的热心帮助,过两天我会结贴的


快速检索

最新资讯
热门点击