PLM之家PLMHome-工业软件践行者

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

[复制链接]

2016-12-11 15:05:21 2771 0

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

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

x
在VC中调用VB编写的COM组件" P1 O1 R; W$ ?3 {8 v! l) Y4 w

7 r! `/ S: m0 n1 o; [" Q★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
2 }0 Q; }0 w" P% ]  A$ a$ D/ U( c
! D" m% a+ Y' Y9 z, ?2 Cvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册# |/ k! ?" `$ P0 @# t3 n  a7 i
) w5 \0 U, i# I9 S% Z0 x
=============================================================================
* Y0 O: M" O  r. H在VC中调用VB编写的COM组件- ~8 F8 c6 w1 p$ n  J( f$ T2 |

( X9 i) q0 Y) P) M' t* r梅雷 - QQ1821117007
$ a/ F7 P. w- W, G& B亲测 XP、win7(32/64位)可用
0 \2 W4 Q/ |8 Z  p  m1 ^" `& `5 u( {( x3 H" G/ \
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。& y' j, K  A* y$ L7 y7 d4 p
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
0 q0 s6 O8 n' q. f# w% p  k先说说VB开发一个COM组件。 5 V8 O4 ]* h* A& s& S
用VB新建一个ActiveX DLL 工程, : N$ a- F) _6 D* K) _
然后修改工程名称为 MyVB
- U3 L. ^0 @% {# x再修改默认的类名为 DEMO 8 O/ |" d& w1 g5 G
然后再向类中添加一个函数作为测试用,如: Visual Basic Code- H0 v! b8 \: N1 \2 G6 c$ i

4 @* N( a4 c5 M6 d  y0 w注意!工程名不能为中文不然在c++中会出现无法识别的字符串
' ]; h% y5 {' T( l
0 }) t5 k) D. O$ r3 |0 ~6 g/ }5 Z
( f% n$ K7 [" [+ A
! A$ S8 B/ c+ v& cDim str(999) As String5 \% ^4 ^6 Q  z% r9 f9 L
# n5 r- Z2 u, s5 ~& w& |( I7 a7 C1 d
Public Sub GetMeiLei0() '无参数传递" y, j" J4 z6 ]" L, M* b1 O
MsgBox "梅雷qq1821117007"
$ S+ C" @, A7 i, h2 M$ q. p* {End Sub2 b" T6 ?8 h0 [5 K
% o: O6 h5 d+ x. x/ o. x: a1 Q; S

; `( \- ~0 b* c  p6 b9 x* x'带参数传递   Public Function
/ J9 F% b$ X" G. _  w. b, NPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
+ J) y1 l, A- p4 M3 Y& ^) o7 f" {/ `str(n) = str10 X- b; X4 T1 m9 T
- f: `# Q! O9 x8 |
If n = 5 Then0 B% M8 a; z) l. K* v
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
) d5 e  }! X7 FEnd If3 y" Z6 O* M( ]: [  W8 k4 y
; j$ @  y& u9 ~8 V" c
GetMeiLei2 = "数组传递0"/ g; b2 O2 V5 B

$ Y( `! e+ y6 b6 {2 A; n' {& m2 kEnd Function4 S) E( d4 q( |3 n, J5 I  D
) {$ |* J8 Y) W
1 l2 u& d. `3 W  z3 _' K, W) [
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 - w6 q* }7 j2 a( s' {! Z. H
( F+ q2 L3 o# `* s
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 7 _1 n' e. [2 c- }. @4 e
5 J% |6 \6 ~% T/ q$ O" m
; s" b' \+ ?0 M1 m  x( X3 R) J
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
8 ^: h% q; A1 E* b$ S而 VC 里调用可以这样做,如:
, G" J/ Z5 r0 XVisual C++ Code   k+ B, V  {1 M' |( `
2 t7 x# t: r# `
//新建一个 UF程序,输入以下代码
- @: V% t9 D! B/ D/*****************************************************************************3 ^4 p9 f. H, @/ l( \+ L1 u
**! ]" V+ [9 m2 U$ _
** C++调vb.cpp
( U4 P+ f+ G" p- C**
! \: z5 c. o2 b, \( q- S) X** Description:) p8 i: L0 U/ J, I- i" h4 M
**     Contains Unigraphics entry points for the application.
! L/ |6 D) I% x$ C- n**4 P: i, R. |3 z% Y8 A# I
*****************************************************************************/( C3 M4 H& ]2 @7 x) k+ w! u3 o
' C5 b+ y6 k, _8 |% N, A
/* Include files */7 D/ O# f: Q6 P3 y# }: p; j, K
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )' c) C0 x3 {& A  W- q
#   include <strstream>7 o  X% w0 T$ ^+ u
#   include <iostream>1 s2 r( p( F0 k0 p8 t$ @, O
    using std:strstream;( r- g5 M8 O' I' r1 \5 a
    using std::endl;   
5 \7 }; `! k' H( }+ Y  X, l3 E    using std::ends;
5 v8 @2 c1 T4 }, C8 i+ x    using std::cerr;! W# T! A+ q) z( I7 U
#else
. u7 s/ _0 J/ a. O5 F% j$ e, A6 @#   include <strstream.h>
' Q0 @$ j( T4 u' q/ S; n#   include <iostream.h>
( m+ G! g# t: O$ s* G3 w6 k#endif
) N& A3 F8 S- ~  Y/ {#include <uf.h>
6 w9 w9 k3 p- Z4 t#include <uf_ui.h>) d2 K3 F, J3 o5 m, B0 D
#include <uf_exit.h>
. F% l2 Y0 K! p8 \: D$ |' U#include <Windows.h>
2 I! V& q( \4 ~& i) I
0 g8 {4 H. P1 Z3 L#include <string>
# H$ n3 C0 l5 M& b  p2 A2 C#import "C:\MyVB.dll" no_namespace
2 O+ _) {# b% ~' i- Q; q4 T//using namespace MyVB;    //这里是COM组件名称; p; I8 E8 K6 L3 u5 Z3 R
7 p1 ?2 X& t* a& c0 l$ c9 @

0 q% Y5 ~6 U  SHRESULT ComInit();* }  o# F) Y5 C4 _4 ]
int mmm(char* str)6 \; o4 d+ X& ]3 g% W
{
- @  V( u- V$ ~4 ~        ComInit();
, M4 o- w1 I) E$ Y
+ |8 B  e% w5 Y" t# ?/ b* _        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象$ s* j9 l4 n' F! C2 C
        MyObj.CreateInstance("MyVB.DEMO");
1 [/ i4 b& J+ ?& t* ^
! }' V" g6 e' W& O+ b2 w; s" J6 N        //MyObj->GetMeiLei0();//无参数调vb函数7 j; i" S8 g5 F7 E
+ d* ]9 v* }& C% `2 Z
char str1[132]="0.0";: r  J/ q6 a5 E" F7 x
& F0 n0 \1 ]1 y) X1 ^
int n=5;
6 _  {/ s+ `' r; X) {# M; X- l9 \& T/ O& u/ }; n- ~" n
_bstr_t vRsinfo1;
2 A. ]3 H! B. O3 k* e; Z, I" |/ ]: N3 t1 ?' N% O& f% i
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传8 o% E3 G8 I" t+ W/ L1 {
" h# u  f' Q- g. s" k) K
strcpy(str, vRsinfo1); //字符串赋值
9 I) C9 J( q4 N3 V% d" O
# S! n3 G/ W$ w& V! y6 RvRsinfo1=MyObj->GetMeiLei2("梅雷",0);, e0 `1 ~0 V1 g6 R, s
vRsinfo1=MyObj->GetMeiLei2("qq",1);4 y' r- J5 C' J, l+ S2 Y
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
' Q% r- i/ @3 B: |/ `- OvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);8 I& d( [8 y5 P5 Q( J
vRsinfo1=MyObj->GetMeiLei2("手机",4);
6 C  `4 q" D5 T7 p( n1 RvRsinfo1=MyObj->GetMeiLei2("15757753770",5);; H- B- A* @& I. [
        return 0;
$ Q' `4 Y, q- K/ m}) W  A/ j3 O2 L- d5 k2 Q

3 D1 W( @0 p( T7 ?HRESULT ComInit()' Y0 d# Z) L6 S: @
{
6 ~! ?! B1 |9 ?" D4 V$ h        HRESULT hr = S_OK;! Z; U; @" X* n& r4 u6 F
        if FAILED(CoInitialize(NULL))
" \6 F5 C: {7 u: a- d        {
& m1 U# F$ n! b1 i" G  S                CoUninitialize();
) Y9 ~0 a) P1 _/ B+ \, M$ e: m% b                hr = E_UNEXPECTED;* o+ c: z% t( B+ K( ?8 I7 U9 Y9 T
        }
' y  ~8 n! {9 ]8 y) n. R        return hr;
; i7 s3 E' ^, W6 `+ \$ X}# H" m$ T; h% ]) a

' i8 v/ C( ]) K
5 T" I! z( F. T( X. l$ A$ ?) [#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
; g( I% ^' Y$ s
! W5 @" F& P2 P  O9 w( Q
, f" ?6 _6 y7 N: g' P
( g% T2 g6 L$ \9 E. `1 {static int report_error( char *file, int line, char *call, int irc)# v1 b: _4 T3 n2 j
{
8 Z+ V) c2 C- x0 G! K& p    if (irc)/ I" Q  \) O# }2 c* w0 x+ ^$ Y
    {
& E4 V9 {; d" |7 M, i# }, P        char err[133],; J, r% v! @5 Z! q, G4 l
             msg[133];
6 i  [- n* E3 I) @3 L3 G+ ]2 s* P: z+ Y( t
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",) k; C7 D7 ~+ k# N" @# `
            irc, line, file);# ^4 _9 s! g$ Z* b1 B
        UF_get_fail_message(irc, err);
% B" E: Z. i# Z, k+ n) k- L+ \
; m  ^" l5 |8 k, P" d/ |- d1 F        UF_print_syslog(msg, FALSE);  O! T2 y# C9 ~1 y
        UF_print_syslog(err, FALSE);7 M7 ~4 u$ l9 O4 E6 w( V( i9 Z
        UF_print_syslog("\n", FALSE);
1 Y4 [$ E- z1 ^" Y* G( f        UF_print_syslog(call, FALSE);
3 ]4 Q; i) B* d. @        UF_print_syslog(";\n", FALSE);
0 q5 `% h1 p1 N4 M
& ^  Z% u7 p8 ^9 @        if (!UF_UI_open_listing_window())) \0 f( t  W" V8 u2 v) k
        {
# ^4 q) B7 F  ?/ a" W            UF_UI_write_listing_window(msg);
1 G5 B6 u" J  [$ }            UF_UI_write_listing_window(err);  Y! O9 I" Y+ J! J+ u* G6 b  z
            UF_UI_write_listing_window("\n");
5 I5 v/ g; K3 m" M: H            UF_UI_write_listing_window(call);* b5 ^( q9 k$ N# j/ A( p5 D3 R4 Q; p
            UF_UI_write_listing_window(";\n");
- s" H1 R9 H* F7 T) d* c- d9 Y        }
) y  a: y) S) s6 f. {: O    }
6 k+ h( `) v' E, k; ]4 M4 m& y8 q4 ]' E
    return(irc);* i9 }: l. z3 T7 Y* E4 N- y3 g9 }
}
2 s* m, K: S6 d; W  y/ p5 ~( w- p; d: K, e+ n# P

8 y: e2 F) N  I* y: J$ g" X/*****************************************************************************
5 m; P1 O7 n; ?: X**  Activation Methods
6 |2 E7 I7 z$ j. _*****************************************************************************/
& |5 x- }$ z3 k8 h& y8 R2 f% Y3 `: o/*  Unigraphics Startup
9 C: d: N. |# g/ L1 a**      This entry point activates the application at Unigraphics startup */; Q- n# b4 G5 M: O
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
& m+ e# n  T$ _{
" G2 u- B, e+ O8 x. v" u* j2 Z& o    /* Initialize the API environment */
7 r4 c  j7 d) M# i" R8 |; Q! J    if( UF_CALL(UF_initialize()) )
/ k' Y8 X) z0 B/ @1 V    {
5 x" j+ ]# G% T7 A: |        /* Failed to initialize */2 a! s8 }1 b" k8 G' x
        return;
+ |+ \6 W' I& b4 V    }
/ u% N: t: Q& Q2 [1 k+ ]* F
- l5 O. P9 Q* G7 w/ J    /* TODO: Add your application code here */
& P3 s5 Q. t# v( V# W5 x  q! s; w/ B( y3 X
0 o* q7 K/ Y( x  M1 C% \

0 J2 E- Z( j8 a  X4 I3 Y+ w        char b[132]="";
! }0 n/ [3 [1 ?* x: p. U        mmm(b);0 G1 R& Q- |) B2 }% o; L
        uc1601(b, 1);   //在UG弹出显示框
0 s; L" _, n5 i# Q
( S) Y: ~2 a  [3 L) Y
3 b4 w8 _) r9 v    /* Terminate the API environment */
( O0 L1 k2 H9 I$ Z0 }  p; X$ e    UF_CALL(UF_terminate());8 G, w) A2 j% R! ~& j
}
+ Q4 r( v/ w! `. a: Y5 O! E
  u5 e8 h' N* b, x" p- z8 V/*****************************************************************************
3 |  C0 F6 E' y, X**  Utilities7 ^5 V+ x) q: t2 k1 P+ T4 S& _
*****************************************************************************/
# k, D& b- `8 {4 Z( b, c
6 T. S6 t& ?* r. R% j1 r5 k% B# R5 P/* Unload Handler
6 l0 f& H! w3 b9 W4 M8 P**     This function specifies when to unload your application from Unigraphics.
6 E! F( q; g8 F/ i) r- X/ J4 s8 [. j**     If your application registers a callback (from a MenuScript item or a
- O7 a+ d0 d9 ?5 u; [**     User Defined Object for example), this function MUST return
+ I, @; O5 [$ u**     "UF_UNLOAD_UG_TERMINATE". */0 p( t9 ?, e& f; A1 d8 c
extern int ufusr_ask_unload( void )
) B, J; Q7 L% h8 d( o{
8 o$ |; `  s; Z. [/ I) V    return (UF_UNLOAD_IMMEDIATELY);' E1 ~8 F8 {/ X/ s
}  }3 c' j5 c4 A/ @5 m3 I, V) I' \  I

6 f7 P6 z  d% W7 `
( t  U  q% B5 F( K+ V! U3 P3 W5 q/ A2 f; \
0 W: J# S( d* P# a' _& [
% y) E9 `6 [9 D. R
2 H( R" L' P; m9 Q
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了