请教 同一个库函数 DELPHI和VC运行结果不同,请指教。 ( 积分: 50 )

  • 主题发起人 wpsqsibo12
  • 开始时间
W

wpsqsibo12

Unregistered / Unconfirmed
GUEST, unregistred user!
请教 同一个库函数 DELPHI和VC运行结果不同,请指教。

extern "C"
_declspec(dllexport) int ProcessGridData(LPSTR lpszFilename,
int nColorNum,int nWayNum,int nFrameNum,BYTE* pRed,BYTE* pGreen,BYTE* pBlue);

//以下为VC执行代码
char szFilename[MAX_PATH]="c://a.bin";
int nColorNum = 3;
int nWayNum = 6;
int nFrameNum = 5;
BYTE pRed[2*5]= {0,0,0,0,0,0,0,0,0,0};
BYTE pGreen[2*5]={0,0,0,0,0,0,0,0,0,0};
BYTE pBlue[2*5] ={0,0,0,0,0,0,0,0,0,0};
int nRet = ProcessGridData(szFilename,
nColorNum, nWayNum, nFrameNum, pRed, pGreen, pBlue);


//以下是DELPHI中的引用
Procedure ProcessGridData(LpszFilename : array of char;
ncolornum,nwaynum,nFrameNum :Integer;
pR,pG,pB : array of byte) stdcall ;far external 'NEON_Transform.dll' ;
//以下为DELPHI执行代码
nColorNum :Integer;
nWayNum :Integer;
nFrameNum :Integer;
pR ,pG,pB : array of byte;
test :array [0..255] of char;
nColorNum:=3;
nWayNum :=6;
nFrameNum:=5;
SetLength(pR,10);
SetLength(pG,10);
SetLength(pB,10);
for i:=0 to 9do
begin
pr:=0;
pg:=0;
pb:=0;
end;

test:='c:/1.bin';
ProcessGridData(test,ncolornum,nwaynum,nFrameNum,pr,pg,pb);

执行后,DELHI中的 C:/1.bin 文件和 VC执行后的BIN 文件不同,更奇怪的是,DELPHI 中,用同一个菜单多次执行结果也不同,但程序重启第一次执行的结果是一样的。
 
你的函数声明是不正确的
{
1.
注意Delphi中的动态数组和静态数组的区别.
静态数就是纯数据块.静态数组的指针就是第一个元素的指针.
动态数组则不同,动态数组实际上是生存期自管理的结构指针.
Type
动态数组 = ^T动态数组
T动态数组 = record
引用计数:Integer;
分配长度:integer;
数据:array[0..分配长度-1] of 元素类型;
end;

所以取动态数组数据指针要取第一个元素的地址.
所以你的LpszFilename参数和RGB分量用动态数组类型和C的字符串或者说数组对应是不正确的.
2.
注意调用约定.没见到你的C函数有__stdcall,或者是WINAPI的修饰.说明你的C函数不是Stdcall方式调用约定的.
所以应该是C的默认调用约定,Pascal中应该是cdecl约定方式.
3.
FAR是TurboPascal和Delphi1.0这些16位编译器的东西.32位的编译器已经取消了它.因为是32位寻址的,FAR和NEAR没有意义.
Delphi编译器为兼容以前的会忽视这个关键字的.
}
Function ProcessGridData(lpszFilename:pChar;
nColorNum,nWayNum, nFrameNum: Integer;
pRed,pGreen,pBlue : PBYTE
):Integer;cdecl;
external 'NEON_Transform.dll' ;
procedure TForm1.Button1Click(Sender: TObject);
var
nColorNum :Integer;
nWayNum :Integer;
nFrameNum :Integer;
pR ,pG,pB : array of byte;
test :array [0..255] of char;
i:Integer;
begin
nColorNum:=3;
nWayNum :=6;
nFrameNum:=5;
SetLength(pR,10);
SetLength(pG,10);
SetLength(pB,10);
for i:=0 to 9do
begin
pr:=0;
pg:=0;
pb:=0;
end;

test:='c:/1.bin';
ProcessGridData(@test[0],ncolornum,nwaynum,nFrameNum,@pr[0],@pg[0],@pb[0]);
//因为你的test是静态数组,所以也可以用@test
end;
 
楼上分析的很有道理,学习
 
顶部