Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long请问:为什么一定要加一个private,如果将private改为public会出现编译错误,
why?please help me,3ks 先.

解决方案 »

  1.   

    恩还有那个GetComputerName的函数名不是挺好的吗,为什么它还要弄个别名呢,我觉得很奇怪。
      

  2.   

    怎样在VB中声明和使用API函数    
      一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:  声明的语法是: 
      Private Declare Function ... 
      Private Declare Sub..... 
      这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。   如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。
      先添加一个模块(如图示),
      然后采用如下语法声明: 
      Public Declare Function.... 
      Public Declare Sub....
      Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。 声明完毕我们就能在程序中使用此API函数了。  二、可采用以下几种方式使用API函数,以SetWindowPos函数为例: 
      (1)忽略函数返回值的调用: 
        SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3 
      注意此时函数的参数是不加括号的。 
      (2)Call方法调用: 
        Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3) 
      注意这里需要加上括号,但我们不取回函数的返回值。 
      (3)取得函数返回值的调用: 
        MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3) 
      此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。  三、几个问题的说明:  (1)声明中的Lib 和 Alias 是怎么回事 
      一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。 
      Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。  (2)常见的API参数类型的说明
      API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型 的值;另外几种常见的参数类型有:整型Integer、Byte型、String型等。  (3)声明中的ByVal是作什么用的 
      这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字,这样VB就采用传值方式传递参数了。   (4)怎样得到完整的API函数声明
      VB自带了API文本查看器API TEXT VIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴到程序中即可。
     
      

  3.   

    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long请问:为什么一定要加一个private,如果将private改为public会出现编译错误,
    why?please help me,3ks 先.恩还有那个GetComputerName的函数名不是挺好的吗,为什么它还要弄个别名呢,我觉得很奇怪。在标准模块中申明可以用public,窗体中申明只能用private
    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    GetComputerNameA
    里的A代表它是一个ANSI函数
    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameW" (ByVal lpBuffer As String, nSize As Long) As Long
    里的W代表它是一个Unicode函数
    两个函数的实际名称都不是GetComputerName,为了正确引用该函数,必须增加Alias子句,
    16位的API中,ASCII使用的是单字节编码,既ANSI,而32位的API使用的是UniCode的双字节字符编码.在把16位的API声明变为32位函数时,应在函数名后加一个"A",表示这是一个ANSI函数,或者加上一个"W",表明这是一个UniCode函数.
      

  4.   

    如果将private改为public会出现编译错误
    这可能是你在窗体模块中声明时,使用了PUBLIC,如果要使用公有变量的话,最好还是到标准模块中去声明
      

  5.   

    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
      

  6.   

    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long因为字符集的不同,所有含有字符串操作的 API 都有两个版本:ANSI(函数名以A结尾)和Unicode(函数名以 W (Wide) 结尾)。另外,在类模块中(包括窗口)只能声明 Private 的 API。Public 要在一般的模块中声明。