Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1260405
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2008-09-23 09:46:24



VC写的动态库 一个参数定义成  
  “char   *   params[]”delphi中该如何定义?才能正确的调用。  
   
  有经验的朋友应该一看就知道。  
  因为好久没有来泡坛了。所以放100分吧。来者有分。  
   
   
  int   DllExport   PersonalizeCard   (long   CardNumber,   int   nargs,   char   *   params[])  
  如果成功会在C:下写ookk.txt文件    
  感兴趣的朋友可以通过下面地址下载DLL 试验一下。  
   
   
   
 

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   传上去了。地址   的“软件下载”目录下的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.......



[新闻]苹果发布最新的第四代iPodnano播放器
博客园首页 社区 新闻频道 小组 博问 网摘 闪存
阅读(1079) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~