======================================================
注:本文源代码点此下载
======================================================
c语言中“char * params[]”的参数在delphi中该如何定义?100分求解决放过。 delphi / windows sdk/api
http://www.delphi2007.net/delphiapi/html/delphi_20061138888899995.html
vc写的动态库 一个参数定义成
“char*params[]”delphi中该如何定义?才能正确的调用。
有经验的朋友应该一看就知道。
因为好久没有来泡坛了。所以放100分吧。来者有分。
intdllexportpersonalizecard(longcardnumber,intnargs,char*params[])
如果成功会在c:下写ookk.txt文件
感兴趣的朋友可以通过下面地址下载dll 试验一下。
http://ys-h.ys168.com/ys168up/d1/?dll.rary72z7ld4f9f9b1f8z95b4b4b7b0b1b1fq9b4b2b7fl9fl6e14z97e14e24b1b2f2b1fl9b4fc6fd7z
params:arrayofchar
type
c=arrayofpchar;
intdllexportpersonalizecard(longcardnumber,intnargs,paramsc)
谢谢大家支持!如方便请大家下载后调用一下。
然后把程序贴出来。
to:hongqi162(失踪的月亮)
我试了一下,没成功。
相信你应该能搞定。赶快出手吧。
个人认为char*params[]是一个字符指针数组,不应该理解为arrayofchar,而应该理解为array[low..high]ofstring或tstringlist类。本人初学,对概念的理解可能较肤浅,高手勿笑
二楼arrayofpchar应该是最精确的理解了
用pchar
functionpersonalizecard(cardnumber:cardinal;nargs:integer;params:pchar):integer;
对应是arrayofpchar,我觉得
c里面有种调用方式是...,意思是说可以写入很多参数的那种,感觉params差不多。
lz这样一试:
var
buffer:array[0..10,0..1024]ofchar;
begin
//buffer赋值
personalizecard(no,10,@buffer);
end;
dll弄不下来,不弄了。
楼上的有道理,不过后面要加stdcall;externaldllname等,否则还是错误的.总之,那个参数是个指针就行了,至于怎样用,要看情况,输出和输入指针可有不同的处理
谢谢大家的支持,根据大家的思路早上我又试了一次还是不行。
百思不的其解呀!
to:maozefa(阿发伯)压栈方式已经检查过了stdcall。
三个参数都是入参。
不好意思,上面的下载地址过期了,下面是新的百分百好用。
http://blog.chinaunix.net/upfile/061201092335.rar
char*params[]等价char**params
char*p等价pchar(delphi)
谢谢大家的支持!
我开了一个空间把dll传上去了。地址http://free.ys168.com/?goodok的“软件下载”目录下的dll.rar文件。
希望高手出面解决这个问题
这个,还是用pointer就可以了
用的时候定义一个arrayofchar数组就可以了!
在参数前面加个var就行了
最好把array的参数定义成record来传
类型严格对应的delphi声明是
params:ppchar;
定义成
params:arrayofpchar;也可以的,
arrayofpchar可以强制转换成ppchar不出问题,
但反过来转换不行的.
感觉楼主问题不在这儿.
看楼主的dllc声明中,并没有声明__stdcall,
那为什么delphi声明中要用stdcall?delphi声明对应的应该是cdecl
string是pascal特有的类型,不能直接兼容pchar
char*params[]
看成一个pchar的数组,就是arrayofpchar
functionpersonalizecard(
cardnumber:integer;
nargs:integer;
params:ppchar
):integer;stdcall;
proceduretform1.button1click(sender:tobject);
var
vparams:array[0..1]ofpchar;
begin
vparams[0]:='zswang';
vparams[1]:='到此一游';
personalizecard(1,2,@vparams[0]);
end;
你提供的demo无法调试,缺少mfc42d.dll、msvcrtd.dll
只有你自己调试了
关于arrayofchar与ppchar类型转换,可以看下面代码验证其可行.
//---------------------------------------------------------------
proceduretest(params:ppchar);//这儿用的ppchar类型,严格对应char*params[];
begin
showmessage(params^);
inc(params);
showmessage(params^);
end;
type
ttest2=procedure(params:arrayofpchar);
proceduretform1.button1click(sender:tobject);
var
s:arrayofpchar;
p:ttest2;
begin
setlength(s,2);
s[0]:='1234151';
s[1]:='abc';
p:=ttest2(@test);//函数转换,四字节指针赋值而已.
p(s);//参数使用arrayofppchar方式调用proceduretest
end;
char*params[]在一般的c++编译器(bcb、vc)是不能通过编译的,因为c++中不允许定义动态数组(c++的动态数组应该通过堆内存分配才行),但如果这样就不会错:char*params[]={“china”,“french”,“japan”};
char*params[]的准确含义应该是动态字符指针数组,在delphi中与arrayofpchar等价。
谢谢大家帮忙!虽然现在还没有调通但问题应该不是参数定义的问题了。通过讨论对c与delphi的类型有了更多的认识。
ding.......
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/