PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
$ _: o( G& U: ?' I
1 l0 b* `- U3 t5 K$ c2 Z★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用" [7 W# G( q) P1 g( K- x- H

! b9 r5 I: }* h: j' [) _6 Svb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册% ?% b: W4 a3 H' o
7 Q6 t4 v! K, Y, ^% `+ M. N
=============================================================================
0 c; H' n0 f! U9 s; I8 t0 W在VC中调用VB编写的COM组件
/ a! ~( c, M7 i1 C  S) V1 {
: n2 m0 M& l4 {# U* u, X! c! f$ K梅雷 - QQ1821117007 " r' u- ~6 W5 H' O
亲测 XP、win7(32/64位)可用
3 V9 Z: F/ `% G  u
% I) p- Z) y. |7 v) N7 r8 p& B. @4 YVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。2 t! F* X. v5 M) B) X
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
- {& B0 O% c! u7 g0 s- v) k先说说VB开发一个COM组件。
3 w$ c& [& a9 U2 v2 {# a  i用VB新建一个ActiveX DLL 工程,
) I! ^9 C% r, ~% p" J然后修改工程名称为 MyVB 2 j7 Y7 z7 o9 Z0 ?+ b5 |
再修改默认的类名为 DEMO $ ~, I. J5 x. c, r
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
: _0 ?' o4 O5 }3 l
8 t- c- B5 ]6 `$ \9 y. E3 z注意!工程名不能为中文不然在c++中会出现无法识别的字符串
6 U0 ^$ l" A& u! }! G' j* C/ }  i: M4 o3 z, r
+ j, C( Q2 [8 T- o& b, L

! N: M9 a# E  c  R* e9 }Dim str(999) As String' @2 _" i4 K( i0 `& x

* p, C" g5 W3 t6 ?0 oPublic Sub GetMeiLei0() '无参数传递& V6 ~/ e+ ?5 [0 K9 b
MsgBox "梅雷qq1821117007"" V$ K1 }' z- h% b# V. u3 ]/ h1 N
End Sub
% h) @3 \5 b. X$ B) X! Q0 Z. J9 t9 f# v7 B" V* j6 T- O! R" Q& }

# A" d( M# Z! e& E'带参数传递   Public Function
; s; H2 j' Q3 j4 V, T7 [Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
4 `& j5 ]8 q3 f/ R8 ?$ ~* mstr(n) = str1
$ E% M  z7 N* ]  U6 b0 w& B: z3 \# B" C# W. i+ o1 Y: E
If n = 5 Then
1 ]* B6 Z  ?$ G4 b2 }MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5); O/ S# L8 |* M' ?5 w6 D! M; o
End If' K4 _7 _: ?/ ~$ d6 U- ~! m* N

, _/ {6 ^0 O7 s4 L% q0 yGetMeiLei2 = "数组传递0"9 k/ P! _( h* u

# {3 `" s# l( dEnd Function
' K2 I; A; W" W7 V" |7 y, H/ s( |! p4 {% @3 V: n; q" o

9 y) L% r7 h( _# z! y然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
8 y( j4 ~4 Z8 V6 Q0 I* X; Y
+ _2 X" m# J. W4 d1 ~) p" D; e+ t注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 : |7 O* ]& I( v4 z7 n& ~( Q- v

, J, x% x$ o  F" C8 `0 |& b" A& K  \! {4 s: }" J
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, ) t5 t' R) k# i  x5 q: Q
而 VC 里调用可以这样做,如: 0 f% ?/ o% r0 K/ T3 n3 i2 Y1 D9 @
Visual C++ Code
! r/ r+ F8 ~8 [( D6 z) y" R5 E' O
//新建一个 UF程序,输入以下代码
' R1 M/ g' B: L  n( V7 N# N/*****************************************************************************- E, l& V' H# x! `2 w. {
**
* {$ H  k% n$ a; o. I$ x, ^: W9 H** C++调vb.cpp
/ g6 I* |( y' l/ l+ X**
3 u% Z; x# z$ |2 A7 r** Description:5 Y! y- S' ^/ E! F" k
**     Contains Unigraphics entry points for the application., v. w" @" ^; M7 i/ a  a2 v" c+ u
**; F$ C7 u( T, S% `* x
*****************************************************************************/
3 p& S) A4 g. C5 E% A: V1 F
/ z) b3 J/ S$ @3 c/ s8 W. a, k/* Include files */
# A6 B  X4 ~3 o1 H0 j) |4 b#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )  \9 K! Q" U- J+ l: O7 ]
#   include <strstream>6 S- [! C7 ^+ j$ h# y/ s, n2 u& d
#   include <iostream>
, [5 E/ ^# Y: c$ h7 f7 s    using std:strstream;
4 t& _8 C8 ?& \, ?9 W    using std::endl;   
4 u0 c2 V( x- n4 ~/ M: F; ~    using std::ends;
0 C, e$ t% ?8 [" u2 ?3 C    using std::cerr;
& u2 G7 O, C/ l5 f; K6 z#else: p: @+ b# Q' b3 P, X' N9 S
#   include <strstream.h># X6 N# O# R% ]' V6 N. U( T
#   include <iostream.h>2 M' H$ g( H6 ~
#endif
/ n: g4 S% E7 Z; ]$ V" `#include <uf.h>6 W, J9 x% o+ |0 [5 V
#include <uf_ui.h>
. p5 Q0 ~6 Y* C5 f#include <uf_exit.h>
+ a& t. t1 n8 o! _#include <Windows.h>3 x! s- U, d6 t% R. S, d. ^7 x

: d, f0 h( A0 \/ I+ {; \#include <string>. {3 l4 H+ j# G5 N& j. i! G
#import "C:\MyVB.dll" no_namespace% B3 v+ G- _8 I2 E" D. S- m6 l! X
//using namespace MyVB;    //这里是COM组件名称# g+ Y- k! H7 ^/ Y! V  K7 ]# B8 J
2 r3 A7 k+ k3 A9 P( U, x

, F6 _( A0 S' dHRESULT ComInit();. g* F' c7 P1 z; \; h
int mmm(char* str)
4 A1 z) i5 ~. r1 l; O{7 t: D6 U9 m. }+ ^
        ComInit();2 o# A4 v9 c5 _( ~4 }  k, u4 v9 x! Y4 Q
' M/ p# V" g$ T- L. [( |8 \) s3 ~
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
. p* ^' K" v" {        MyObj.CreateInstance("MyVB.DEMO");$ A0 m  ^# D  |

* m/ b" j9 m/ B3 g0 E7 w        //MyObj->GetMeiLei0();//无参数调vb函数
; T: d* D* w+ u3 g8 M2 c0 B
2 Y0 I( u( e! U+ d# V  hchar str1[132]="0.0";$ y  b3 J7 f: Q' M1 s1 D( Y5 N
( E/ m3 S) O4 t1 [9 P  ~
int n=5;
& U* j$ f3 t9 r, Q$ r1 n0 a5 y7 D5 K  w
_bstr_t vRsinfo1;
; [. d. }! |7 ^; S
9 N- f: N3 ]7 V" X! vvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传! Q: ^! S! y1 D7 o+ Q' f4 j1 x& C2 @

. e* i& m) ]. i5 z1 y% Ustrcpy(str, vRsinfo1); //字符串赋值; ^. D( m( ?( A" H

- f" B7 ]% p+ p% t' x7 FvRsinfo1=MyObj->GetMeiLei2("梅雷",0);. s9 O/ o1 u: i# r4 G
vRsinfo1=MyObj->GetMeiLei2("qq",1);
$ V8 P: o. y7 c; ?0 C7 Q2 NvRsinfo1=MyObj->GetMeiLei2("1821117007",2);+ f  E* W* b$ o: Q& N- S. e
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);" Q* ^0 O% Y- P* K% ]! ?& E' e
vRsinfo1=MyObj->GetMeiLei2("手机",4);
" z- W# I  N, A: Q& E! V2 ~vRsinfo1=MyObj->GetMeiLei2("15757753770",5);  }  c3 j+ K5 ]
        return 0;8 g' P& k+ o/ U0 s4 n: i
}
+ {: O3 B* J' n/ u4 z4 V1 h
0 G8 Z5 @: R6 K: G" c$ l; I8 WHRESULT ComInit(). y3 V8 s; j5 n+ J
{& K# R) y+ h5 t7 [: T! J# J
        HRESULT hr = S_OK;
" ]: h2 C/ _2 d# f% e- K; S        if FAILED(CoInitialize(NULL))
; X' H0 N( a/ B* s. g# [        {& `& e9 H# v* G1 b/ Q& D7 y. U
                CoUninitialize();+ e, p* F% s2 S7 ?3 {( c
                hr = E_UNEXPECTED;) [# }+ I9 e6 e8 ]; F6 W
        }8 A: G8 c9 l, D  p# S
        return hr;
* |; U# f: J* s" d; u. T}# k$ j" Q" {* O6 A/ E9 u
) `" B6 Y" V& d- [  Q  h( Z
9 ~- p4 P& u" }3 T" J
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))# ]+ U* T5 Q" ]8 b
! B* B/ {1 B5 P

1 p" @1 E0 B  d/ S, R$ |3 y6 ]) b% X2 O- S
static int report_error( char *file, int line, char *call, int irc)* o, W7 @! S, C* O5 E( Z- {
{
3 H! S  J1 W  [* ?+ T    if (irc)& B3 A# D1 S2 a" Y$ f5 W6 m5 `
    {$ o  K1 b3 m. W
        char err[133],
4 y0 q( j0 l+ _2 A2 M4 |: [/ l             msg[133];! B! {$ g/ k  D' p' I  s: ]

% }$ S% |9 P4 i' Z; G% D5 O        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
; o3 @7 {4 d& O9 w            irc, line, file);
0 Y- m3 N1 {! Q$ d        UF_get_fail_message(irc, err);
5 X' k* _' C$ T* }; ^: M
) P! f4 [: P+ n0 N3 [  c; Q) E        UF_print_syslog(msg, FALSE);
: g, T* c1 E6 m+ X5 M        UF_print_syslog(err, FALSE);7 D4 c6 d* W( b# a% D* _; M. q
        UF_print_syslog("\n", FALSE);# L: |! ]9 X# l- Z( r
        UF_print_syslog(call, FALSE);: D" s; e5 w( [6 a% D5 z1 C
        UF_print_syslog(";\n", FALSE);
  ]; l6 G2 x, ]8 @3 F4 }( O# }" a' g3 D$ l# E! f
        if (!UF_UI_open_listing_window()): }9 [* |6 m* b: T4 Y
        {+ c! d7 H, C+ z4 N5 s0 ^
            UF_UI_write_listing_window(msg);
+ r% R- Z2 \3 c6 a            UF_UI_write_listing_window(err);
3 S9 i& w8 ?1 B2 ~! Y. L/ ?9 N9 R            UF_UI_write_listing_window("\n");
( B  x3 h+ @" j8 k            UF_UI_write_listing_window(call);
$ P% g) b8 r) a  \. [$ O            UF_UI_write_listing_window(";\n");
2 k# {% M8 B9 c2 G        }
2 z8 C' j6 N5 k. `    }" H9 ~: j* L1 U4 d: E9 D

1 g  N5 ]! ~) h  X" {7 f9 h    return(irc);  a  m8 o& e* Y2 l$ |5 r$ ]
}' Q4 G, ^5 F2 Q) c( \

. h7 `% v) `- x5 J0 T; p1 L4 e0 T  A* O, K6 t/ }7 s( ^1 \6 M
/*****************************************************************************
" A* v/ C' l7 u6 G**  Activation Methods' }! k2 e0 b- _9 j- p( R" }# b
*****************************************************************************/7 l2 I$ a& t; r/ m$ P' g
/*  Unigraphics Startup
/ J# E& r0 }1 m2 d**      This entry point activates the application at Unigraphics startup */: M: B/ J  z2 g( B
extern DllExport void ufsta( char *param, int *returnCode, int rlen )1 B' E1 Y0 H, ]" g+ y
{: ]- R" ?/ \# C7 j( _, K8 [
    /* Initialize the API environment */
6 v1 F( }9 M& Y( X    if( UF_CALL(UF_initialize()) ) ' @0 w: ?/ B' ?9 x4 K
    {1 D4 W  Q% g6 n. y
        /* Failed to initialize */
) o  ]" a3 u! @2 V# D* Z* {. h        return;, v1 I; X( h- N3 }1 h6 b0 t( S; K
    }
, g6 M0 _, w$ q3 o+ }/ }
3 `: z) d% X; j/ n' J; e    /* TODO: Add your application code here */9 v. \4 V% G2 f6 |* i) \

2 ]. H0 b) o; X0 i, j
8 Q8 R8 [8 K, ?9 _; w
! Y( h5 K9 L/ r2 G  `  h* y        char b[132]="";9 G: C& [. s2 e9 ]* M% k
        mmm(b);
) x8 a  Y* O$ g        uc1601(b, 1);   //在UG弹出显示框
8 ?; a9 e2 D3 h& Z. B, L5 ~8 c; k; b' Q, Y1 k

; t- k( w% f6 q" W9 h# [    /* Terminate the API environment */5 E, O1 l; y" B, z9 X0 r
    UF_CALL(UF_terminate());; S  ~! S# s* C) Z; Q3 d
}8 T. ]* f5 w1 Y! p- Q
8 G; R- M5 A0 a& _9 {
/*****************************************************************************% e; N1 X4 s" {+ d
**  Utilities  X8 t* ^2 v; z6 q) k+ J8 L
*****************************************************************************/
9 G  M0 R' Y# Y& R$ Y  R
' {. x: e. a  Y7 W) N4 G; G/* Unload Handler" O3 J% W+ z# x0 m: Z6 j
**     This function specifies when to unload your application from Unigraphics.2 b! t7 @5 s4 E& b3 d/ r+ C; f% M
**     If your application registers a callback (from a MenuScript item or a# s# O- y2 J) B; t& n' @, P
**     User Defined Object for example), this function MUST return
6 g* I- j  j: _# s! C' q! A**     "UF_UNLOAD_UG_TERMINATE". */
$ J, a7 D) Z& zextern int ufusr_ask_unload( void )6 G- Z+ ]. @# z! u: J! M" ^; g
{# l" h) }7 |& l3 H1 K! X, n4 N
    return (UF_UNLOAD_IMMEDIATELY);
3 i0 D0 o; U% r% g0 _) w0 k  ]}
. H5 t/ i, A$ ]) m) J/ l) t. T
  K- T/ R7 \5 r: I8 x
1 W0 @5 z) s3 i" L  l& R' i% r* b& x3 X: u8 z
0 x3 L5 ^! Q# F( h/ c$ }) H
* e' q9 `8 ]( o& g* g" d  \* r

7 m# o" l+ D. x- U0 H( p, a' K
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了