需要调用一个c的dll,有这样一个函数:
int fun2(const char *filename, byte **data, int *length)其中,第一个参数是文件路径,dll接收该参数后处理文件,并将结果放在data中,length中是data的字符长度。现在我想问的是在delphi中如何来声明这个函数,我是这样写的,但是有问题:
Function fun2(filename:pchar ; var data:pchar ; var length:integer ) : integer ; stdcall ; external 'f.dll' ;请达人指点一下,正确的写法是什么?
int fun2(const char *filename, byte **data, int *length)其中,第一个参数是文件路径,dll接收该参数后处理文件,并将结果放在data中,length中是data的字符长度。现在我想问的是在delphi中如何来声明这个函数,我是这样写的,但是有问题:
Function fun2(filename:pchar ; var data:pchar ; var length:integer ) : integer ; stdcall ; external 'f.dll' ;请达人指点一下,正确的写法是什么?
解决方案 »
- 请问如何用一个定义一个TStringlist类型或者其他数组函数获取XML中class下的各元素的值????又如何调用呢?急急急啊!!!
- 请问各位大虾,如何实现象csdn小助手登录类型的小程序(100分不够再加)
- dxdbgrid-按安回车自动换行时,如何设置可以自动增加记录的呢
- 我想动态建立一个ADOQUERY,但不成功,请问?
- 为什么程序无法持续运行 在application.run部分有问题
- Delphi配置问题
- 大家来:开发工具, 下载地址, 相应注册码
- 急急急,请问有没有人用过createfont给个实例,谢谢!
- 有何办法不在执行后续命令,而返回开头.
- 如何控制DBGRID和EDIT之间的输入法 ?
- 找到SysTabControl32的句柄 怎样取得的每个tab的标题?
- 如何让程序读取*.SQL文件里的部分语句
我是这样理解的,var好像是引用方式调用吧,貌似传的是地址,这样相当于一个*了;然后有char*的都用的pchar好像是没问题的,这样能不能表示原型中的2个星呢?这个地方我的确有点晕
Test = ^PChar;
int fun2(const char *filename, byte **data, int *length)
funtion fun2(const filename: pchar; data: Test; Length: pinteger): int;
试下这样会不会错?
翻译后变为
function Fun2(const filename: pchar;var data: pointer;var length: pInteger);
楼上的虽然接近但是是错的,
Delphi 深度传值必须用Var来替换
一般我们也会把var data: pointer
声明成Tstream,TstreamMem,等但是主要还是考虑到程序调用后是否创建该实例,所以还是采用指针传递.
Data := nil;
length := 0;
就可以了,
同时加上
Try
exceptEnd
保护起来,以免出错
试了一下,偶尔会好用几次之后,然后就一直报错了。然后又使用了yhcslg 的方法进行了测试现在能够正常调用了。
但是很奇怪的是,并不是100%的正常返回,有时调用dll后整个程序会直接关闭,这个是调用的问题?还是dll本身的问题?