C语言中“char * params[]”的参数在delphi中该如何定义?100分求解决放过。 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061130165801145.html
VC写的动态库 一个参数定义成
“char * params[]”delphi中该如何定义?才能正确的调用。
有经验的朋友应该一看就知道。
因为好久没有来泡坛了。所以放100分吧。来者有分。
int DllExport PersonalizeCard (long CardNumber, int nargs, char * params[])
如果成功会在C:下写ookk.txt文件
感兴趣的朋友可以通过下面地址下载DLL 试验一下。
http://ys-h.ys168.com/ys168up/D1/?dll.rary72z7ld4f9f9b1f8z95b4b4b7b0b1b1fq9b4b2b7fl9fl6e14z97e14e24b1b2f2b1fl9b4fc6fd7z
params : array of char
type
c=array of PChar;
int DllExport PersonalizeCard (long CardNumber, int nargs, params c)
谢谢大家支持!如方便请大家下载后调用一下。
然后把程序贴出来。
to:hongqi162(失踪的月亮)
我试了一下,没成功。
相信你应该能搞定。赶快出手吧。
个人认为char * params[]是一个字符指针数组,不应该理解为array of char,而应该理解为array[low..high] of string或TstringList类。本人初学,对概念的理解可能较肤浅,高手勿笑
二楼array of pchar应该是最精确的理解了
用PChar
function PersonalizeCard (CardNumber: Cardinal; nargs: Integer; params: PChar): Integer;
对应是array of PChar,我觉得
C里面有种调用方式是...,意思是说可以写入很多参数的那种,感觉params差不多。
LZ这样一试:
var
Buffer: array [0..10, 0..1024] of Char;
begin
//buffer赋值
PersonalizeCard (no, 10, @Buffer);
end;
dll弄不下来,不弄了。
楼上的有道理,不过后面要加stdcall; external dllname等,否则还是错误的.总之,那个参数是个指针就行了,至于怎样用,要看情况,输出和输入指针可有不同的处理
谢谢大家的支持,根据大家的思路早上我又试了一次还是不行。
百思不的其解呀!
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就可以了
用的时候定义一个array of char 数组就可以了!
在参数前面加个var就行了
最好把array的参数定义成record来传
类型严格对应的DELPHI声明是
params: PPChar;
定义成
params: Array of PChar; 也可以的,
Array of PChar可以强制转换成PPChar不出问题,
但反过来转换不行的.
感觉楼主问题不在这儿.
看楼主的DLL C声明中,并没有声明__stdcall,
那为什么DELPHI声明中要用stdcall? DELPHI声明对应的应该是cdecl
string是Pascal特有的类型,不能直接兼容PChar
char * params[]
看成一个PChar的数组,就是array of PChar
function PersonalizeCard (
CardNumber: Integer;
nargs: Integer;
params: PPChar
): Integer; stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
vParams: array[0..1] of PChar;
begin
vParams[0] := 'Zswang';
vParams[1] := '到此一游';
PersonalizeCard(1, 2, @vParams[0]);
end;
你提供的Demo无法调试,缺少Mfc42d.dll、MSVCRTD.DLL
只有你自己调试了
关于array of char 与PPCHAR 类型转换,可以看下面代码验证其可行.
//---------------------------------------------------------------
procedure test(params : ppchar);//这儿用的PPChar类型,严格对应char* params[];
begin
ShowMessage(params^);
inc(params);
ShowMessage(params^);
end;
type
ttest2 = procedure(params: array of pchar);
procedure TForm1.Button1Click(Sender: TObject);
var
s: array of pchar;
p: ttest2;
begin
setlength(s,2);
s[0] := '1234151';
s[1] := 'abc';
p := ttest2(@test);//函数转换,四字节指针赋值而已.
p(s); //参数使用array of ppchar 方式调用procedure test
end;
char * params[]在一般的C++编译器(Bcb、VC)是不能通过编译的,因为C++中不允许定义动态数组(C++的动态数组应该通过堆内存分配才行),但如果这样就不会错:char * params[]={“china”,“French”,“Japan”};
char * params[]的准确含义应该是动态字符指针数组,在delphi中与array of PChar等价。
谢谢大家帮忙!虽然现在还没有调通但问题应该不是参数定义的问题了。通过讨论对c与delphi的类型有了更多的认识。
ding.......