当前位置:主页>仓库管理软件> 列表

问一个动态连接库简单问题,请大家看看。 找超市进销存

记账软件版1楼: VC中的代码是这样:
unsigned char * pUnchImage = new unsigned char[nWidth*nHeight];

for(y=0; y {
for(x=0; x {
pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];//256色DIB中调色板
}
}

// canny算子计算后的结果
unsigned char * pUnchEdge = new unsigned char[nWidth*nHeight];

// 调用canny函数进行边界提取
Canny(pUnchImage, nWidth, nHeight, 0.4, 0.4, 0.79, pUnchEdge) ;

在Delphi中:
我将Canny做成了动态连接库: procedure Canny(pUnchImage: PChar; nWidth,nHeight:integer;sigma,
dRatioLow,dRatioHigh: double;pUnchEdge: PChar);stdcall;external ''CannyDll.dll''

请问:Delphi中的程序这样写(做测试)

procedure TForm1.Button7Click(Sender: TObject);
var
pUnchImage,pUnchEdge: pchar;
i,j:integer;
begin
//SetLength(pUnchEdge,iWidthR,iHeightR);
getmem(pUnchImage,iWidthR*iHeightR) ;
getmem(pUnchEdge,iWidthR*iHeightR) ;
for j := 0 to iHeightR do
for i := 0 to iWidthR do
pUnchImage[j*iWidthR+i] := char(125);//???

Canny(pUnchImage,iWidthR,iHeightR,0.4,0.4,0.79,@pUnchEdge);
每次都出错,请问改怎样写delphi中的程序才能成功调用DLL??

2楼: C的我不懂,但我很穷...占个沙发,希望能散到些分. 如超市进销存

3楼: procedure Canny(pUnchImage: PChar; nWidth,nHeight:integer;sigma,
dRatioLow,dRatioHigh: double;pUnchEdge: PChar);stdcall;external ''CannyDll.dll''
pUnchEdge是PChar类型.你调用的时候又:
Canny(pUnchImage,iWidthR,iHeightR,0.4,0.4,0.79,@pUnchEdge);
结果你传递的是PChar类型的指针了.
1.如果你非要传递PChar的指针的的话应该是
procedure Canny(pUnchImage: PChar; nWidth,nHeight:integer;sigma,
dRatioLow,dRatioHigh: double;var pUnchEdge: PChar);stdcall;external ''CannyDll.dll'';
Canny(pUnchImage,iWidthR,iHeightR,0.4,0.4,0.79,pUnchEdge);
或者
procedure Canny(pUnchImage: PChar; nWidth,nHeight:integer;sigma,
dRatioLow,dRatioHigh: double;pUnchEdge: ^PChar);stdcall;external ''CannyDll.dll'';
2.或者你声明没问题而是调用的问题.(我看这种可能性比较大).调用改成
Canny(pUnchImage,iWidthR,iHeightR,0.4,0.4,0.79,pUnchEdge);
这样pUnchEdge才和声明类型对得上.

友情提示:C语言中一个数据类型的数组和这个数据类型的指针是等价的.C语言中没有Delphi中的值类型数组概念.C中的数组就是指针.而Delphi中数组是值类型.数组和数据指针是不同的.

4楼: 上面的大侠,那个地方我写错了。但是我调用动态连接库还是错误。
我想可能是赋值的问题。请帮我看看。
原来的VC是:pUnchImage[y*nWidth+x] = pDib->m_lpImage[y*nSaveWidth+x];//256色DIB中调色板

我在delphi中是:pUnchImage[j*iWidthR+i] := char(125);我的想法是给pUnchImage输入一个图象的灰度值,这样写和上面VC程序是一样的吗?为什么出错呢??

5楼: VC的函数调用约定默认是cdecl方式,
我看你的Delphi函数声明是Stdcall方式.所以如果你的VC函数没有声明成stdcall方式的话,你的Delphi方面的stdcall就要改成cdecl.
强烈建议你用stdcall方式.C++函数前加上"__stdcall"就行了

6楼: 多人接受答案了。