调用VB DLL的输出函数,用VB可以调用,但用C语言调用会出现非法操作,是不是只能用VB调用?
向各位前辈高手请教...

解决方案 »

  1.   

    文件类型为DLL的文件有1:动态连接库2:COM3:程序集.
    而C语言只能访问动态连接库.又因为用VB生成的DLL是COM所以会错误!
    你只需要把代码移植到VC中,建立一个动态连接库工程.即可!
      

  2.   

    能否发个编译器我,谢谢
    [email protected]
      

  3.   

    你可以使用VB制作出能够为C可用的动态链接库,详细方法请参考下面的文章(来自applevb.com)VB中创建的DLL只是COM组件,无法作为输出函数的DLL。今天从袁波哪里搞到一种可以创建输出函数的DLL的方法。 
    VB编译文件实际上采取了两次编译的方法,首先是调用c2.exe产生OBJ文件,然后调用Link.exe连接。如果在link的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法通过Link来输出函数了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句: 
    Private Sub Form_Load() 
        If (MsgBox("hehe", vbOKCancel) = vbOK) Then
            Shell "link2.exe " & Command$
        End If
        End
    End Sub然后编译为linktemp.exe,接下来将LINK.EXE改名为Link2.exe,将linktemp.exe改名为link.exe。这样在VB调用link.exe时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了 J
    然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long
        mathadd = a + b
    End FunctionBuilder这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。
    然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是:
    link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS
    注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了 :-D,可以被其他语言引入,例如在VB中,只需要:
    Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long
    就可以了。
      

  4.   

    sworddx(.:RNPA:. Hillinsilence;剑宇潇湘·秋叶原 Reloaded) 
    就是调用这种VB DLL出错,你试过没?
      

  5.   

    sworddx(.:RNPA:. Hillinsilence;剑宇潇湘·秋叶原 Reloaded) 请问,可不可以输出两个或两个以上的函数呀,
    要是有好几个函数要输出了
      

  6.   

    to asmgirl(过期菜鸟) 
    实际上我还没试过这个,只是偶尔看到这篇文章而已。to CHRL(陈取云) 大约可以在/EXPORT参数后面添加函数的名称吧,可能是用逗号或者分号区分开,我现在使用的机器上没有条件帮你试,抱歉了。
      

  7.   

    真想这样做也可以,用我的程序吧~~~~添加时会方便点:http://member.skycn.com/soft/20814.htmlhttp://m5home.365wl.com/soft/VB_LINK.rar但是,会有一个小小的问题存在,就是做出的DLL挑系统.我做过的试验:98下生成的DLL与2000专业版下生成的DLL是可以互用;而2003下生成的就不行了,只能在2003下用.XP未做测试,因为我这里没有XP的系统.请哪位老大帮做一下XP下DLL的测试???
      

  8.   

    虽然是有输出函数
    不过VB所使用的数据类型是VB特有的 
    并不是每个数据类型都和其他的语言通用
    VB里long 和 integer 都和其他语言的不一样 
      

  9.   

    同意~~~~~~所以DLL这种东西还是用C或ASM写最好
      

  10.   

    还是用DELPHI,起码DELPHI比C、ASM容易
      

  11.   

    也是.....现在不是还有国人的易语言吗,好像也可以写DLL的
      

  12.   

    to supergreenbean(超级绿豆 
    真的?C语言可以调用?
      

  13.   

    事实上(经过我的尝试),按applevb.com 上面的方法用vb做的动态链接库会存在一定的问题,
    只要是涉及对象的部分都会非法操作,一些常用控件,即使定义都不可,所以也就不能传递了.msgbox函数也会有问题
      

  14.   

    同上~~~~~我用那个方法做的DLL,用了这么久,发现仅仅能用来对非对象操作的函数进行封装.至于其他方面,比如速度,差别不大.
      

  15.   

    to myjian(小马) 
    你的意思是不能用C语言调用?
      

  16.   

    to lingll([20,200]) 
    那就给个源代码看看
      

  17.   

    按applevb.com的那个例子就可以了
      

  18.   

    to lingll([20,200]) 
    applevb.com上没找到VC的代码
      

  19.   

    这是命令行的程序,不过方法是一样的
    假设,vb创建的dll在c:\mydll.dll,函数名是mathadd,有两个long的参数#include <stdio.h> 
    #include <iostream.h>
     
    typedef int (CALLBACK* MYPROC)(int,int); 
     
    VOID main(VOID) 

        HINSTANCE hinstLib; 
        MYPROC ProcAdd; 
        BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
     
        // Get a handle to the DLL module.
     
        hinstLib = LoadLibrary("c:\mydll.dll"); 
     
        // If the handle is valid, try to get the function address.
     
        if (hinstLib != NULL) 
        { 
            ProcAdd = (MYPROC) GetProcAddress(hinstLib, "mathadd"); 
     
            // If the function address is valid, call the function.
     
            if (fRunTimeLinkSuccess = (ProcAdd != NULL)) 
    {
    int rtn=ProcAdd(4,5); 
    cout<<rtn<<endl;
    }
            // Free the DLL module.
     
            fFreeResult = FreeLibrary(hinstLib); 
        } 
     
        // If unable to call the DLL function, use an alternative.
     
        if (! fRunTimeLinkSuccess) 
            printf("message via alternative method\n"); 
    }
      

  20.   

    //to myjian(小马) 
    你的意思是不能用C语言调用?不,只要DLL内没有涉及类的操作,一般都没有问题。我还用Applevb.com上的方法做了一个小程序,如果你有需要,可以下载来用用,那样做这样的DLL时会轻松点。我个人觉得,这样的DLL与一个标准模块差不多,但是.....不可以操作类相关的东西....
      

  21.   

    我也晕了哦,一半别人都是用C写DLL再用VB调用,为的是结合VB的快速界面开发+C的高运行速度,楼主正好倒过来用。
      

  22.   

    呵呵,这样做DLL太麻烦了,不如直接用C写DLL呢,为什么不呢?
      

  23.   

    http://m5home.365wl.com/images/VB_Link.jpgVB的DLL改造过程就是这样....