神奇的*号

原创 2002年04月30日 09:14:00
 

                            神奇的*号<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


在使用VB编程的过程中,我想没有人不会用到定义一个字符串变量的,当然要抬扛就没折了。而在VB中定义一个字符串有如下两种方法:


1dim s as string


2dim s as string *100


其中第一种方法我想是用的最多了,在这里不说,因为文章的标题的“神奇的*号”,所以,我要说是第二种声明方法。第二种方法我想做VB程序的也没有不知道这是什么意思的,就是声明一个长度为100的字符串。这里的*就是表明声明一个定长的字符串。


在大多VB书籍中,讲到这里只是说明加了*号表明是一个定长字符串,不加表明是变长的,就不再说其它的了,最多有的书再讲一点,说变长字符串最多可包含大约21亿(231次方)个字符,定长字符串可包含1到大约64K216次方)个字符,这是我看到讲的最深的书了。在一般的使用过程中,这两种方法也没什么差别,只要长度够用,两种均可。但我要说的是在这里,这个*有时很神奇!因为用第二种声明方法声明的字符串,在当做参数用时就体现出了它的神奇。在应用时,有时需要按引用ByRef(在C/C++中是指针),此时如果还按第一种声明方法有时出现灾难性的内存错误!而改用第二种方法,就可以风平浪静,一切正常!


说到这里我想已经可以看出*之神奇所在了,那就是可以当做指针用。当然,在VB里是没有指针这个概念的,顶多是引用了(不要说还有取地址的StrPtrObjPtr函数呀,又抬扛了不是?)。所以在VBVC进行混合开发时经常会遇到这样的问题,因为与VC打交道就免不了使用指针,做过VC的一定知道其中有不少LPTSTRLPSTR等诸如此类的声明。要在VB中对应这类声明,最好用第二种方法,这样可省去很多麻烦。


下面举个简单又常用的例子。在VB程序中读取INI文件中的字符串。当然Windows API有现成的函数:GetPrivateProfileString,而用Visual Studio中的API View取过来的声明是这样的:


Private(Public) Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long


好了,现在一INI文件定义如下:


[Test]


Str=pursuer


则要读取Str的内容,这一段程序就可以轻松搞定!代码如下


Dim lpString as String *10


GetPrivateProfileString "Test", "Str1", "", lpString, 10, "c:/t.ini"


MsgBox lpString


这时如果这样:


Dim lpString as String *


GetPrivateProfileString "Test", "Str1", "", lpString, 10, "c:/t.ini"


MsgBox lpString


结果……哈哈,你自己试试看吧!


这时盖茨的操作系统会说你的程序很粗鲁,并以很粗鲁的方式告诉你,程序出错了!哈哈…..


这只是个简单的例子,如果用VBVC混合开发,如VCDLL文件在VB中调用,这样可以解决很多问题并且很方便。例如现有一VC做的DLLHandle.dll) 文件,其中有一函数其原型是这样的:


DWORD GetUserName(LPTSTR lpUserNameBuff)


此函数是用来取用户名的,并将取到的用户名放入lpUserNameBuff中,并返回取到的字节数。要在VB 中使用该函数,先声明一下:


 


Public Declare Function GetUserName Lib "Handle.dll" (ByVal lpUserNamebuff As String) As Long


 


好了,可以这样用:


Dim lpUserName as String * 16


GetUserName lpUserName


MsgBox lpUserName


同样,如果你这样:


Dim lpUserName as String


GetUserName(lpUserName)


MsgBox lpUserName


……….


可要后果自负呀!哈哈….


 


好了,这个*号是不是很神奇?赶紧动手试试吧!

【北大夏令营笔记-动态规划】百练2755:神奇的口袋

2755:神奇的口袋 查看 提交 统计 提示 提问 总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体...
  • u013517797
  • u013517797
  • 2014年07月19日 20:01
  • 1166

北大培训课动态规划----神奇的口袋(百练2755)

北京大学暑期课《ACM/ICPC竞赛训练》 ppt摘取 什么是动态规划? ●递归到动规的一般转化方法  递归函数有n个参数,就定义一个n维的数组,数组 的下标是递归函数参数的取值范围,数...
  • Lin_disguiser
  • Lin_disguiser
  • 2016年02月05日 15:41
  • 1358

iOS自定义转场详解02——实现Keynote中的神奇移动效果

Keynote,看过苹果发布会的朋友都不会对Keynote感到陌生。对,就是当年乔帮主应忍受不了微软的PPT于是开发的一款自己使用但是后来放到了iWork里面向大众公布出来的一款幻灯片制作软件。其酷炫...
  • zlyapple
  • zlyapple
  • 2016年05月13日 11:23
  • 1424

*号密码查看器(系统的漏洞)

  • 2011年08月20日 09:24
  • 4KB
  • 下载

Android模拟器*内核下载-编译-运行

记录一下如何下载android模拟器内核代码以及编译模拟器内核代码: 1.下载编译器内核代码 参考Android open source网站的Build kernel的步骤,http://source...
  • hiswill
  • hiswill
  • 2013年07月23日 09:29
  • 402

LeetCode—*Spiral Matrix问题,主要是用到了方向矩阵,很创意

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or...
  • xietingcandice
  • xietingcandice
  • 2015年03月29日 22:12
  • 561

关于char *ptr;

关于 char *ptr; 的用法以前还没有注意到char *ptr还可以这样用#include int main(int argc, char *argv[]){ char *ptr; int i;...
  • sunjiangangok
  • sunjiangangok
  • 2017年04月10日 10:20
  • 339

实习入职第九天---android错误之MediaPlayer用法的Media Player called in state *

原文地址:http://blog.csdn.net/jason0539/article/details/42588395 用法就不说了,使用的时候最好参考一下mediaPla...
  • u014737138
  • u014737138
  • 2016年05月29日 14:39
  • 482

OCMJ4*8C中文字库液晶驱动程序

  • 2009年04月11日 14:11
  • 7KB
  • 下载

Linux 指令歷史紀錄(History)的操作教學與範例 以及 Linux中神奇的叹号命令!

转自:http://blogger.gtwang.org/2013/10/mastering-linux-command-line-history.html,如有侵权,联系删除。 這裡教大家如何善...
  • heming621
  • heming621
  • 2015年06月11日 09:52
  • 238
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:神奇的*号
举报原因:
原因补充:

(最多只允许输入30个字)