在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]