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

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

[复制链接]

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

15757753770 发表于 2016-12-11 15:05:21 |阅读模式

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件7 J! ?' U5 |8 y" z2 W( l

0 D, N2 z' }, R# m★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
6 R( }/ y; d8 M! E! t8 f+ s
4 m! M% E8 O" P  d6 i  qvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册5 @5 @0 [7 E3 f7 @$ Y! ~

) b/ |% t8 v6 r" q- Z  V=============================================================================7 S9 `8 |, W: u
在VC中调用VB编写的COM组件
& N/ L. s( u' h" m: l
& r; X% P$ F3 b9 z8 D梅雷 - QQ1821117007 . r0 K2 Y6 Y. g# f* r* k4 k
亲测 XP、win7(32/64位)可用
/ q1 i% p- f" e6 S& Y1 c
+ R$ w' U! _0 `VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。* _7 G& Q, F0 Z3 L! ]- n, d  U
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 + ^3 J' s" W# }4 U% Z' k: t3 z
先说说VB开发一个COM组件。
; D9 a$ T: E! E8 J) B; y  z用VB新建一个ActiveX DLL 工程,
5 [6 V. C& A! i* z然后修改工程名称为 MyVB
( ^: e; }) w9 U) o再修改默认的类名为 DEMO 5 P7 d( Y$ `- j4 J3 r, D7 z$ N2 }
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
( G( O8 B' Q8 ^) t4 d) B+ W  ~; o$ A$ P! m! I
注意!工程名不能为中文不然在c++中会出现无法识别的字符串+ f/ G$ I: D  Y. ]; J$ j
" R( b6 v* H- N
. C; ^  E. w$ d. R( n" O2 q
: @% f4 n% k1 h; S, k
Dim str(999) As String4 V+ ^9 T6 d9 i8 O

1 \1 m" Z; h. P0 M  EPublic Sub GetMeiLei0() '无参数传递
* H4 o$ y2 N" ~7 t' \MsgBox "梅雷qq1821117007"
0 Y9 |, G) m& n# q+ oEnd Sub
% v; [  b9 |3 P8 e" w2 i7 Q
# |# L- k' e; `+ X8 c0 R+ O7 d5 Q- S6 P7 m; K* l* o
'带参数传递   Public Function- d6 ?& C5 h. A0 }) D% n0 [3 W
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
( n- T. i( X- [+ L* Z  Gstr(n) = str1- \8 R9 K9 P7 e& X
. @( |! Z. ]3 p# j6 z
If n = 5 Then' o, [$ l! p# k: J* c
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)9 i* ?; j6 }$ X/ r5 S
End If
) x; b% n% Y# v1 b  X5 R
+ h, d2 T% `: @GetMeiLei2 = "数组传递0"' G8 J9 d  r1 u- U4 S
% F2 F( y0 i7 q0 e5 C/ `
End Function+ e+ Q1 S& I/ L/ [  U2 r
9 ?7 e% V. T9 }0 ~8 p3 D

* a) k9 O# i* @) r# U然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
9 N* r# ~  U5 p9 p
/ `5 i- _! X9 Q4 d& B0 J, G' W9 f注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
) L, ]$ Y9 j) c( J  ]9 h, N  D) w# r* M' o

. o/ z+ ~- e/ J8 B5 v) {其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
9 m/ `+ M( L3 Z# w0 g而 VC 里调用可以这样做,如:
; ?$ r  X& J* @( m% K9 N3 i* MVisual C++ Code
+ O7 r7 e9 V- F- ]/ g* F5 t9 j7 ]2 M- K2 r6 k5 U, [- Q
//新建一个 UF程序,输入以下代码
4 B( F" |: ?2 }/ ?" P/*****************************************************************************
: w8 ~) Z2 U) \# z; I- E) ]; E. h**
  \0 `# r2 N$ h9 \** C++调vb.cpp
9 E% n# |$ G" [( X: B8 }**
+ F' m  D2 H) V0 i( z% B$ }: z** Description:  D! M2 X! g+ l" u
**     Contains Unigraphics entry points for the application.7 x; k& |7 N0 g
*** |/ c! c4 v9 i$ w' Z+ J% g
*****************************************************************************/
' N' W2 P9 F* t' \- t1 t; ^9 m0 Q+ Q
/* Include files */
4 Q/ m5 T/ f1 J0 \- ]# g#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
# N) e! ]2 [. L  Y  P" ]6 q#   include <strstream>
& @& O# k1 |1 G7 K# ?" C#   include <iostream>
) F3 l% I& ?$ b9 B    using std:strstream;
1 U* A5 ]2 B; v3 I    using std::endl;   
- M: Z5 d, N0 P* I% W    using std::ends;! b7 N# u0 X" l- o
    using std::cerr;" E1 c. Y. n* r/ E* K+ D9 L) N
#else1 Z, P% X( L' w- K2 g$ v% i
#   include <strstream.h>
  a/ O6 ~7 ?' s#   include <iostream.h>* [  Q# y: c4 j. i5 {! s  D
#endif) w, L, B# |& J" S. C2 u! u* w+ G* c
#include <uf.h>
7 c/ G  t. @; p2 }0 _#include <uf_ui.h>2 E6 k3 m& d2 P0 {! x) n" |
#include <uf_exit.h>4 v% G) r0 x/ ?: W
#include <Windows.h>
3 x) W- H6 W4 Q2 a, m+ A1 E  _6 z+ G; F# g8 x$ x0 C% I% r" c
#include <string>8 ~, ?3 ]! A6 e& g$ J
#import "C:\MyVB.dll" no_namespace% U7 s2 y& I8 d- i4 N, h
//using namespace MyVB;    //这里是COM组件名称
! b. G0 b$ h+ n
+ A" a# J0 P$ _7 s
5 e2 q% b) ]' m9 J) v' V' g3 uHRESULT ComInit();
2 m4 ?9 {& m/ I, P, _1 k4 \int mmm(char* str)
$ w. R: Y; q/ N2 e3 D: G; I{; t( X& k" J% L. {$ E1 j
        ComInit();
5 x/ g( Q/ `3 w5 L7 u; p% [) U9 q, t4 c% F
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象; q" F7 W! ^# G+ K- x+ a5 d, u2 t; l
        MyObj.CreateInstance("MyVB.DEMO");% M+ f+ r! }" j. k0 y% |
' d( ~9 P& w( |- }& f
        //MyObj->GetMeiLei0();//无参数调vb函数, I  A# d6 s: c7 I" t
) Q, y3 d4 R6 ]5 P7 Y" v
char str1[132]="0.0";5 D' C5 p% {; Z5 d; t4 L: e

$ a% T) C: [7 r, N8 C! yint n=5;
- O( t8 D! i5 r+ z& n: ~$ [: d) t# O/ M* Y" k( L. @
_bstr_t vRsinfo1;. ?+ U0 ~8 U4 s0 b% S, q  Z
3 I" k( Q" h8 R7 U* z
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传' @7 h7 d; i+ k, K" p
! v- A) s# I. s9 X' [1 S
strcpy(str, vRsinfo1); //字符串赋值
" b6 j0 u4 K7 u) a) D. X+ `* Z! E/ [2 u# r9 @7 R
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
- I9 ]9 o- j& Y7 LvRsinfo1=MyObj->GetMeiLei2("qq",1);
) Q+ o2 w' |: N; J) Y; d) R8 YvRsinfo1=MyObj->GetMeiLei2("1821117007",2);- f6 v- Y; W! Y% h8 ~
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);0 [5 k9 T8 k& l9 R
vRsinfo1=MyObj->GetMeiLei2("手机",4);
0 a  Q# ?3 H3 N" xvRsinfo1=MyObj->GetMeiLei2("15757753770",5);3 N4 A6 n, H/ n  p# _0 D8 z
        return 0;
1 {% X" |3 N0 E6 p! l}- b  S! j# j/ `  a5 Y. E$ F  I
  v8 G' V! N0 s6 M9 m1 O
HRESULT ComInit()- r% Z. K8 [" z0 h* T1 j7 I
{
# ]: u% r: H! d/ o$ Q        HRESULT hr = S_OK;" p+ d; H- r; C) A  i0 Q
        if FAILED(CoInitialize(NULL))
; s8 Z( |+ a4 X3 w- ~6 y& ?& H/ d, t+ V        {( x9 Z- `; T& C9 A3 ^' y% J: P3 t
                CoUninitialize();9 x& s9 P- J" j7 ?
                hr = E_UNEXPECTED;1 k& O% {# U3 p" Q5 ^1 N3 a  c
        }" m6 `0 I7 j3 c2 |6 t9 v# a& L
        return hr;
. B$ o' \% X. O% W# K/ ]0 |}) \7 u% F$ |) o2 u7 t
  p7 h4 G) \8 ]/ j$ D2 j: V
# ]' M" k$ f9 s, g, K3 h9 u- I
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))) J4 T2 b8 }/ T7 W

8 I: s1 u9 @8 M6 ^6 p6 q% U
7 m# n6 C/ q, V) K( X) z
8 G: s, h; [$ C( V! Q# r0 Ustatic int report_error( char *file, int line, char *call, int irc)1 T0 A& d$ U, j6 r3 r$ H+ D
{
# p, R0 n; V  S2 V2 ?' o. W0 ^    if (irc)+ y" J2 ?) O. X6 K* x  s% p/ o$ S
    {
# Z7 {" H9 A/ }        char err[133],
- D0 J" }& ?$ W4 J6 E6 k- V) f             msg[133];
7 j" p3 Z# s$ r
0 M3 X3 l6 W, A" K        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
: E+ I) g& G+ n& F            irc, line, file);
0 [4 U; `$ ?- x% r% g& W        UF_get_fail_message(irc, err);6 g5 y! _" r+ e6 f

% X/ M$ i9 y, K' U/ ~& g        UF_print_syslog(msg, FALSE);! i1 U7 w" N! G: h& I! j1 ~! m
        UF_print_syslog(err, FALSE);9 S' ?  u/ A8 [& y+ P
        UF_print_syslog("\n", FALSE);
7 t! {5 s) a2 B! |        UF_print_syslog(call, FALSE);
- ?: v5 ~# f0 h8 a. g8 f) T        UF_print_syslog(";\n", FALSE);& S, }2 o1 T( J% r( R9 j; @1 d

8 P. Q+ t" O. k2 V* r' F        if (!UF_UI_open_listing_window()); X3 g/ W5 P" h; c
        {- s0 d+ L/ _3 L' R" Z
            UF_UI_write_listing_window(msg);  @" D6 ]4 o- h( H7 t# K: m
            UF_UI_write_listing_window(err);1 B) H8 G$ y' c; b* L1 J; ]4 x
            UF_UI_write_listing_window("\n");; [$ A( _& H1 E
            UF_UI_write_listing_window(call);5 l4 ~% j2 o2 _' H; O4 Z7 G# p
            UF_UI_write_listing_window(";\n");& o! a, \3 b! s3 R& k
        }
+ s& ~- N! s+ q2 p8 @4 ]5 M" n/ m( A    }4 x5 A- L" j1 V: q

5 B7 m+ z0 }/ L' `    return(irc);! n  a- X1 t* [1 H% J* t
}8 @1 C( i: |" h6 j! @* G- ^

5 C9 m0 @: w- X7 S
, ]$ i4 |. F; C! j9 }) }/*****************************************************************************
2 h3 K* L& C& p# ~" V**  Activation Methods5 \0 \" d4 J" R3 Y! u: R% C0 L
*****************************************************************************/
4 \9 x& C$ _- o  K8 {/*  Unigraphics Startup
' v( x. S5 v# U**      This entry point activates the application at Unigraphics startup */
0 a* a& k+ [9 Rextern DllExport void ufsta( char *param, int *returnCode, int rlen )
$ d" @  U& q) ~; Q- p9 L{7 y1 X: t0 }/ j6 y, C5 y# V
    /* Initialize the API environment */% m+ [! @- r/ f3 J4 [
    if( UF_CALL(UF_initialize()) ) 5 T& x: h. @. V7 s: R. S
    {( W8 S! ]# h0 F. R% T" p# `5 f
        /* Failed to initialize */
  w0 V- |! w; L4 o  x3 V        return;
& u; b2 x7 S/ P+ C3 P# p8 y$ [& F- P    }
( u4 j( l- k! c3 X3 ?0 M" ^! f: z- h" y# r/ f
    /* TODO: Add your application code here */( c: _0 C( w$ t  L% u% a) Q, j

# ^  v7 j6 H$ C1 u$ l( L5 U* n4 i2 Y' s3 ?4 G; V. }
# n( p9 V0 B2 k+ y; I
        char b[132]="";3 t2 ~9 T- I! t/ J7 }5 b
        mmm(b);; O; X/ ^# H+ o2 W- C( t- ^3 Q0 e
        uc1601(b, 1);   //在UG弹出显示框
& [. E* }+ h8 L2 L$ z$ P( @: f
1 B3 E: {" O8 k6 g# q# o$ K
6 _+ I+ S$ a* U& g# ]' C, ], Q6 L    /* Terminate the API environment */
& V$ B0 A* i; }  K    UF_CALL(UF_terminate());% T/ ~/ O+ m* F2 m
}
1 F! m2 H9 T2 L( a6 M, \# e; _) g5 _0 ?  W8 M; a
/*****************************************************************************
1 k; O8 }$ K  V5 t2 x7 G* V**  Utilities
( k$ D, X, S8 Q7 I*****************************************************************************/
* Z: N* N/ _- W6 @% Q( y% Q4 }2 M0 s5 K! c% W$ q# h1 l
/* Unload Handler
4 s5 Q6 j' S9 y**     This function specifies when to unload your application from Unigraphics.% v" U0 G; J  c" D6 z
**     If your application registers a callback (from a MenuScript item or a
% G, y. [- w8 h# N' y+ B**     User Defined Object for example), this function MUST return7 o, F+ c/ k2 @! P& v( G0 m( e
**     "UF_UNLOAD_UG_TERMINATE". */- u. j& o! i0 E- E  [  G$ H, T
extern int ufusr_ask_unload( void )
4 t0 ^: J; Q+ R' T% I8 i- a( p{
: k/ A5 u9 K- Z    return (UF_UNLOAD_IMMEDIATELY);% p& R" F. o$ `! r$ y2 e
}
8 P* F3 u6 Q% Q( d( A2 ?3 Y; s' v! K8 Z- p7 v. X  C

3 S! `& q8 U7 F6 P! f9 ^5 j. F6 }
+ F* F- V/ ]) M) Y  w) \. ?- d  ^0 [0 i% R

$ q& Y! B  C$ d; ]# x( N8 V% A2 L. b5 o! L) C
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了