我有一个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;不知道为什么程序总是出错,我不能确定是什么地方错了,请朋友们帮忙看一眼.
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;不知道为什么程序总是出错,我不能确定是什么地方错了,请朋友们帮忙看一眼.
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;
这句话说对了!我跟踪CPU显示时,看到其压栈参数均为EAX的长宽,包括BYTE,我拿不准的就是这一点.不知道对调用DLL库有没有影响? 如果有,怎么处理?
观察到的代码大概意思如下:
push @APltmcfg
xor eax,eax
push eax
push $00000001
call ..proc..如何能让函数只压栈8位?而不是32位?
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))