15757753770 发表于 2016-12-11 15:05:21

在VC中调用VB编写的COM组件

在VC中调用VB编写的COM组件

★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用

vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe注册

=============================================================================
在VC中调用VB编写的COM组件

梅雷 - QQ1821117007
亲测 XP、win7(32/64位)可用

VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
先说说VB开发一个COM组件。
用VB新建一个ActiveX DLL 工程,
然后修改工程名称为 MyVB
再修改默认的类名为 DEMO
然后再向类中添加一个函数作为测试用,如: Visual Basic Code

注意!工程名不能为中文不然在c++中会出现无法识别的字符串



Dim str(999) As String

Public Sub GetMeiLei0() '无参数传递
MsgBox "梅雷qq1821117007"
End Sub


'带参数传递   Public Function
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
str(n) = str1

If n = 5 Then
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
End If

GetMeiLei2 = "数组传递0"

End Function


然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。

注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错


其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
而 VC 里调用可以这样做,如:
Visual C++ Code

//新建一个 UF程序,输入以下代码
/*****************************************************************************
**
** C++调vb.cpp
**
** Description:
**   Contains Unigraphics entry points for the application.
**
*****************************************************************************/

/* Include files */
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
#   include <strstream>
#   include <iostream>
    using std::ostrstream;
    using std::endl;   
    using std::ends;
    using std::cerr;
#else
#   include <strstream.h>
#   include <iostream.h>
#endif
#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>
#include <Windows.h>

#include <string>
#import "C:\MyVB.dll" no_namespace
//using namespace MyVB;    //这里是COM组件名称


HRESULT ComInit();
int mmm(char* str)
{
        ComInit();

        _DEMOPtr MyObj;      //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
        MyObj.CreateInstance("MyVB.DEMO");

        //MyObj->GetMeiLei0();//无参数调vb函数

char str1="0.0";

int n=5;

_bstr_t vRsinfo1;

vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数互传

strcpy(str, vRsinfo1); //字符串赋值

vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
vRsinfo1=MyObj->GetMeiLei2("qq",1);
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
vRsinfo1=MyObj->GetMeiLei2("手机",4);
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
        return 0;
}

HRESULT ComInit()
{
        HRESULT hr = S_OK;
        if FAILED(CoInitialize(NULL))
        {
                CoUninitialize();
                hr = E_UNEXPECTED;
        }
        return hr;
}


#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))



static int report_error( char *file, int line, char *call, int irc)
{
    if (irc)
    {
      char err,
             msg;

      sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
            irc, line, file);
      UF_get_fail_message(irc, err);

      UF_print_syslog(msg, FALSE);
      UF_print_syslog(err, FALSE);
      UF_print_syslog("\n", FALSE);
      UF_print_syslog(call, FALSE);
      UF_print_syslog(";\n", FALSE);

      if (!UF_UI_open_listing_window())
      {
            UF_UI_write_listing_window(msg);
            UF_UI_write_listing_window(err);
            UF_UI_write_listing_window("\n");
            UF_UI_write_listing_window(call);
            UF_UI_write_listing_window(";\n");
      }
    }

    return(irc);
}


/*****************************************************************************
**Activation Methods
*****************************************************************************/
/*Unigraphics Startup
**      This entry point activates the application at Unigraphics startup */
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
{
    /* Initialize the API environment */
    if( UF_CALL(UF_initialize()) )
    {
      /* Failed to initialize */
      return;
    }

    /* TODO: Add your application code here */



        char b="";
        mmm(b);
        uc1601(b, 1);   //在UG弹出显示框


    /* Terminate the API environment */
    UF_CALL(UF_terminate());
}

/*****************************************************************************
**Utilities
*****************************************************************************/

/* Unload Handler
**   This function specifies when to unload your application from Unigraphics.
**   If your application registers a callback (from a MenuScript item or a
**   User Defined Object for example), this function MUST return
**   "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload( void )
{
    return (UF_UNLOAD_IMMEDIATELY);
}






页: [1]
查看完整版本: 在VC中调用VB编写的COM组件