问一个C++调用delphi编写的dll的问题。麻烦有空的看看。


delphi写了个dll其中一个方法:

function CAM_GrabImage(var devId:WideString;out imageData:Pointer;out imageSize:Int64; out imageWidth:Integer; out imageHeight:Integer) : integer ; cdecl ;

用delphi编写的程序调用的时候 imageData 正常返回了指针。


用C++调用的时候 imageData地址变成了null。其他参数都正常返回。


有人遇到并解决过类似情况吗?


下面是C调用部分代码,没有异常。就是imageData在debug时候看是null。传进去的时候还有初始地址,运行结束后变null。
typedef __cdecl int(*Dllfun)(char* devId, char* imageData,long* imageSize,int* imageWidth, int* imageHeight);
result = CAM_GrabImage(devId,imageData,imageSize,imageWidth,imageHeight);

delphi中
imageData:Pointer 我试过PChar
C中
Char*  void*都试过。
结果一样,都是delphi编写的代码调用dll正常返回,C调用同一个dll,不正常。


请不吝赐教,感谢。

8 个解决方案

#1


imageData:Pointer 这个里面的数据是X,Y
不是但一个变量。

#2


Pointer 是无类型指针,坐标结构是TPoint。out关键字修饰的参数只能接受输出值,不能输入。PChar对应Char*,Pointer对应void*没有问题。但imageData可能是Delphi专用的类型对象,如果是,通常不能传递到C/C++中使用。dll传递参数应该用通用的基本类型或结构类型。

#3


function CAM_GrabImage(var devId:WideString;out imageData:Pointer;out imageSize:Int64; out imageWidth:Integer; out imageHeight:Integer) : integer ; cdecl ;

typedef __cdecl int(*Dllfun)(char* devId, char* imageData,long* imageSize,int* imageWidth, int* imageHeight);
对不上啊。
首先WideString应该是wchar_t*,var devId:WideString就应该是wchar_t**,其次Int64应该用long long或者__int64,另外所有的out参数都是变参,要传引用。
typedef __cdecl int(*Dllfun)(wchar_t** devId, char** imageData, long long * imageSize, int* imageWidth, int* imageHeight);

#4


你的参数有问题,直接使用指针传不行吗
如果不行你试试换一下参数传递方式

#5


我字符串从来都是定义成Pchar或Pwidechar,没有试过直接用string,widestring

#6


引用 3 楼 DelphiGuy 的回复:
function CAM_GrabImage(var devId:WideString;out imageData:Pointer;out imageSize:Int64; out imageWidth:Integer; out imageHeight:Integer) : integer ; cdecl ;

typedef __cdecl int(*Dllfun)(char* devId, char* imageData,long* imageSize,int* imageWidth, int* imageHeight);
对不上啊。
首先WideString应该是wchar_t*,var devId:WideString就应该是wchar_t**,其次Int64应该用long long或者__int64,另外所有的out参数都是变参,要传引用。
typedef __cdecl int(*Dllfun)(wchar_t** devId, char** imageData, long long * imageSize, int* imageWidth, int* imageHeight);

#7


关于DLL的调用 ,,,尤其是指针数据,主要问题是空间分配的问题。你imagedata的数据空间,是在delphi中getmem分配出来的么?另外你这种调用方法,,分配出来的imagedata数据区,要保证是长期存在的,不能删除。

#8


写这dll的技术不过关呀,给delphi,cbc调用,string,widestring还可以用,要通用,最好pchar,pwidechar,不在dll里改,你是很难用好的
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告