首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

调用C写的DLL有关问题

2012-03-19 
调用C写的DLL问题typedefstruct_state_now{unsignedcharifTel:1unsignedcharifRing:1unsignedcharifErro

调用C写的DLL问题
'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                 //可是没有得到任何数据,是空的

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


[解决办法]
Var
st:pSTATE_NOW;
begin
new( st );
if GetKHTState(64,st)=1 then //这里执行时为真,说明返回成功
edit1.Text :=st.ifTel //可是没有得到任何数据,是空的
dispose( st );
[解决办法]
'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;
[解决办法]
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;

热点排行