如题

解决方案 »

  1.   

    一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL;一种是VC生成ActiveX控件(.ocx),在VB中插入;还有一种是在VC中生成ActiveX Automation服务器,在VB中调用。相对而言,第一种方法对VC编程者的要求最低,但要求你的伙伴进行配合,我推荐这种方法。 
        先说说VC++的编程。首先在VC++中生成Win32 DLL工程。在这个工程中添加几个函数供VB用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如: 
        short __stdcall sample(short nLen, short *buffer) 
        要做到第二条,需要在*.def文件中加上如下的几行: 
        EXPORTS 
         sample @1 
        这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。 
        再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。对于上面一个例子,先要声明VC函数: 
        Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer 
        这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法: 
        sample 10, a(0) 
        这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。 
        下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目录下,并确保VB的Declare语句正确。另一个问题是VB报告找不到需要的函数,这通常是因为在VC中*.def文件没设置。第三种情况是VB告诉不能进行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节。必须保证VB和VC的参数个数相同,所占字节数也一致。最后一个要注意的问题是VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃。 
        总的来说,你和你的伙伴需要一些时间来进行协调和摸索,但这种方法绝对可行,也不难掌握。 
      

  2.   


    象这样,跟调用API差不多:    Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
      

  3.   

    又慢了一点!楼上的,我恨你!http://expert.csdn.net/Expert/topic/2057/2057325.xml?temp=1.188296E-02
      

  4.   

    又慢了一点!楼上的,我恨你!http://expert.csdn.net/Expert/topic/2057/2057325.xml?temp=1.188296E-02
      

  5.   

    TO:  lihonggen0(李洪根,用.NET,标准答案来了) 
    假如在VC中参数声明为指针该怎么解决呀?
    如下:
    我用的动态连接库名是Trsbp.dll 。
    内含函数:TRSbp_cmd ,
    函数原型:int  TRSbp_cmd(TRS_CMD *trs_cmd,TRS_RESULT *trs_result);
    主要参数:trs_cmd──命令结构体,trs_result──结果结构体。命令结构体TRS_CMD
    定义
    typedef struct trs_cmd
    {
    char CmdId;
    char CmdLen[4+1];
    char *CmdBuf;
    }TRS_CMD;结果结构体TRS_RESULT
    定义
    typedef struct trs_result
    {
    char Status;
    char Rows[4+1];
    char Cols[4+1];
    char ResultLen[8+1];
    char *ResultBuf;
    }TRS_RESULT;在vb中该怎么做呀,怎样能把VC的结构体转化为VB的自定义类型。请指教!
      

  6.   

    Private Type Declare Function TRSbp_cmd Lib "Trsbp.dll" (TRS_CMD As TRS_CMD, TRS_RESULT As TRS_RESULT) As Long'命令结构体TRS_CMD
    '定义
    'typedef struct trs_cmd
    '{
    '  char  CmdId;
    '  char  CmdLen[4+1];
    '  char  *CmdBuf;
    '}TRS_CMD;
    Private Type TRS_CMD
      CmdId As Byte
      CmdLen(0 To 4) As Byte
      CmdBuf As Long '声明为long型,使用时是这样 CmdBuf= varptr(byte)
    End Type'结果结构体TRS_RESULT
    '定义
    'typedef struct trs_result
    '{
    '  char  Status;
    '  char  Rows[4+1];
    '  char  Cols[4+1];
    '  char  ResultLen[8+1];
    '  char  *ResultBuf;
    '}TRS_RESULT;
    '
    '在vb中该怎么做呀,请指教!
    Private Type TRS_RESULT
      Status As Byte
      Rows(0 To 4) As Byte
      Cols(0 To 4) As Byte
      ResultLen(0 To 8) As Byte
      ResultBuf As Long '声明为long型,使用时是这样 ResultBuf= varptr(byte)
    End Type
      

  7.   

    楼上的朋友,这样不行呀。(我试过了)
      Rows(0 To 4) As Byte
      Cols(0 To 4) As Byte
      ResultLen(0 To 8) As Byte
    这些都要定义为数组吗?
      

  8.   

    Private Type Declare Function TRSbp_cmd Lib "Trsbp.dll" (TRS_CMD As long, TRS_RESULT As long) As Long其他的同 huangguanshu()