查看: 3074|回复: 0

[原创] 在VC中调用VB编写的COM组件

[复制链接]

8

主题

10

回帖

146

积分

注册会员

积分
146
QQ
发表于 2016-12-11 15:05:21 | 显示全部楼层 |阅读模式

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

×
在VC中调用VB编写的COM组件) t5 M9 ]& I4 T/ _9 d6 s2 ]$ q' A
! g) Q! b! o; {. p" ^
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用$ P  R5 |+ A% ?" |

& E3 c; e2 p4 p6 t8 ~% N2 T9 g- B3 Yvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册5 F1 t3 b) L7 \# A3 s2 u! {2 ~  E  t

( o% y7 W9 {( T; L& o=============================================================================
1 F0 q. |" S# W+ L2 F' P) b在VC中调用VB编写的COM组件* l/ _) l9 ]4 o- p

* e2 W9 G; N6 T" W2 L* G  j" |! s) V梅雷 - QQ1821117007 8 _% M: N6 z$ k4 v1 P. A
亲测 XP、win7(32/64位)可用
! y" l- M% D! N( C) X1 J, s2 B3 s" H" Q" b
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。* |5 a4 I2 M  k1 x( H0 U: [' D
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 - l1 }2 U+ E$ T) l" K7 A
先说说VB开发一个COM组件。 9 }' C: Z5 F, K% K
用VB新建一个ActiveX DLL 工程,
( S  d6 i7 M0 X! F然后修改工程名称为 MyVB # c9 B* V" d5 [
再修改默认的类名为 DEMO + s9 P8 {' l; r  |7 I6 @4 B
然后再向类中添加一个函数作为测试用,如: Visual Basic Code( [/ P) D' H/ y0 h+ P
1 `. J5 D( y) m2 z, X( v2 Q& U  n% C
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
2 a. e. C% w) u" u, i+ k2 I# _5 q# d/ q! n
& o) ?. J% v3 ^4 t- R$ o+ f

; D( Q1 r' p3 l0 f* ]8 GDim str(999) As String( Y$ `; @. z; F" O. o; b0 u
; C- D, b. W* B$ u
Public Sub GetMeiLei0() '无参数传递( [( i' t. d3 @
MsgBox "梅雷qq1821117007"
; _/ G' P% e+ K% g% y# eEnd Sub( H! l+ [2 ^0 G' p+ o! |4 [
2 t1 a: X1 ~5 b' e6 R9 u
$ `8 Y. s0 E* l" q' E# ]: |$ F
'带参数传递   Public Function6 r% v* R; Z9 l
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
; p/ q3 @5 l; z/ }* C0 @str(n) = str14 V" p6 @' n) E' L

$ d4 B% Y) ~# y: a8 e0 i9 n9 PIf n = 5 Then
5 t$ m) Q7 E  B: S; ]MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
; ]9 \6 S0 O% A1 e+ ~: i1 O  q3 ]+ p' b. FEnd If
% I) ^9 G: \  e1 F4 F* b' l
; ^! ~, X7 V) j9 N  Y9 LGetMeiLei2 = "数组传递0"/ m- H* D4 A/ [. y2 ~( W+ i9 w
9 p7 s2 [# L5 J, {
End Function1 ?' f" D  G0 ]$ l5 u

9 y) k# ~& O. d; C+ z4 S
# \, e  A. u* Q& L然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
8 t! U8 d. v2 i5 ^" h+ H6 f) ~. }% J5 E) ], Q$ Z, {/ h
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
- u# j5 v: r+ |5 v0 O. G" R+ \
7 `& v4 b1 z5 G* p6 |$ `2 H4 n/ y1 {0 w' h+ a- |& R# }
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
9 s3 K% Y- C' t0 q# F7 e( n8 E- l- \而 VC 里调用可以这样做,如: $ W* s0 z5 r: Q8 b
Visual C++ Code " m4 a& t7 m/ H/ m: W
# D3 M0 `1 P- ?* l, s) x
//新建一个 UF程序,输入以下代码" ^0 y# G) N1 E" F
/*****************************************************************************
; b4 X# K/ l7 i6 B0 k* T**
2 ~, y8 _+ v1 R5 \2 q/ a% o( Y** C++调vb.cpp
) D9 a/ D" \# X6 |. H**& w% u& p8 A% f4 s" ]* I
** Description:3 i, C3 a/ @* j4 T$ B
**     Contains Unigraphics entry points for the application.; e( ^+ Z& [( V
**
& s8 ^3 k: j8 D# q( m$ v0 ~5 V; d*****************************************************************************/
2 u) Q' [6 [0 B$ J' r% g3 g! m( q0 I+ s1 f, ?! S
/* Include files */
5 z9 V: t# b! ^6 a  P4 c#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
$ o# X, T. @+ x#   include <strstream>
' Y3 E5 D2 L/ n6 P$ v" m#   include <iostream>
# P9 v% V  L: F    using std:strstream;
6 u" C5 ^2 F; k  v/ U4 |1 H1 p2 e    using std::endl;    4 h& @0 O7 x+ n- i: c: s
    using std::ends;/ H# ^5 A1 X' \4 o/ [
    using std::cerr;
$ b" J6 k# N- O- t* i/ {% _#else
0 A4 @* a# V3 j6 p7 x6 B* y#   include <strstream.h># j/ A; S8 k! a& Z( p6 O3 m
#   include <iostream.h># P, G0 q* v0 }, w
#endif  r3 v) L) U. Z0 p& m3 |3 a
#include <uf.h>
9 K/ d4 v; ~4 t% f#include <uf_ui.h>
, T7 [. C2 r  @7 o#include <uf_exit.h>
1 s5 \1 o% ]! p* j# D* e6 W#include <Windows.h>
, S4 u% Y; A0 U8 }/ ~/ ?  V  t5 [
5 _( q9 U! Z% n3 a#include <string>
2 V% X" E6 z/ S+ r4 g4 S  X9 L: y#import "C:\MyVB.dll" no_namespace
5 q. Y3 [" }' V1 \/ Q$ C//using namespace MyVB;    //这里是COM组件名称
" f# f# G$ [5 i
% C' W/ k: J3 x$ p2 X6 U5 W
2 Q. |; b+ G# y9 R; q% wHRESULT ComInit();3 D/ O* g  x7 l0 H# Z
int mmm(char* str)
. Q$ t/ q4 A8 k* u, A{% T  C# D! n5 y( y( p5 u: P8 c
        ComInit();$ x, B/ {3 j& o  C

- Z8 D8 @  ]8 i6 D/ @7 J) K        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
2 E. k9 _. D. V! ~, u+ m        MyObj.CreateInstance("MyVB.DEMO");
# p) k1 u- u2 L" m0 a/ ]/ k7 }& F, f
! b- O4 z  L; g7 r# M        //MyObj->GetMeiLei0();//无参数调vb函数4 W, k4 M  J% G- P( Z6 e4 Y

2 ?1 v/ @3 g# |8 t; Z, [; B( jchar str1[132]="0.0";* w) B/ Y, H- |& @7 Y: H, Q

# X* w1 {7 A& i4 @! b; _int n=5;
* ^) S6 R* t4 Z: r& F0 U5 p. N) g* Y
_bstr_t vRsinfo1;5 I8 S2 Z' ?5 Y
; I) @# H  n, t0 q" T
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
3 J  ?1 b* R3 S6 j( u! a
3 j; I' V6 S% X- k$ S' y; T' dstrcpy(str, vRsinfo1); //字符串赋值
# K$ n2 _  k% Y4 `2 q# H7 y2 S- u" B/ M+ Z' P7 X" s
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);4 N+ y7 ^" B# C" n2 v) r, g
vRsinfo1=MyObj->GetMeiLei2("qq",1);; u8 u) y1 [9 V: I/ }! N; X1 @
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
/ W1 e( @) ]6 w4 l/ C7 f( ^2 K$ ^* ]# GvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);" F  s3 ~( a1 U
vRsinfo1=MyObj->GetMeiLei2("手机",4);/ M0 G. [8 `/ n7 o: \* N
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);; v) E/ D4 t5 ?* o4 v
        return 0;
. _) \" }0 ]$ `/ r# g$ f, \% Y; b}( z: k4 T, t3 F( `( `
: F# n, N: ~1 V$ C
HRESULT ComInit()
; X9 m! w* Y5 f+ L" [2 P4 Y{! k$ \, E4 O; V6 I: ]
        HRESULT hr = S_OK;3 o( d# ?$ Z7 b  D  f4 W- f
        if FAILED(CoInitialize(NULL))
4 g# J  g  G# V4 z. @        {( A. ~+ o7 M1 L8 K7 h
                CoUninitialize();: w  t" L9 A$ _8 ?3 q
                hr = E_UNEXPECTED;
* x- l! b( m+ s- P  G/ o' F( T        }
5 ]& ]6 D0 Y: Y/ J1 f: `+ d        return hr;
- _* |' ]: \7 M% q6 K  E}, M5 |( ^; p/ P0 z* R
0 V8 R- W/ X) W/ s* \; S; N
5 m" v9 @9 ]( a, i0 m4 e( ?! i
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))): C- g0 L" V/ v$ w: T) c

  ~1 \( `5 d6 t5 Z" P& L
0 r2 `4 q3 |' c
3 y: w8 y% \' P8 f4 _; \2 R" _static int report_error( char *file, int line, char *call, int irc)
+ z9 i. C8 O7 ^3 T4 ~{# i- k% r- _- m5 V4 v( t. T2 F
    if (irc)
# ^) V( K) M+ k& o    {5 h; v5 [& }3 @5 Y- {* h3 A
        char err[133],! F. h# |; E0 R8 h# E0 A% x0 G
             msg[133];9 M0 K) L1 [9 C5 _4 |
& H& _; H; Z) L  l2 ]
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",' W% a; \3 u0 u& p3 F: Z
            irc, line, file);
/ _. {( Q# V0 X$ a" n        UF_get_fail_message(irc, err);* E6 `% q6 C: d' P

( G0 d, L6 K, e" r  z$ R" h, r        UF_print_syslog(msg, FALSE);
, R6 v6 P  h8 X8 s: a        UF_print_syslog(err, FALSE);
7 k  K- ]) {9 P% N' R1 I9 t* o        UF_print_syslog("\n", FALSE);
1 O! y5 k+ a: b        UF_print_syslog(call, FALSE);
# B4 o: E$ `7 ?8 P: s# E' }7 [        UF_print_syslog(";\n", FALSE);
/ O' v1 \; `4 o5 ~* R9 S) I3 {5 n7 J, p8 t# Z0 V
        if (!UF_UI_open_listing_window())
$ ~: O! l/ [9 C$ J3 L+ X        {: Z* _6 \' Z  T% _' M
            UF_UI_write_listing_window(msg);
* T2 s# T' v" S4 s            UF_UI_write_listing_window(err);" f+ X0 f' R0 a1 y
            UF_UI_write_listing_window("\n");0 ^. U8 P, ~3 E% B+ v; P! ?
            UF_UI_write_listing_window(call);
/ p; T- g/ ]$ `7 }2 k! ~' n) q5 G& O$ ~% V% A            UF_UI_write_listing_window(";\n");
3 n; |9 J' d5 c, t, I! G) u        }
( m7 a+ r  v# N$ K. h    }
/ c1 Y) o' I- Q; b3 [+ \# ^
4 M( b$ u" a! W' s' s0 D    return(irc);
6 b" V+ W5 J( G2 Q}4 M. f6 b2 n( T: I- G0 M" x
% W3 A; g' n! P7 q/ D
: \5 M0 ]4 Y8 f$ P7 ^
/*****************************************************************************! c. G9 x9 N8 N6 F/ c8 j
**  Activation Methods1 \  f7 l6 V1 a: U
*****************************************************************************/
9 U6 `/ j' e( o& o- d/*  Unigraphics Startup
5 ~4 o2 A! f4 u" Y- \8 b5 j3 Q, R' ]**      This entry point activates the application at Unigraphics startup */
0 `" x; d  X, W, B5 ^9 u# P9 Xextern DllExport void ufsta( char *param, int *returnCode, int rlen )" y5 i: O, I# v# w3 }
{  c" L) N8 R. t8 u2 U
    /* Initialize the API environment */% v% _! w- C& I7 J2 J9 Q
    if( UF_CALL(UF_initialize()) ) & S$ L$ r4 x1 b/ O; m+ H# K2 Q
    {
9 ^1 p* n9 e# P- e, y& M        /* Failed to initialize */
2 Q# d* L* m& N' e        return;
, \- P5 F- f: e5 G    }; x+ S9 J* Z+ G* q0 e4 Y& L
# x6 g4 u  P& e% W' j: ^0 Q9 P
    /* TODO: Add your application code here */
- w0 J' o: g1 K. \. D
0 T  [9 C. E# p' l9 p7 e3 r$ e$ Y- h0 F  j! K5 r3 Q0 l
  s4 u& i- j/ G3 u
        char b[132]="";' E5 r( D9 }* k+ _5 f: c1 }
        mmm(b);7 n7 Q  B' \  e4 D7 {
        uc1601(b, 1);   //在UG弹出显示框
/ t2 Z! g; ^# _8 s2 ]/ t, \& t* b& M1 `. ]2 v5 t: g4 R9 K

" K- d, |9 i7 _9 u    /* Terminate the API environment */4 ?* [3 V( G; x
    UF_CALL(UF_terminate());: N. N! O4 K# b$ p( c) [' u
}
' b( ^$ z0 E6 \  x& p
2 F5 ^# X1 _. V( g* l/*****************************************************************************
- E1 x6 s- `5 k( `0 o  o# d**  Utilities
4 s6 Z2 k, T/ h( E*****************************************************************************/
. B! g6 q: s1 |! x
. z6 W; O+ T) Q( W/* Unload Handler2 V: r% F) `9 P$ b
**     This function specifies when to unload your application from Unigraphics.. Y9 @/ ^2 X4 u. y9 z% q* r* z
**     If your application registers a callback (from a MenuScript item or a
& l8 j- n, [' b, ]+ u/ H**     User Defined Object for example), this function MUST return- A! ^4 V0 A$ @7 `% ^$ v* q
**     "UF_UNLOAD_UG_TERMINATE". */
2 B; p& d' H7 o' ~+ O6 rextern int ufusr_ask_unload( void )
* Q# e6 R! K7 B( r: U{
3 }) d, G# w  N    return (UF_UNLOAD_IMMEDIATELY);% j. O; H$ \/ d4 R
}8 X" W. g9 e. ^

9 a7 K! ]6 y% T9 T& i+ @9 A/ W4 k$ r& @. @9 p8 u. R+ m& Q0 C/ j

4 |! u& P* t8 T2 |' I+ E2 Q0 V/ N; T
9 z" K8 @8 e) j7 `8 ^0 V# x
. V, Q$ G1 m3 A4 q3 S8 o
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部