PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
$ g0 j% v# p6 N9 U$ w/ |
1 g1 ^/ L  M( ~' O- O. ^★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用* e0 [7 E7 f/ D) c& C3 J4 I- j- }
) P, o4 ^! R8 t+ E+ P1 o
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册) ]& T, }" R3 i" d9 l1 O) U
1 P9 r, W# p1 ~  B, G
=============================================================================3 L+ U8 ^. s! f
在VC中调用VB编写的COM组件
8 w* r' v$ l7 c# \# `* j* B% u2 C* U) y2 |* V) `
梅雷 - QQ1821117007 3 N8 }; ~  t) }* a  q! _6 M; M' n
亲测 XP、win7(32/64位)可用
9 `* |, G. N' d1 _
8 i7 M, i: X+ t- p) j. j: mVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。6 Y6 R! X8 ]# N% R0 P" d" {9 i
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
% j6 F/ @. G) F' J( l1 n) q+ b先说说VB开发一个COM组件。
* B9 b" d8 o6 O% ~' [4 e用VB新建一个ActiveX DLL 工程,
* F$ {! b/ Q5 D然后修改工程名称为 MyVB 1 H  P5 w/ J. I4 v# |
再修改默认的类名为 DEMO
, e/ r& d9 u* Q- p7 R# J& d然后再向类中添加一个函数作为测试用,如: Visual Basic Code
. C( }; q$ o* p1 V  L( A
4 r: n8 I0 l' t9 I0 E  Z( ?' d注意!工程名不能为中文不然在c++中会出现无法识别的字符串$ s5 r" |( h. r7 k3 W

6 f) n# N, i0 a- h& D6 \
  v7 t4 X: U, O$ T' X  X$ Z4 B
/ p' n7 Z( ~: a- C- X' A& \Dim str(999) As String
/ p$ t" ]% ^" J) e; A, D% F& M! p$ o0 z
Public Sub GetMeiLei0() '无参数传递
/ y9 |, v+ x9 [; v3 h* f6 d- fMsgBox "梅雷qq1821117007"; D* c2 B4 M, L* V" z* w2 O
End Sub3 _! j1 L2 O( n
2 `8 m! J8 g. Q* _
$ d5 ?  o3 Z/ C; O, O3 w
'带参数传递   Public Function/ G4 n' v2 p- `' h8 x
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String# ~0 @1 P6 p# d; l
str(n) = str1& _( e) m. U7 A! T( S
. T" Z0 D7 T( z, S$ C' g
If n = 5 Then
6 o( ^* C4 F. S: d# a: P' H7 i1 HMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)! B- ?) X/ k) o% b& l
End If* p2 B- @% c) W3 M0 S% N! O5 Y. b
% y- K5 v+ p5 w' D7 W: B) @
GetMeiLei2 = "数组传递0"2 W8 n5 Y% o7 k9 Y+ d+ g

5 ~8 v* L# F' \8 @& R& pEnd Function$ o0 S3 {! O# e4 V0 U% t

/ @7 ^. A: n' c% f. t* @5 V9 P  s2 c+ M4 e) A
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
* U+ y8 I) A' L) |
# H+ B  }0 P7 w: o6 I- s6 v注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 : k5 n5 S" p% u# Y) F+ a9 u! t
5 c) X5 _. L7 d% x  _( Y
, G. e- a3 A% \7 y3 @. ^+ U
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, $ w7 g  }  w. O. z! |! a6 A, g
而 VC 里调用可以这样做,如:
' B. y# Z8 g) s2 u. c7 JVisual C++ Code " ?/ E7 k' Q- m2 o. _
& C7 [$ V# \1 E& S
//新建一个 UF程序,输入以下代码  T+ Z7 z9 }3 n1 O2 }
/*****************************************************************************& J3 H, d7 O3 ?
**
. f. y+ r+ v( J; h# }** C++调vb.cpp+ w. n( I+ Y2 ]  `7 z
**/ K6 b* G, \2 a) `  {" O
** Description:; l+ Q* j( O* ~3 z
**     Contains Unigraphics entry points for the application.
3 y. u5 F' i) L**# m8 R9 P# I5 @
*****************************************************************************/6 v+ t6 m! j% M2 ~7 y; }
" y' m1 k; G6 V
/* Include files */
0 ^; p& C2 l" J# M#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
# [9 c( |5 T5 y#   include <strstream>
' s8 R4 _5 @8 J#   include <iostream>. S0 _5 Z8 L/ ?0 R; w0 P! O
    using std:strstream;2 k  t% j1 \% w( z" f
    using std::endl;    / e$ W4 A! o3 w0 R: l
    using std::ends;2 q) a) E1 @' Q$ o6 `: J: P
    using std::cerr;  U" W0 [0 r4 s. L7 E. I) C
#else9 u0 c7 E8 S7 |6 R+ g$ W# [* L4 x
#   include <strstream.h>9 `0 E: n: V, U% `( w
#   include <iostream.h>
3 a1 C& @2 [! i2 x; K6 z2 W#endif, C  f( a, y* j% ?$ E8 V. F9 p
#include <uf.h>
, l0 e: o6 i% `3 a#include <uf_ui.h>- h. J/ v) K& {0 ?. L0 q9 _5 H
#include <uf_exit.h>
. {6 D' t. b) s- j* J# q( Z5 y" t+ l#include <Windows.h>* v0 D4 s& S4 k# C
; F8 w+ v! Y# L0 t
#include <string>5 ?* q% r$ a3 D1 r& w
#import "C:\MyVB.dll" no_namespace
7 M" b( e& K6 K* [7 F' H//using namespace MyVB;    //这里是COM组件名称
% X% C. s3 W! G- j7 y9 ]+ R: l; ^( s0 S; ^, X# M6 W

5 J5 }. Y5 k1 \0 t. l, p. OHRESULT ComInit();
- W" W- {& x% E# cint mmm(char* str)8 _% f9 {. z+ `1 H  n
{& Q8 D2 P0 h! o4 [4 I
        ComInit();' \# o/ [2 [4 n7 M  V3 `
, n8 |4 }( S. ~, T
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
/ f$ i4 D4 {* ~& E6 M        MyObj.CreateInstance("MyVB.DEMO");! K! t/ I& z6 }0 q- |) l+ _7 U
* D) m! Q3 \# v1 N: X) v, `
        //MyObj->GetMeiLei0();//无参数调vb函数- J' @8 p% [" V

7 }0 {7 D* u8 N; dchar str1[132]="0.0";
3 b, c# p6 f7 H( M% j; d, |% t+ y
- k& \, }% c2 i: {int n=5; , y# S3 p6 K% P$ q  p4 X

$ f, d# `! a! J1 z_bstr_t vRsinfo1;
1 W* v0 \- ]8 p8 ^& ?. p8 n* e- P/ v$ n& @2 P( D8 S
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
8 E5 K1 d# B9 a8 j% y6 p- w2 q% `* ?: W- Z
strcpy(str, vRsinfo1); //字符串赋值
1 c/ H* q) H: z! i6 o: H8 Y8 P) }. J2 u2 W9 @
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);; T, x! y& i5 {. g* ]1 N
vRsinfo1=MyObj->GetMeiLei2("qq",1);0 u- s( P/ L1 y5 c  n. [
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);* r8 U& Q7 W& @# U1 q
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);2 d7 y* N& j' ?' H/ N) e
vRsinfo1=MyObj->GetMeiLei2("手机",4);
$ W- a1 j# _' i. G6 ^9 FvRsinfo1=MyObj->GetMeiLei2("15757753770",5);
; ^# [. J; `' ~& G8 B        return 0;
5 s/ _! a, T$ R. o# Q- A) N0 }}6 \5 k  h/ [: S& O$ t7 a
) g3 L7 J  X$ c2 J  `
HRESULT ComInit()
7 p4 V" W) J0 r# p" v2 Y{& P' |. W" D5 Y6 a( |( U
        HRESULT hr = S_OK;
7 u" }: d" d4 Q2 D- |. i. y        if FAILED(CoInitialize(NULL))
) f4 G/ X) `: \! R3 W# g: B        {, }" r- F( J3 n' i# a7 j7 i
                CoUninitialize();
. O- p& M6 E9 x- {9 Y, S, y, T! ]2 B                hr = E_UNEXPECTED;; S2 p3 f; f. ~$ _0 d  ]
        }
5 y; W# ^$ @  h, x        return hr;
! j: t3 A' |0 m5 @/ t}; B$ s2 C5 n9 E$ l

: g6 H+ H3 n1 H0 d# l
0 j1 f5 \" ~0 j' w4 h#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
* C( A. f2 E! v% u: ]/ G3 r" c& d. x5 ?# u, O- Y) I  d

& i' i% W, l! E& [! p' ^# n' U& w, y9 G. ^4 _5 R
static int report_error( char *file, int line, char *call, int irc)' E: o6 l# Q$ v' g
{+ j/ R" K4 b7 X8 B( Y
    if (irc), j. W, h% S- s! d% l, R, J
    {
0 X" p7 M( n- G2 p7 q" d2 u- ?9 M        char err[133],
8 s. A5 ]) Y6 G! q: m! ~+ C3 K2 M2 C             msg[133];4 b& {. n& M) U
. Q! u! j7 k1 y7 n: }6 y+ B( A
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",5 Z4 q) ]1 K& Q) \  _
            irc, line, file);
+ \% M1 A( m1 \2 ?% m! F0 a        UF_get_fail_message(irc, err);
: O% I$ y7 i) I$ t& {5 q* G; I  Z* @
3 U; d' F) E# T0 r4 T# C9 @        UF_print_syslog(msg, FALSE);) {* y& Y5 T% H
        UF_print_syslog(err, FALSE);4 t# X8 c% _# K
        UF_print_syslog("\n", FALSE);
1 Z  N' c5 {* g1 m, W) R$ U- R        UF_print_syslog(call, FALSE);
, W8 }* z8 R5 ]8 v        UF_print_syslog(";\n", FALSE);
* n- b- R' S7 U. \
8 R, y8 Q9 ]& V/ @! d        if (!UF_UI_open_listing_window())
% S2 p9 R; O1 d: Y. y5 s, G" B  C        {8 r  I/ [5 a1 c/ ?( n& W
            UF_UI_write_listing_window(msg);
8 @4 ^3 C' T% R/ C            UF_UI_write_listing_window(err);
- Q  a  M/ A( g! b* a% g; H! A) O' w            UF_UI_write_listing_window("\n");7 w  J% A9 I' B9 a5 o
            UF_UI_write_listing_window(call);" u1 z7 t+ @5 `; W* ~, [. L
            UF_UI_write_listing_window(";\n");! J* o4 C0 ?: {2 j7 d4 }; S6 o
        }9 ^' `- \6 }' j' D7 I5 O9 C
    }
$ p7 ?2 V) z  k7 x9 x$ J  \
* _& Q' H" j' h% Y! P$ A    return(irc);6 Y( X; x& o7 o+ o! L7 B* i3 v- K, u
}/ \, Q. F* ?! z$ b! {9 ], F: v

+ e/ C+ D$ F: M1 r) h% I! G. k! d* m: y' {$ |- Q, q
/*****************************************************************************/ h5 Y, [( S( @0 l9 C" Q
**  Activation Methods$ c, A' L/ g$ n6 C7 H1 A
*****************************************************************************/
; C3 @! D8 P' ?1 l/*  Unigraphics Startup- ]% s/ {0 q# U+ R3 l, q' }& p, S& x
**      This entry point activates the application at Unigraphics startup */% d% P4 ]4 I' @" V3 o# E
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
, G8 ~+ R2 ~* x; C& e) m{1 ?, c" x" ^' v3 ~2 z) |2 R
    /* Initialize the API environment */0 Z& q* j- ^  ?, {! X2 X8 \" _8 a! G
    if( UF_CALL(UF_initialize()) )
* j( x: D6 F9 _4 P0 o) u$ {6 n    {# `1 I% }! u% V; c( E( E* G$ q  h
        /* Failed to initialize */
4 ]' V6 i. Q! Z* n9 c        return;
2 k, L2 C( K4 x    }
( \! m  N4 Y- [# w; j8 ?" R4 Z& h. u4 X( Q) q" P9 e
    /* TODO: Add your application code here */
4 o1 ]' d: I1 i2 U, O$ N/ Q
4 w% p+ N) m( I: c) R* A3 o. f: F9 S/ W& ^( Z: b2 G% T
. }) j0 w+ l* ?$ y8 \
        char b[132]="";/ ]+ {# |# U0 Z, k* @3 U
        mmm(b);/ [% H+ g8 G* J+ b
        uc1601(b, 1);   //在UG弹出显示框
9 p9 j) G3 n! K% T: c4 r) d6 D) f- I
- c% }4 @! P9 k5 V8 X7 H
    /* Terminate the API environment */4 s" E( O+ |7 S& X
    UF_CALL(UF_terminate());6 _/ ^" N% V  k/ ~) ?8 A
}
4 p9 ]; M" g/ R6 X- N/ O5 B5 o( I$ [4 |6 C+ L
/*****************************************************************************9 ]9 H; ~! }" r/ h1 R
**  Utilities& c4 {7 g9 g+ h. |* ^" C7 y! t
*****************************************************************************/- Z, |5 v2 @9 B. O% s( ~1 ]4 y
  }* M/ a/ }9 W9 W; K0 N
/* Unload Handler$ ]/ t; ~: k- }; R: z9 A
**     This function specifies when to unload your application from Unigraphics.
9 f  W+ T6 |$ M8 I, N- g3 R0 |0 F**     If your application registers a callback (from a MenuScript item or a+ J/ q) q& H9 ?( L! @6 |
**     User Defined Object for example), this function MUST return# B" u# Z. ?) Z* Z, A
**     "UF_UNLOAD_UG_TERMINATE". */5 j5 p' {$ z8 K* o! P8 f" Z& x5 b% z
extern int ufusr_ask_unload( void )6 M' v; l! S0 Z, G, t" R
{
) c9 I' a) {* X* J0 a    return (UF_UNLOAD_IMMEDIATELY);
/ u0 G8 W4 N+ m) J8 D6 w}
% {3 l9 i& T8 w
) g9 Y; j" {' E( _+ Z# w
7 G# [2 V! \# ~2 g$ ]3 C7 Y/ o9 p" A/ k

% z8 u: F5 O0 c# x; o1 O2 `, A
6 b3 h4 f/ c. ~. a
* X+ V, o/ X! n' S1 J- M3 x$ W
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了