unsigned char c_param1:怎么写成byval vb_param1 as BYTE 请填空 :P
LPCtstr c_param_2:怎么写成 vb_param2 as LONG,请继续填空 :)(不用byval)
unsigned long c_param3:怎么写成byval vb_param3 as LONG
unsigned char* c_param4:  vb_param4 as BYTE(不用byval)
unsigned long* c_param5:   vb_param5 as LONG(不用byval)

解决方案 »

  1.   

    贴给你自己看吧。
    发信人: yucheng (无话可说), 信区: VisualBasic        
    标  题: 针对API初学者的教程第二篇 
    发信站: BBS 水木清华站 (Thu Mar 30 21:09:36 2000) 
     
    Windows的一些特别之处 
    这个主题是要告诉你Windows 的一些与在VB中的不同的细节 
    Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东 
    西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件 
    相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的 
    某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都 
    提供了Hwnd属性来表示其句柄. 
    Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMod 
    e属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单 
    位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Sc 
    reen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下: 
    PixelXValue=TwipXValue\Screen.TwipsPerPixelX 
    PixelYValue=TwipYValue\Screen.TwipsPerPixelY 
    TwipXValue=PixelXValue*Screen.TwipsPerPixelX 
    TwipYValue=PixelYValue*Screen.TwipsPerPixelY 
    我并没有在实际中见到过TwipsPerPixelX 和 TwipsPerPixelY 的值有什么不同,但你最 
    好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这 
    里用的是" \ "(整除) 而不是 " / " ,这是因为像素值必须是整数. 
    另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意. 
    最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的 
    语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因 
    此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数 
    等等. 
    从哪里得到有关函数的说明? 
    这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一 
    个API函数文档. 
    为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放 
    在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0 开发包或者MS Visual C++中 
    .到网上去或找您的朋友要一个,版本越新越好 
    注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他 
    们中的大多数由于与 Windows95兼容而依然存在. 
    API参数类型 
    如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如 
    VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其 
    他不熟悉C语言的人,这里有一张摘自 VB 
    Books Online(标题是:C语言声明到Visual Basic的转换) 
    C 语言数据类型 在VB中的声明 Call with 
    ATOM ByVal variable As Integer An expression that evaluates to an Integer 
    BOOL ByVal variable As Long An expression that evaluates to a Long 
    BYTE ByVal variable As Byte                An expression that evaluates to a 
     Byte 
    CHAR ByVal variable As Byte                An expression that evaluates to a 
     Byte 
    COLORREF ByVal variable As Long                An expression that evaluates  
    to a Long 
    DWORD ByVal variable As Long                An expression that evaluates to  
    a Long 
    HWND, HDC,HMENU,etc.(Windows handles) ByVal variable As Long                 
    An expression that evaluates to a Long 
    INT, UINT ByVal variable As Long An expression that evaluates to a Long 
    LONG ByVal variable As Long An expression that evaluates to a Long 
    LPARAM                     ByVal variable As Long                 An express 
    ion that evaluates to a Long 
    LPDWORD variable As Long An expression that evaluates to a Long 
    LPINT, LPUINT variable As Long An expression that evaluates to a Long 
    LPRECT variable As type Any variable of that user-defined type 
    LPSTR, LPCSTR ByVal variable As String An expression that evaluates to a Str 
    ing 
    LPVOID variable As Any Any variable (use ByVal when passing a string) 
    LPWORD variable As Integer An expression that evaluates to an Integer 
    LRESULT ByVal variable As Long An expression that evaluates to a Long 
    NULL As Any orByVal variable As Long ByVal Nothing or ByVal 0& or vbNullStri 
    ng   
    SHORT                      ByVal variable As Integer An expression that eval 
    uates to an Integer 
    VOID Sub procedure Not applicable 
    WORD ByVal variable As Integer An expression that evaluates to an Integer 
    WPARAM ByVal variable As Long An expression that evaluates to a Long 
    注释: 
    你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示"假"(Fal 
    se),其他任何值表示"真"(True). 
    HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以"H"开头来 
    表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句 
    柄等等.它们均为Long而且要按值传递(ByVal). 
    同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型. 
    有些类型以"LP"开头.LP 是Long Pointer的缩写.因此LPWORD实际表示数据所存的内存地 
    址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你 
    实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以"LP"开头,应该按 
    引用(ByRef)传递.顺便说一句,LPARAM 与 Lparam 很相似但不是Lparam,Lparam不是一个 
    指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递. 
    NULL也是一种奇怪的类型.你可以从 VB 中了解到有关它的描述,这里我不去讨论它.按你 
    需要的形式传递它吧,在大多数情况下,可以用 ByVal 0& 或 vbNullString. 
    最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记 
    住:如果一个函数被声明为VOID ,你必须在 VB 中把它声明为 SUB.