用c生成了一个dll,dll中定义一个函数encode:
char * __stdcall encode(char *data,int mode),函数返回一个字符指针;请问在vb里面如何声明并调用这个函数?

解决方案 »

  1.   

    怎样把VC++代码转换成VB代码    对于大多数VB的爱好者来说,在很多情况下都想通过使用API函数来实现一些比较高级的功能或达到某种特殊效果,这就需要用到一些VC++的代码. 
      本文就如何把VC++代码转换成VB代码给出了一些策略和方法. 
      1.定义常量 
      我们首先看第一个例子: 
    #define STD_COPY 1//COMMCTRL.H 
      在VC++代码中用#define定义常量,而在VB中是用Const来定义,因此转换成VB的代码是: 
    Public Const STD_COPY=1 
      第二个例子: 
    #define LB_SELECTSTRING0x018C //WINUSER.h
      这有一个问题,VC++中所有以"0x"开头的值是十六进制,而在VB中表示十六进制要用"&H"开头.因此转换成VB的代码为: 
    Const LB_SELECTSTRING = 0x018C
      第三个例子: 
    #define TCN_FIRST(0U-550U) 
      这里有个特别的是定义的值是以"U"结尾,这是意味着该常量的类型是"unsigned long"(在VB中不支持 该数据类型).但是unsigned long和signed long(在VB中是Long)两种数据类型的值在存储方式上是一样 的,只是表现的形式不同.因此,我们只需要去掉末尾的"U"就可以了. 
    Const TCN_FIRST=(0-550) 这同样适合以"L"结尾的值 
      另外,对于 #define CDDS_ITEMPOSTERASE(CDDS_ITEM | CDDS_POSTERASE),我们需要用"Or"来取代"|" 
      2.结构的定义 
      我们先看VC++定义的一个比较简单的结构: 
    typedef struct tagTBSAVEPARAMSA{
    HKEY hkr;
    LPCSTR pszSubKey;
    LPCSTR pszValueName;
    }TBSAVEPARAMSA,FAR* LPTBSAVEPARAMSA;
      首先我们需要把第一行的"typedef struct"转换成"Public Type" 
    Public Type tagTBSAVEPARAMSA
      然后处理结构成员, 
    HKEY hkr;
    LPCSTR pszSubKey;
    LPCSTR pszValueName;
      对于第一个成员类型HKEY.我们要知道VC++中的以"H"开头的大部分数据类型代表的是某种句柄.在VB中每一个Form对象和许多控件都有一个hWnd属性,它代表所属窗口的句柄.hWnd的类型是Long,并且所有用来存储句柄的变量类型都是Long.因此,该成员在VB中定义为: 
    hkr As Long
      同样的,VC++数据类型LPSTR和LPCSTR代表指向字符串的指针,在VB中可以当作String类型.因为当你传送结构给API时,VB将把结构中所有的String转换成指向ANSI字符串的指针.因此后两个成员在VB中表示为: 
    pszSubKey As String
    pszValueName As String
      对于最后一行"}TBSAVEPARAMSA,FAR* LPTBSAVEPARAMSA;"我们只需要用"End Type"取代 就可以了.转换成VB代码后完整的结构为: 
    Public Type tagTBSAVEPARAMSA
    hkr As Long
    pszSubKey As String
    pszValueName As String
    End Type 
      以下是VC++中数据类型对应到VB中的数据类型VC++数据类型VB数据类型 
    ------------------------------------
    short Integer
    intLong
    long Long
    UNIT Long
    ULONG Long
    WORD,DWORD Long
    WPARAM,LPARAM Long
    WMSG,UMSGLong
    HRESULT Long
    BOOL Boolean
    COLORREF Long
    HWND,HDC,HBRUSH,HKEY,等等. Long
    LPSTR,LPCSTRString
    LPWSTR,OLECHAR,BSTR String
    LPTSTRString
    VARIANT_BOOLBoolean
    unsigned char Byte
    BYTE Byte
    VARIANT Variant
    (任何以*或**结尾的数据类型)Long 
      3.函数的转换 
      我们知道VB提供了API Viewer add-in,但是有很多API函数它并没有包括在内. 因此知道如何把VC++函数转换成VB的函数格式是非常重要的.先看第一个例子: 
    WINCOMMCTRLAPI HWND WINAPI 
    CreateStatusWindowsA(LONG style,
    LPCSTR lpszTest,HWND hwndParent,UINT wID);
      这个函数创建一个StatusBar控件.从WINCOMMCTRLAPI可以得知该函数来自动态 链接库ComCtl32.dll.(有时,我们需要从MSDN中查找某函数对应的DLL) 然后我们知道该函数的返回类型是HWND,对应VB的类型是Long.最后,根据前面提到 类型对应表,很容易的转换相应的函数参数. 
    Public Declare Function CreateStatusWindowA Lib 
    "ComCtl32.dll" _
    (Byval style As Long, _
    Byval lpszText As String, _ 
    Byval hwndParent As Long,Byval wID As Long) As Long转载自计算机世界日报 (文/刘锋) 
      

  2.   

    我在程序中声明如下:
    Private Declare Function encode Lib "upcBarcode.dll" (ByVal data As String, ByVal nMode As Long) As String然后调用:
    Dim strBarCharaters  As String
    strBarCharaters = encode("54256356985", 0)运行时报应用程序错误,大致意思是:指令引用某内存,而该内存不能读。
    ------------------------------------------------------
    请问是什么问题?
      

  3.   

    Private Declare Function encode Lib "upcBarcode.dll" (data As String, ByVal nMode As Long) As String
    试试
      

  4.   

    to  rainstormmaster(rainstormmaster) :试过了,一样的错误;为了方便调试,encode函数没有做任何事,直接返回一个字符串。
      

  5.   

    问题函数encode的返回值类型上,当把encode的返回值类型改成int型,声明做同样的调整后,可以运行!
    请问怎样接收从c函数中返回的字符串?
      

  6.   

    如果用过普通的API调用就知道,与API打交道时你只能将一个字符串缓冲区的指针作为参数送进去,具体原因比较麻烦。所以简单的做法就是在Dll的参数中定义一个字符串,通过Byval将指针传进去(VB就是这么定义的),当然还要传送一个缓冲区的尺寸进去,在Dll内部将结果字符串填到缓冲区中,注意要按ANSI格式填写,不能填成Unicode——一般不会。
      

  7.   

    Private Declare Function encode Lib "upcBarcode.dll" (data As Byte, ByVal nMode As Long) As String把 strBarCharaters 转为字节数组,调用时数组的第一个元素作为参数。
    记得数组最后一个元素为0。