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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件/ f. \/ m, Q$ `5 Y
2 m  n% T" `- ^5 p5 g5 r2 h
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
- X3 G$ P& p9 d6 l8 p, y# S' q3 \5 S) M9 T2 J
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册) X# V6 ^8 S. }+ C% ?
7 J6 p8 U9 j* ~0 @- K( K
=============================================================================3 n8 P7 p; {! I; P
在VC中调用VB编写的COM组件7 A, z  |7 n) C, m8 T) Q- i/ G7 h

2 T6 z9 T4 z. M1 g梅雷 - QQ1821117007
/ ^6 u: @, I, n- s. e9 D亲测 XP、win7(32/64位)可用
# w; t# m  W( c, r& {( j$ F' Q
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。; `$ x: M" K$ O4 s/ S; ]
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 ' [" M4 o1 C' z$ }1 G0 O0 f
先说说VB开发一个COM组件。
6 D- w* U& i# B, E用VB新建一个ActiveX DLL 工程, 8 T9 k  M" \6 e2 Y* e- S
然后修改工程名称为 MyVB 8 U) @/ j2 J2 ~1 h0 ^$ v3 `
再修改默认的类名为 DEMO : S7 a0 V0 f. ^/ v
然后再向类中添加一个函数作为测试用,如: Visual Basic Code: ?4 K& w4 J( e/ b

8 }+ C7 T/ }, Z) O0 h1 y' M: N4 m- b注意!工程名不能为中文不然在c++中会出现无法识别的字符串
4 T3 ~5 A9 A" a- b9 y& v0 F+ w7 T- Y6 ]
2 q7 V; s! C7 I6 [/ x. V- G1 g5 L
. L- b5 N7 W' ~
Dim str(999) As String% D* \6 a" c. y  \; k, d. @; E

* E2 A1 ?9 y# z: C% g3 q8 RPublic Sub GetMeiLei0() '无参数传递
! N$ b, x! V6 q4 N0 s: X: P2 W9 T; tMsgBox "梅雷qq1821117007"- s$ B5 S1 e& w" C
End Sub
5 v  Z( B5 O; j7 s% m
5 v9 t5 u" Y$ S1 Y  H! @- Y8 n; L  v1 L# n# J- ^
'带参数传递   Public Function! ^: M7 `% u. a. s6 G* u8 \
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String3 x' w  z2 }  q4 {
str(n) = str12 U5 ]* O) |% V
. p- a9 T+ ~( q; z# d& x
If n = 5 Then
) _7 Q6 ^- g9 y+ ^1 O0 mMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
) X3 |2 n/ I3 D) z/ mEnd If
# ]9 r4 R- S, a/ y
2 {0 @% J% t' aGetMeiLei2 = "数组传递0": i" K9 q' Y7 T: c7 i$ U! L" H

0 z5 h: P$ ]2 P, vEnd Function
' \) }& _2 u% Y9 \7 A
: f) h  `1 F/ a& J% \2 |9 @$ {
, v0 g2 l; E* t1 V然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ) }# r1 o6 L$ E9 Q/ N
6 W+ o% v+ S5 V/ d
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
$ r! v$ U* k, u0 u; u, a. i+ c5 t
( j: W% d- [5 N, W3 T. b
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, % X4 C8 K: E+ A- H: P' q
而 VC 里调用可以这样做,如: ' |" e. y0 t! F; u0 u
Visual C++ Code ; I' b5 j9 m4 k% m+ d0 e

2 u3 f' O% p6 R$ y, ]  C3 m//新建一个 UF程序,输入以下代码
0 K7 G0 s4 W7 u/ H, Z2 \9 u/ E/*****************************************************************************: F2 v- A' k3 o* _( a& t
**
4 l; n, ]5 G0 \8 I2 H  P  y: X** C++调vb.cpp
* i6 |/ H. f2 X% Z2 N/ A' R) K**' Q0 Y' o5 I. ^) l9 t: K
** Description:
2 ]; `( N" J6 x2 D( c. d**     Contains Unigraphics entry points for the application.
, R  E) P+ j' t7 |$ i8 J$ \$ O**
7 G2 L1 z0 Y- ?7 w; `*****************************************************************************/
) R/ i1 w/ }6 U# D8 u4 e- [. ?8 p. k6 l; D! F3 k2 r1 `
/* Include files */
9 ^! ~: f, R" |! Q' l, p7 Y2 G#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
* {# B5 Y7 _$ r) x% f, s#   include <strstream>
6 ]: G0 \4 |3 B( j. J#   include <iostream>% S" q/ l1 [: J4 ^
    using std:strstream;
) K6 k  `2 z" d, S    using std::endl;    , l- P  n7 f3 I
    using std::ends;: `4 ~7 Q; u# }$ }! K; h
    using std::cerr;
, `4 M- i. X1 Y# C0 W#else6 r. m0 v. u- Y, ^# J, Y
#   include <strstream.h>2 h: ^2 M- n% X7 P( i) `: r
#   include <iostream.h>: Y6 t# O! Y3 c/ |- m
#endif
/ B4 U- r- A- y( o7 w# }#include <uf.h>8 V; O/ I* {% b; ^' O' a7 @
#include <uf_ui.h>& _! E9 p9 p  L! e4 w8 g
#include <uf_exit.h>' T; z6 |, N0 ~% @) P  ~
#include <Windows.h>+ A9 a+ B) `4 m
: R( @, o% N& t* X& ~
#include <string>
; o4 T) U& |& J3 U7 I#import "C:\MyVB.dll" no_namespace- c% M' W1 [. ^1 ^4 U
//using namespace MyVB;    //这里是COM组件名称3 h( }4 G6 U- M" U& k& a
; q8 v  k0 O9 l4 {
" J. A+ z3 `% o5 O2 o* @! F
HRESULT ComInit();
* y- s5 p4 i6 T$ f( F! Iint mmm(char* str)! y" p4 d* V% q/ i$ O( T# ~
{9 m) v) w' j; c- ^0 \: c
        ComInit();
# {$ ?  R0 N% S  j6 I6 n$ J
6 C0 Z. e) t, U) F  n+ q* q/ _& }5 j        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象1 \: @% m8 t* c* `( v9 @
        MyObj.CreateInstance("MyVB.DEMO");1 X( D0 }! o9 s1 I+ [2 J/ W
! H) B8 }  Z/ M# G3 r
        //MyObj->GetMeiLei0();//无参数调vb函数6 g- v) E5 H4 E' I8 C

7 p" `* q0 [7 n# u4 L# v8 Kchar str1[132]="0.0";( o3 i/ T  v, [+ R( s
6 Z2 u: f2 W2 U5 d
int n=5; ) m- u' H: u# J, m

! P* t/ P1 e+ C6 o* M8 K$ J_bstr_t vRsinfo1;
* F: r: Y) z0 Q& z
% x1 _' i4 b3 n  z+ U. U) rvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传( ^* _, ^4 ~' [; h7 C" W! w. a
7 ^1 ]" I+ S% w+ K5 r4 [
strcpy(str, vRsinfo1); //字符串赋值, Y) g; k! h5 D0 K# ?* M" |

: |& K+ B7 A  q6 Y1 R+ Y) lvRsinfo1=MyObj->GetMeiLei2("梅雷",0);9 A% U9 q' i4 I; O
vRsinfo1=MyObj->GetMeiLei2("qq",1);
9 s% w: _9 U+ ]3 c8 T. C' @vRsinfo1=MyObj->GetMeiLei2("1821117007",2);/ n3 x7 z5 o7 e
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
  W! J( G/ Z9 g+ p0 FvRsinfo1=MyObj->GetMeiLei2("手机",4);; P! Y3 h* s7 B& [% h! w7 R
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);+ z6 Y  C6 c( ]9 n
        return 0;
8 H1 \3 x2 c4 k& \7 u. _( o: [}  V: |. C- P  l% P5 g5 [7 f

# B8 l2 l& ]# t* pHRESULT ComInit()4 ~: M6 K9 c  L! I7 D" w
{
0 ?% Z5 s2 |$ I+ W6 \        HRESULT hr = S_OK;
6 o+ P% O  H! @0 }8 x        if FAILED(CoInitialize(NULL))
5 }. x8 S& w* T3 x0 G* D        {
6 S0 W; k; H% c  B- q7 f                CoUninitialize();
) N1 o, Y6 \# |4 r                hr = E_UNEXPECTED;$ D$ h0 H& F  `$ i1 {
        }# M7 X5 h% l& z2 c9 S& ^: l  V
        return hr;! A4 a8 M* N0 {
}2 a% D2 j9 }/ o7 ~4 w2 P

3 E- \! L. t2 Z1 B0 l; S
3 ]/ P2 }! Z6 B% v& J; H  I) |/ V#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))' p# X  t  P- }+ {: E0 ^( R
' x. C$ V9 i/ t. u
6 m: G% M6 t3 n- X5 C

9 l  F( r) ?) A' o7 Q; _static int report_error( char *file, int line, char *call, int irc)
5 \2 g6 x) V6 f8 {: D{( O( v" G5 ~; _3 X9 P' K% n
    if (irc)
2 l) E$ i- {: o8 f) E1 T! O    {! M5 _* q) E/ R& m5 j
        char err[133],
- z% u  e  d1 [2 ^" A3 L/ Z             msg[133];6 R: O4 \; }1 C$ t+ f
" o7 |/ T! ?' U9 H
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",2 T6 z1 z) G+ P, G6 ~6 L0 B/ W& ?
            irc, line, file);
4 }$ W" W( s7 U! C0 L. m        UF_get_fail_message(irc, err);
, S; L7 ~% ]( v/ F! a4 |
6 ]: g& f% F* J/ o* f8 W        UF_print_syslog(msg, FALSE);
* q. v& B" ^! y        UF_print_syslog(err, FALSE);
0 t8 y7 I( o& t4 v* q& G. g        UF_print_syslog("\n", FALSE);
, D: H/ Z5 B& F& s' U. E* _        UF_print_syslog(call, FALSE);
- K6 I8 x- S* Y& p$ y$ d- ^3 K# u3 h% v        UF_print_syslog(";\n", FALSE);: C, F/ U6 f  J9 S% s- B* i
. J, p3 H8 s* M
        if (!UF_UI_open_listing_window())
5 c6 D4 W4 E* ?7 m9 [. A        {$ }2 a9 ?( I; i- T( s) _
            UF_UI_write_listing_window(msg);8 W" t2 f% i" C  ^; ^
            UF_UI_write_listing_window(err);
5 \( w$ K8 z4 ?( b            UF_UI_write_listing_window("\n");6 K9 [2 o- G! S' X
            UF_UI_write_listing_window(call);# [+ c5 L$ w9 Z! M$ T+ z
            UF_UI_write_listing_window(";\n");
8 v0 I$ U! v: R3 M% z        }. h7 V9 q+ b2 q! _. i( ~) N1 u! c; _
    }
9 I, G6 h2 o- ~8 M  l: k9 n1 ~# o" J
    return(irc);
+ o# `' j0 s' P* }, m}4 h; w) {& G9 c$ {" H6 `# c
+ L- C& X: H# g

! l* p6 x. G' r# X/*****************************************************************************" l/ Z( X) z3 e, x' P8 E$ r$ F3 Q
**  Activation Methods# A/ C/ O" _  G' o- @3 |# v# e& A
*****************************************************************************/
. J5 O1 t  ^2 d+ \$ c/*  Unigraphics Startup
! n: F' q5 }" M% @**      This entry point activates the application at Unigraphics startup */7 o5 [. o/ O" c9 X  Z9 }, y" g8 a" u
extern DllExport void ufsta( char *param, int *returnCode, int rlen ), \0 h" p6 W. W3 @! L
{+ Q/ G5 }) T* q) A
    /* Initialize the API environment */( e- T4 T) j9 ~0 Z" w! P) `
    if( UF_CALL(UF_initialize()) ) ( {' d* p* K" E8 K
    {3 O: T3 O+ q  Q9 I& K$ v! X! N! U$ b
        /* Failed to initialize */
- x1 m0 T. v; I5 ~5 W! I" n/ o        return;
4 u; \& @# T) V; M    }* s9 b; F8 p. n" Y
( l2 u( c7 r9 W8 l
    /* TODO: Add your application code here */" P- z# O. e1 D

9 F1 |) g3 z! y1 N  Q6 K; C. n- X$ R# x% H  _
# Y4 J* Q5 {' t# _) X* W( L
        char b[132]="";% F6 j) V+ ~- f. r+ M+ N/ _; w
        mmm(b);
: H/ K' y2 S" o; z; B+ _        uc1601(b, 1);   //在UG弹出显示框
: D7 X. }6 c* Y4 I7 t$ c
# R" b4 J$ o; h3 \# k
$ W, }( M# ?# `+ k    /* Terminate the API environment */
3 o; \, i  t8 R. y4 @7 V  x$ V    UF_CALL(UF_terminate());( E1 ]3 g2 ]0 L8 m
}/ s2 H7 G' _% B! a$ L, X7 c2 ]

0 q0 S1 q; B( L  Q/*****************************************************************************
4 Y3 O' |& a  p8 u$ Z5 d! k+ R**  Utilities
) D! [) P9 @) u( w) a- H*****************************************************************************/
1 M. b/ T) G6 t8 S) i7 ?4 |4 w# Y
6 B, f8 X! f2 t4 X# d6 e' f/* Unload Handler- J: L5 j. p8 r7 A% L( i* G2 B
**     This function specifies when to unload your application from Unigraphics.
9 i* D, [' w3 Z) B" M**     If your application registers a callback (from a MenuScript item or a
9 S. J) F# ^# Y/ w**     User Defined Object for example), this function MUST return
& w  H( ^  F' C7 E% T& j9 @**     "UF_UNLOAD_UG_TERMINATE". */! D. D0 k7 {. M) {4 K
extern int ufusr_ask_unload( void )1 \/ K0 Z9 T) m/ s
{2 v8 g# A) Q% w  p1 O: L6 z( r+ v
    return (UF_UNLOAD_IMMEDIATELY);
% k: R$ g! v/ {, \9 w0 K3 M- T& m}" u# @; o& u' j- w. \/ H  b

" p5 F# Y# l3 l
& g- [4 b4 u: e+ H! j: Z4 y
# ?# _, e4 X& ]2 e
4 m, p5 ^0 S0 a* t* A! w/ q4 E. ]/ ^5 G5 {; R
0 l1 q9 v  R* R( d, O
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了