我有一个VC的头文件,有几个数据类型对应关系我拿不准.
typedef struct tagconfig{
       unsigned char oldaddr;
                unsigned char ch_num[8];
                }ltmcfg, *lpltmcfg;
对应为
type
 Pltmcfg=^ltmcfg; 
 ltmcfg=record
    oldaddr:byte;
    ch_num:array[0..7] of byte;
  end;函数原型:
int  WINAPI ltm_read_config(int port, unsigned char addr, ltmcfg *cfg);
对应为
  function ltm_read_config(
           port:Integer; 
           addr:byte; 
           APltmcfg:Pltmcfg):Integer;实际调用时:
// tform1.button1click
var
  APltmcfg:Pltmcfg;
  r:integer;
begin
  r=ltm_read_config(1,$00,@APltmcfg);
end;不知道为什么程序总是出错,我不能确定是什么地方错了,请朋友们帮忙看一眼.

解决方案 »

  1.   

    stdcall和cdecl的区别注意了马?还有record一般情况下会自动对齐8字节,不满的会补0,vc中也有类似功能,好像是#pragma packagesize 什么的,查一下两边的设置是否相同。
      

  2.   

    原来的:
    var
      APltmcfg:Pltmcfg;
      r:integer;
    begin
      r=ltm_read_config(1,$00,@APltmcfg);
    end;改为
    var
      APltmcfg:ltmcfg;  //<----改这里,你定义错变量类型了
      r:integer;
    begin
      r=ltm_read_config(1,$00,@APltmcfg);
    end;
      

  3.   

    stdcall注意了.但cdecl我不太清楚.能简单说一下吗?//还有record一般情况下会自动对齐8字节,不满的会补0.
    这句话说对了!我跟踪CPU显示时,看到其压栈参数均为EAX的长宽,包括BYTE,我拿不准的就是这一点.不知道对调用DLL库有没有影响? 如果有,怎么处理? 
    观察到的代码大概意思如下:
    push @APltmcfg
    xor eax,eax
    push eax
    push $00000001
    call ..proc..如何能让函数只压栈8位?而不是32位?
      

  4.   

    TO 胖胖是我不小心,在往CSDN上发时打错了,实际程序代码正如您所说,但仍然是有问题.不知还有哪有问题?
      

  5.   

    stdcall和cdecl是两种函数调用方法,区别是是否由函数的调用者来清空栈中的参数,一般vc下默认是cdecl方法,delphi中默认是stdcall方法,但其实两者都是可以自定义的,如:
    C++
    WINAPI void sub();
    Delphi:
    procedure sub();cdecl;
    你只要保证两者的调用方式相同就可以了。一般推荐用stdcallDelphi下防止record自动设置大小用:
      tagRGBQUAD = packed record
        rgbBlue: Byte;
        rgbGreen: Byte;
        rgbRed: Byte;
        rgbReserved: Byte;
      end;VC下好像是#pragma (pack(1))