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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件8 E3 l0 w# W  r! i; r3 b. G( R

/ t* {3 @6 o. v' U★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
( w5 ]6 s, w! P" U7 y2 H( E
7 a: U3 {9 p! N# uvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
- P% V# a$ S% |, E" U3 R  c2 D( x3 S5 V* p3 w" \! m
=============================================================================4 o7 e8 i# {7 z( |" g6 d+ u
在VC中调用VB编写的COM组件6 k  o( A9 ?& j: F0 u5 B
/ i) F) n1 N! j$ \8 {0 ]6 ~8 M8 W5 i2 @
梅雷 - QQ1821117007
. ^' P7 P  P# I5 W" H0 [亲测 XP、win7(32/64位)可用0 D4 a: z) L3 z" k/ J" B* v3 H
7 ?, B+ e! ~; K1 X- K! t3 ]6 x
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。. ?- ?- m- K- O3 Y6 E: X. @1 v+ z
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
+ O; w5 N  N$ T3 c9 X; l先说说VB开发一个COM组件。
- N- Q2 A6 f' g8 ?( c- r) _. }用VB新建一个ActiveX DLL 工程, + o% Q! F6 x' Q5 Q# w1 f! D
然后修改工程名称为 MyVB
# N: o4 c; @& Y1 x) H( f再修改默认的类名为 DEMO 3 j( W+ J* {7 ^0 @7 ?
然后再向类中添加一个函数作为测试用,如: Visual Basic Code8 c' c, b0 V5 x; U5 f

: n) ~; ]) t  O7 o3 m+ u注意!工程名不能为中文不然在c++中会出现无法识别的字符串! A% T, \  N9 m# c$ e. q

( Y- x1 t  _( R- F9 Z, G; J( E% Z  Z1 z  |  ]; F
2 W& k* `8 A5 O$ M
Dim str(999) As String3 p3 R; L/ x5 ^& x" d
7 o) I8 A& c1 ~) u1 W
Public Sub GetMeiLei0() '无参数传递
: A8 |, f4 h! J& t% sMsgBox "梅雷qq1821117007"9 p/ g0 u/ w, G; F1 h0 B; i  Y
End Sub* J* {2 v. z6 J! R, m# L

$ `" Q# {# ~! K! e( o
# i  F) d8 e. T'带参数传递   Public Function  M- Z+ B9 S8 |/ j* @) x6 K
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String: B' |* t6 W! I" U
str(n) = str1
/ F1 D) N( M. r% W
0 ~  L5 I" X' Y2 ?3 GIf n = 5 Then
$ `4 s" b( K+ G* _4 g: W$ ~/ oMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
% y; w' M3 M3 H% p8 NEnd If
% p. a" b  O+ f; _/ m( t+ j/ s7 M2 ]  h- w* s" l
GetMeiLei2 = "数组传递0"
7 q' u# J% F4 e+ H/ S  g/ j
5 \3 o3 m( L) U* x; n0 S& D+ ~End Function
: O3 P6 z. r! a1 M4 C/ ?% V; w3 e8 p5 z3 Y
! ^) L* y( \/ ~) Q
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
( C) @$ z' @% L; ?2 d" d: ?+ A. \( ]" C
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
, j6 n$ U. r7 {) l* H: ^5 v5 f# r0 ~( \) y

2 c/ h; H2 c5 }( @- O其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 3 ^/ }/ @, A& P
而 VC 里调用可以这样做,如:
9 K& }5 d" r; `3 c, dVisual C++ Code 2 S+ b- r$ C* l9 E

5 }7 I% i) _3 o2 E//新建一个 UF程序,输入以下代码& r. a" t  P% |/ R/ [( o$ C% i
/*****************************************************************************
) G6 Z% ]2 [7 A9 ?! H0 k**1 P4 V6 ?# S5 R8 V8 S, W2 j" m9 g
** C++调vb.cpp& q6 C2 u- }2 K  W" B0 b% c  z
**
& G7 j, c" p9 w( Y$ d7 p. j** Description:5 t! j) F  W! t) Q" f8 {# r
**     Contains Unigraphics entry points for the application.
& \* ~0 n7 d3 p* r- B- O**+ W/ G2 p" \' C* O& C. q2 v4 C
*****************************************************************************/
. k" V& h, `$ T0 P4 K- K' D& _( D, Z  K
/* Include files */
; O. e+ I0 p  z# G7 a0 q: B#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )) A- }- V% c# z: v9 p
#   include <strstream>
3 c9 h7 V! ]- e2 j#   include <iostream>$ p8 n1 Y/ Z& j5 y, e, P/ O. Z; y
    using std:strstream;
- T8 W% Z: P) F  a    using std::endl;    / L6 v) ?4 }4 x0 r4 N8 |
    using std::ends;
. e0 a$ ?& Q8 g# M( J' P# X$ p' q' B    using std::cerr;9 E  x' G+ S; m% ]* M7 Q" t+ {
#else1 z$ E4 Y. f7 ?. J9 W# E4 j- n
#   include <strstream.h>
/ B1 n. p5 y" K: r( m) C2 q#   include <iostream.h>
0 O0 i& p+ }2 P" Z- `9 z6 s#endif6 }3 J: g  l7 Y" R6 \
#include <uf.h>
% f$ Q, H7 |5 e& T- a+ ]9 t2 E: ^' V1 B#include <uf_ui.h>. j) b7 X8 X) M. U
#include <uf_exit.h>8 g' X  O8 f8 d
#include <Windows.h>) g- c5 C/ J+ V: t" n) k& d5 L9 S

2 r5 `  X* Y+ M; m* U2 N#include <string>' Q5 T4 t, s9 e6 z0 u
#import "C:\MyVB.dll" no_namespace& a% U. U  ^& B/ b9 `+ @
//using namespace MyVB;    //这里是COM组件名称
( _! }3 |2 q8 p, _. r8 u  G  J6 A7 V

$ R9 `" S' H% P7 K5 w5 UHRESULT ComInit();) S3 P0 G1 h7 z
int mmm(char* str)
& i% e8 b: v3 j{6 [' r' G7 u- m7 R
        ComInit();
: n; N7 j1 O" b! g) k; u8 t
/ r- m! U: l, ]0 y& y' h4 x        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象! w! Y0 e+ A7 X! i- B
        MyObj.CreateInstance("MyVB.DEMO");. I. L. l4 D: I, b- s$ f, _

1 G% [; s3 _0 n# |5 k% Z$ I        //MyObj->GetMeiLei0();//无参数调vb函数. D2 V4 |' P3 ]7 U" h: M' t

! R6 D# e7 X4 [+ g$ ?" Zchar str1[132]="0.0";1 I" }4 _- u4 E' T! S9 K

  t/ x$ \, `" W9 k4 w2 e. O  Qint n=5;
; r; D3 c" w! ~; `1 s
4 N& D) @5 U6 V9 \_bstr_t vRsinfo1;& A8 O7 q; V3 d) T9 P+ `
8 A2 P* K+ u5 _# q
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
; O  V- m6 c, Y3 b2 h& Q
  U; r& K" V: g) V; Z8 B/ Ostrcpy(str, vRsinfo1); //字符串赋值
- B, Q/ w8 R- }4 B( e6 S- |& f) b$ F+ J/ u. k) Z
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);- D- W6 U# v7 q% @: ]% j3 X8 |
vRsinfo1=MyObj->GetMeiLei2("qq",1);& @( {) c' |$ v/ t5 F
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);" W$ |/ [+ \# j5 j/ t0 |6 T
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);* u2 n# d8 k7 x2 V, P4 E. r1 P
vRsinfo1=MyObj->GetMeiLei2("手机",4);3 T" r5 d/ b. F4 G2 d3 U
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
$ }5 m% ^/ {6 Q& A, _        return 0;
) E2 B0 a4 F4 x7 S& a5 f1 }}6 T3 I- s* R; W
; `" o  v0 Q8 X0 S- t7 y
HRESULT ComInit()8 e* h& [) J6 _  ?
{
- y" z4 `6 Y( @/ a- d, Q: K        HRESULT hr = S_OK;
  s" @0 D( _# L: n, j        if FAILED(CoInitialize(NULL))' S' K, ?3 e2 R" s; @
        {# W# f; ?) f) s
                CoUninitialize();
/ U: P6 L! o/ c. R! |# i                hr = E_UNEXPECTED;* Z8 [# p8 d- N0 ?( Z
        }
; J$ ]0 r3 s. d% x        return hr;$ t. W9 N0 [# e% O$ x
}
0 D2 P5 _5 X( {( \$ K: j, H( s$ [7 h7 k7 n( x

% t# y! B; h- |$ l5 D1 c, L#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
- @* Y. ]. j% ^, i) i1 V0 x
" U0 a4 e& L/ \( O% ]& m. b
+ A$ D" J; N" ~9 j7 H
+ _5 ]# M# _3 s9 Wstatic int report_error( char *file, int line, char *call, int irc)6 C" y0 Z0 l% V# t$ `6 _$ j* a
{
' j! S  k7 F  V6 W/ W! C    if (irc)
$ B; k' e, q3 i8 N- P& A    {7 {" `% r" L* s, w/ m5 H0 x5 |" y3 a; U
        char err[133],
+ |& v7 T- A5 x             msg[133];2 o& _, ~- _' e( T& d
7 ^2 O. y1 U2 I' X
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
4 [& X' p% n) D8 B2 x; k            irc, line, file);
7 S, {2 u8 h8 J1 B+ z% Q" L        UF_get_fail_message(irc, err);2 D. F, }- w, v! x% ~! x* r# U2 i; R

2 v2 s) w- H1 v        UF_print_syslog(msg, FALSE);  v' ^9 C, D+ I" M1 P$ N
        UF_print_syslog(err, FALSE);5 @$ U" \6 @& [# d5 x& t
        UF_print_syslog("\n", FALSE);
" i  o5 F  ]- W, h- |: a        UF_print_syslog(call, FALSE);
8 X5 a7 B6 V2 W! [0 D6 J        UF_print_syslog(";\n", FALSE);0 K6 ~$ g  x/ p( T) t' }- c# i8 A
% c3 u& F- Q! `' s; J) a5 ?! O2 Z
        if (!UF_UI_open_listing_window())& H3 G- e5 m1 m5 D* _4 O! Q
        {
0 E. c# |' p2 b& i6 O            UF_UI_write_listing_window(msg);
6 c& {3 D8 l% {$ _' A' ~$ W            UF_UI_write_listing_window(err);
; b: r" Q" A" M/ w            UF_UI_write_listing_window("\n");" v: H. p5 ~* `/ w
            UF_UI_write_listing_window(call);
2 e& }8 Y5 c3 v            UF_UI_write_listing_window(";\n");2 N% f7 @2 _7 I3 P
        }
1 E5 j- E) m: t6 V1 y    }
, c) R& t7 d. G+ E& I
- g) D5 G  f: A    return(irc);+ k/ d8 f6 n- p) O
}; e: ?  E* D! E8 H; G

7 J# l. X, j5 v% D' s; g7 b7 c- H0 j6 B9 ~8 t' t2 s! Z
/*****************************************************************************
) i/ e. d( M/ J2 o% I**  Activation Methods
5 d( f% M2 T. \$ T1 ?1 q' k1 v) N: R) S*****************************************************************************/; }' J1 p9 ^  D* M# ^4 h! i/ v
/*  Unigraphics Startup+ q4 B$ A# f% e5 F
**      This entry point activates the application at Unigraphics startup */
' D! S/ l7 ^" [5 e; |, o8 mextern DllExport void ufsta( char *param, int *returnCode, int rlen )
7 r4 w3 O% E5 y7 \  J6 b. G  P2 k. Z{
' A" d" [5 x+ H! `5 i% f. ?    /* Initialize the API environment */- C- V6 ]( w: ^4 v- ~0 L8 W
    if( UF_CALL(UF_initialize()) )
) j' o3 s) G0 V3 Q    {
) {  O' R0 n5 C        /* Failed to initialize */. t" U8 @; O. z. q
        return;3 ?/ A+ R6 e4 q4 q/ o
    }5 j' t7 H  {! y3 p: k! T7 P$ D
' w  m% l. F# V7 j6 e1 p7 h; J2 C
    /* TODO: Add your application code here */
3 t# O" t. Q$ t5 C7 P* M) q) F8 y9 ]: h3 F0 d* J" E9 D& z

- a  B' S& e& A6 x7 \* a) O3 I! w/ X6 [) T) r& q
        char b[132]="";
  }9 W) o! c6 d! ]0 ~        mmm(b);
$ g& e' J8 B" r4 S5 f1 @        uc1601(b, 1);   //在UG弹出显示框
7 u) u5 r! d( b4 `
* G7 B' E( q: u6 [' F4 \; s, a, _* B3 F8 [
    /* Terminate the API environment */
* n8 e9 v' D6 ]* k- t& f    UF_CALL(UF_terminate());
3 U* _/ t; g+ W1 O3 `}9 |7 ?6 k1 ?. H8 ?; {2 V
9 ?  D/ e: Q% J8 q. Q6 z  t( O
/*****************************************************************************
6 m1 _# }7 }8 c' @3 q2 U**  Utilities
% m' `; t% w$ [* K/ [8 }# Y*****************************************************************************/
1 {, c+ K# m: @/ M" m* T/ E/ y* c) F' b' V; |  Z
/* Unload Handler7 F, \' N$ l* U* E
**     This function specifies when to unload your application from Unigraphics.
  C6 B; z1 D+ V. g3 l**     If your application registers a callback (from a MenuScript item or a/ P7 c9 k! k, f/ r, B
**     User Defined Object for example), this function MUST return
1 t0 S& N( r! C0 y. {**     "UF_UNLOAD_UG_TERMINATE". */
9 H7 w: k! l5 q* T0 eextern int ufusr_ask_unload( void )- L) W: @" b, i1 I+ t; e; e
{: _6 P* l/ O4 s5 T! E6 h
    return (UF_UNLOAD_IMMEDIATELY);
) X3 C; F9 {7 ?7 j- L# f}
$ ]: q) C+ {  y7 a! ?7 s7 G9 q
: P% {4 M2 e4 {- g/ E" r
. J6 j5 u5 o& w
5 R" j% T& t' q# `2 I8 `- q4 ^0 ]+ g
) b$ j0 _1 l/ @9 S. A# @' z1 O1 S% K7 S- o" h& R: u; V

% w0 s+ Z+ A% _+ R* H3 K. t  b
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了