delph调用c dll,参数类型问题?!

mingday 2009-01-19 11:16:47
需要调用一个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' ;

请达人指点一下,正确的写法是什么?

...全文
233 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
distance00 2009-01-20
  • 打赏
  • 举报
回复
帮顶一下吧。。
bob008 2009-01-20
  • 打赏
  • 举报
回复
MARK
bdmh 2009-01-19
  • 打赏
  • 举报
回复
楼上有理
「已注销」 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 mingday 的帖子:]
需要调用一个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' ;

请达人…
[/Quote]
int fun2(const char *filename, byte **data, int *length)
翻译后变为
function Fun2(const filename: pchar;var data: pointer;var length: pInteger);
楼上的虽然接近但是是错的,
Delphi 深度传值必须用Var来替换
一般我们也会把var data: pointer
声明成Tstream,TstreamMem,等但是主要还是考虑到程序调用后是否创建该实例,所以还是采用指针传递.
Data := nil;
length := 0;
就可以了,
同时加上
Try


except

End
保护起来,以免出错
sanguomi 2009-01-19
  • 打赏
  • 举报
回复
type
Test = ^PChar;
int fun2(const char *filename, byte **data, int *length)
funtion fun2(const filename: pchar; data: Test; Length: pinteger): int;
试下这样会不会错?
mingday 2009-01-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
var data:pchar 有问题吧
[/Quote]

我是这样理解的,var好像是引用方式调用吧,貌似传的是地址,这样相当于一个*了;然后有char*的都用的pchar好像是没问题的,这样能不能表示原型中的2个星呢?

这个地方我的确有点晕
bdmh 2009-01-19
  • 打赏
  • 举报
回复
var data:pchar 有问题吧
mingday 2009-01-19
  • 打赏
  • 举报
回复
再就是,用yhcslg 的方法后,我取pointer所指内容时老是报错,有什么注意事项吗?

这个dll用vc进行测试时出了个问题,vc用unicode编译,结果读data的值不正确(主要是中文),改成非unicode后就正常了,说明该dll不是unicode编译的,delphi里有关于编码的选项吗???
mingday 2009-01-19
  • 打赏
  • 举报
回复
首先,我用sanguomi的
[Quote=引用 3 楼 sanguomi 的回复:]
type
Test = ^PChar;
int fun2(const char *filename, byte **data, int *length)
funtion fun2(const filename: pchar; data: Test; Length: pinteger): int;
试下这样会不会错?
[/Quote]
试了一下,偶尔会好用几次之后,然后就一直报错了。



然后又使用了yhcslg 的方法进行了测试
[Quote=引用 4 楼 yhcslg 的回复:]
int fun2(const char *filename, byte **data, int *length)
翻译后变为
function Fun2(const filename: pchar;var data: pointer;var length: pInteger);
楼上的虽然接近但是是错的,
Delphi 深度传值必须用Var来替换
一般我们也会把var data: pointer
声明成Tstream,TstreamMem,等但是主要还是考虑到程序调用后是否创建该实例,所以还是采用指针传递.
Data := nil;
length := 0;
就可以了,
同时加上
Try


except

End
保护起来,以免出错
[/Quote]

现在能够正常调用了。


但是很奇怪的是,并不是100%的正常返回,有时调用dll后整个程序会直接关闭,这个是调用的问题?还是dll本身的问题?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧