wsprintf:一个疯狂的API ( 积分: 100 )

  • 主题发起人 主题发起人 草原牧歌
  • 开始时间 开始时间

草原牧歌

Unregistered / Unconfirmed
GUEST, unregistred user!
function&nbsp;wsprintf(Output:&nbsp;PChar;&nbsp;Format:&nbsp;PChar;p0:Integer=0;<br>&nbsp;p1:Integer=0;p2:Integer=0;p3:Integer=0;p4:Integer=0;p5:Integer=0;<br>&nbsp;p6:Integer=0;p7:Integer=0;p8:Integer=0;p9:Integer=0):&nbsp;Integer;&nbsp;stdcall;<br>&nbsp;external&nbsp;'user32.dll'&nbsp;name&nbsp;'wsprintfA';<br>&nbsp;<br>procedure&nbsp;TMainFrm.Button2Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;i1,i2,i3,i4,i5:&nbsp;Integer;<br>&nbsp;&nbsp;s1,s2:&nbsp;PChar;<br>&nbsp;&nbsp;s3,s4:&nbsp;PWideChar;<br>&nbsp;&nbsp;s5:&nbsp;char;<br>&nbsp;&nbsp;d:&nbsp;array[0..128]&nbsp;of&nbsp;Char;<br>begin<br>&nbsp;&nbsp;i1:=&nbsp;100;i2:=200;i3:=&nbsp;300;i4:=400;i5:=&nbsp;500;<br>&nbsp;&nbsp;s1:=&nbsp;'123345';&nbsp;s2:='67890';s3:='JQKA';&nbsp;&nbsp;s4:='我们是一家人?';&nbsp;s5:='a';<br>&nbsp;&nbsp;wsprintf(d,'i1:%d,i2:%x,i3:%d,i4:%d,i5:%d,s1:%s,s2:%s,s3%s,s4:%S,s5:%c',<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i1,i2,i3,i4,i5,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer(s1),Integer(s2),Integer(s3),Integer(s4),Integer(s5));<br>&nbsp;&nbsp;showmessage(d);<br>end;<br>要使用这个函数,还有更好的办法吗?
 
這個函數用&nbsp;Delphi&nbsp;不好用<br><br>不過有內部的&nbsp;Format&nbsp;可以用
 
这是c语言的特性之一,显示了c语言的确比其他语言要灵活很多,函数支持可变参数,<br>我对c中&nbsp;stdarg.h中的定义不是很明白,有谁能给我翻译成delphi程序,主要是<br>typedef&nbsp;&nbsp;&nbsp;void&nbsp;*va_list;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;va_start(ap,&nbsp;&nbsp;&nbsp;parmN)&nbsp;(ap&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;...)&nbsp;&nbsp;&nbsp;//这个怎么不能取到树组的值呢?&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;va_arg(ap,&nbsp;&nbsp;&nbsp;type)&nbsp;(*((type&nbsp;&nbsp;&nbsp;*)(ap))++)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;va_end(ap)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;_va_ptr&nbsp;(...)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#endif
 
关于<br>typedef&nbsp;&nbsp;&nbsp;void&nbsp;*va_list;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;va_start(ap,&nbsp;&nbsp;&nbsp;parmN)&nbsp;(ap&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;...)&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;va_arg(ap,&nbsp;&nbsp;&nbsp;type)&nbsp;(*((type&nbsp;&nbsp;&nbsp;*)(ap))++)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;va_end(ap)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#define&nbsp;&nbsp;&nbsp;_va_ptr&nbsp;(...)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;#endif&nbsp;<br>是取不到数组的值的,原来,在数组参数之前有6个int大小的信息头。<br>所以,暂时还没找到能将c中...的参数用delphi来声明的方法!
 
什么特性,pascal一样支持可变参数,叫&nbsp;compiler&nbsp;magic
 
各位富翁:<br>谁知道,read,readln,write,writeln的声明方法。好象它们都是可变参数耶!
 
http://www.isaybbs.com/bbs/dispbbs.asp?boardid=55&amp;id=3338<br>看了这个,好象才明白过来,pascal把read,readln,write,writeln当作了“标准标识符”<br>不过,还是没有实现机制的描述!
 
array&nbsp;of&nbsp;const<br>function&nbsp;Format(const&nbsp;Format:&nbsp;string;&nbsp;const&nbsp;Args:&nbsp;array&nbsp;of&nbsp;const):&nbsp;string;
 
/***<br>来自:newyj,&nbsp;时间:2007-10-24&nbsp;9:54:28,&nbsp;ID:3845453<br>array&nbsp;of&nbsp;const<br>function&nbsp;Format(const&nbsp;Format:&nbsp;string;&nbsp;const&nbsp;Args:&nbsp;array&nbsp;of&nbsp;const):&nbsp;string;&nbsp;<br>***/<br>Format('',[]),这个谁不知道啊?<br>拿出点真才实学来好不好啊!<br>请讨论:<br>&nbsp;像read&nbsp;这样的过程或函数,能不能自定义声明?<br>如果能,怎样声明?<br>如果不能,为什么?<br>或推荐相关书籍。
 
lz不是找到了那篇文章么,答案其实很简单。想调wsprintf,请用array&nbsp;of&nbsp;const,再配合内嵌asm,间接实现。<br><br>想实现类似的函数,用array&nbsp;of&nbsp;const<br><br>如果你一定要把函数定义写成read那样的形式,不行。这需要语法分析器和编译器的配合,而delphi没有这方面的语法扩展。<br><br>见http://www.yourblog.org/Data/20041/2523.html<br><br>如果你仍然不明白,请写段使用wsprintf的c程序,debug一下。
 
后退
顶部