C语言中“char * params[]”的参数在delphi中该如何定义?100分求解决放过。 Delphi / Windows SDK/API http://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.......
|
请发表评论