我用vc6编好了一个dll(接口有效)假如有以下一个接口:void xxx::a(char *strs, unsigned short b1, unsigned long b2)那么在vb6调用时应该怎么写,我关键是弄不明白两种语言的数据转换(两种语言的数据类型有很多都不一样),有经验的请帮帮忙

解决方案 »

  1.   

    下面有一个实例:action.dll先把action.dll放在"C:\WINDOWS\system32"下然后在模块中声明,如∶
    Public Declare Function expData Lib "action" Alias "expDataA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
        lParam As Any) As Long接着,在窗体中调用此函数
    Call expData(MOList.hwnd, LB_SETTABSTOPS, 0&, ByVal 0&)
      

  2.   

    如果仅 void a(char *strs, unsigned short b1, unsigned long b2) 的话就Declare Function a Lib "DLL名称" Alias "a" (ByVal strs as String, ByVal b1 As Long, ByVal b2 As Long)不过由于C++ 编译时会在函数上增加一些别的字符,所以如果你能够把C++的定义改成Extern "C" {
      void a(char *strs, unsigned short b1, unsigned long b2)
      }就没问题了
      

  3.   

    这个过程我也知道,假如前人引用过这个函数那我也很容易了解引用的数据类型。但是有些情况不同,比如unsigned long 不同于 long, 一个是32位一个是16位,但vb6里好象又没有unsigned long 或者unsigned  short之类的类型,强行转换数据类型经常造成内存读写错误。而且大多数情况在动态链接库设计时并不一定要考虑是什么语言来使用它。大家帮帮忙,实际上就是三种数据类型: char *=byval string or string??
    unsigned long =??
    unsigned  short =??
      

  4.   

    找你目前的情况看,这样可以char *=byval string
    unsigned long = byval long
    unsigned  short =byval integer
      

  5.   

    谢谢大家,其实从NewPeople(新新人类)就已经对了,vb的数据类型转换智能很好,出现内存读写错误是因为少引用了一个量.