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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
% w: Q6 C9 l( Y! E" U
: C2 V* Z6 ^: M" r; }7 ]8 E★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用$ k; H2 g/ f3 T  \; @
; R/ M3 s0 j4 P" M$ c/ X; {& h
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
/ c* {8 t5 Z' C# [3 I1 x9 x. m5 E0 i! W; Z% J6 p1 p
=============================================================================& }9 u- U9 Y$ A' Y) Q, Z
在VC中调用VB编写的COM组件
. ?- R& q5 b; A8 J0 ]/ J6 O$ p9 p8 X& y8 x* s" s
梅雷 - QQ1821117007 - C. N6 ?+ [7 Y
亲测 XP、win7(32/64位)可用/ ?: B/ ^! \; H% V
: E/ W3 X% Z# R' D2 e
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。. ], n8 A# J, f9 u9 C( V; u: \
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
0 v+ g" D* ^/ ?$ r4 O7 N; o先说说VB开发一个COM组件。
6 w) G5 T# M) ]用VB新建一个ActiveX DLL 工程,
& P4 X2 W- L: ^# ~" h( j2 _然后修改工程名称为 MyVB $ M+ k/ }9 \$ P1 r2 x
再修改默认的类名为 DEMO
6 D' o$ u9 ?) j( y" Z然后再向类中添加一个函数作为测试用,如: Visual Basic Code
9 r8 L9 n/ g; Z/ x
( V8 J" f$ R6 q+ D8 q8 u- Z注意!工程名不能为中文不然在c++中会出现无法识别的字符串
1 _0 }- v: o# K5 M  \0 A, q" j4 L4 A
' L" V1 h  ~) Z9 v
, |8 K5 a' I; e: V: A& Z. p, x  e8 X6 v, ^. W8 T! p; t- p, r
Dim str(999) As String, p5 N) [5 `; D7 P

1 _0 Q3 i9 v( b" g% M6 l: r/ @Public Sub GetMeiLei0() '无参数传递
0 ~% K3 C% F& v: F" q- OMsgBox "梅雷qq1821117007"  K( P( |7 P. W6 ^7 B$ ]2 y( w
End Sub
. P$ q0 r! A2 u
0 ?6 \9 z4 Q$ z. ~6 {+ ~  s. ]- c% K0 e
'带参数传递   Public Function
6 |- }$ E  i  _: IPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String& V* i4 p0 C  n, V1 d; }$ ^9 ^6 A
str(n) = str1
, {0 X4 p7 f9 h2 l9 c9 `/ Q) |. s4 C5 v$ d
If n = 5 Then$ o0 Z; z# ]" D% Q( ?1 Q8 n
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
7 G7 x8 ]. n" V! g; a* CEnd If2 }% a  J+ a  u4 G1 v3 U$ M

$ `  I/ F* [, `+ x+ h# M1 hGetMeiLei2 = "数组传递0"8 Z3 \" x  \) S7 e# }7 f

8 e8 w- o. Q5 v/ O* h. Z8 eEnd Function
/ ]2 i9 {# Q7 A. g* T
6 }$ O' P4 i) o+ g4 N& i* s# _: R0 p4 ~8 W5 ^+ K  ?
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
1 e6 g( o# j! k, W* [) X. I" s0 [
* F/ S) |. ^% a& n6 l注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 , P- R! A/ u( f8 R+ u
. [. Z' m/ Y) y+ ?5 a. B

$ R7 g3 X: `" {其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
  {, a' j3 ?  T, }# ]) d而 VC 里调用可以这样做,如:
, v( O% M# i) O6 k# q2 i- L/ N4 p5 AVisual C++ Code 6 f' Y, ^; [3 z3 S
: J& J" }1 {% y
//新建一个 UF程序,输入以下代码# p& l  ]8 Y9 c3 Z* e9 b$ u  B8 o6 G
/*****************************************************************************; G) J! a* F! V/ M! h6 ~
**
, f" ^# R. S& W' H** C++调vb.cpp$ u/ k4 d" T8 {( `
**. O) @4 H+ G! T" E
** Description:
& }2 c. E: ^) C' V: g**     Contains Unigraphics entry points for the application.+ }1 ~6 Z$ W" V- b
**
) o* k7 G) f) T( L; G/ o; Z*****************************************************************************/, {% s, n" R6 q

& W* H( z/ {6 j$ p% n/* Include files */" J% w# c% l9 g6 a. r& x. M
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )2 J, f6 T, A3 d2 E
#   include <strstream>, b3 T8 j5 F2 h
#   include <iostream>5 x1 H6 d7 l0 `) A
    using std:strstream;7 S3 `) C& W0 h# h6 E- _/ f
    using std::endl;   
7 h8 x% Y3 h4 `! q' G1 S3 Z    using std::ends;6 U/ o' J" ]) v! g
    using std::cerr;8 R8 o+ f& i% n2 i) L) j! C5 U
#else
/ S" j% @, r' S4 E/ p, |- Q#   include <strstream.h># |: i6 v4 `3 G) N& H4 f% N8 ?5 u
#   include <iostream.h>
; z& p6 [4 Y2 [#endif
* U/ H5 S6 R! g" K  u#include <uf.h>
4 j4 ^2 j7 @3 Q#include <uf_ui.h>
  D6 a* ]& L% {# C+ s& Q* x# Q$ b8 |#include <uf_exit.h>
9 s$ E( F+ D1 H" \#include <Windows.h>
" N7 f" y9 k' y- d& a; k( R+ \3 o* v! Y6 b
#include <string>; I6 ?3 Q. v# `* _# G: J
#import "C:\MyVB.dll" no_namespace$ P. F* f( @5 @0 X0 G* U
//using namespace MyVB;    //这里是COM组件名称
) {0 {; q% e/ K( X  _9 J2 M3 G9 z* K$ l7 `7 q

" s* S: G2 ~9 x9 H$ g( f/ G- dHRESULT ComInit();
  s" d2 d& b$ Y5 _5 f) Kint mmm(char* str)2 U" L* Y9 |! ^. A1 d) J- i" @
{: a- i2 L1 |/ R9 ^: u) z
        ComInit();
7 F! T0 P2 o) |9 q4 M0 V# U
3 {5 J; |, f6 k9 d1 i6 [        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
1 m% B1 Q/ t1 U* r' E        MyObj.CreateInstance("MyVB.DEMO");( D, `9 O  S6 P# E% J
0 W$ F  A  `: ]0 n6 H& Y$ Z) R
        //MyObj->GetMeiLei0();//无参数调vb函数
9 {/ a7 c7 b) F# F4 A) R' b7 Z( P7 x" K: Q2 R. P2 z# F
char str1[132]="0.0";4 W- v  i% r- P1 p, p' z

1 [/ u' p: d/ D0 K" r$ jint n=5;
+ k9 p: j5 e# l0 D/ u
& a0 B/ O: x8 ]- A7 l; T0 Y_bstr_t vRsinfo1;# Q+ Y. t$ l& i$ x1 o
! f9 z+ t5 }; g/ ~! h) c# ~
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传* N$ _4 L4 }* X3 n  {# y! ^
8 G  O+ A- C: m# S, i" `
strcpy(str, vRsinfo1); //字符串赋值
1 p1 e  X) f* _7 D. G- ~, G) \4 [' Y& m
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
, q! E% f0 `) B+ y5 `' ]: hvRsinfo1=MyObj->GetMeiLei2("qq",1);
/ b: S5 V. t1 G8 P. YvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
6 i3 O, _; D, ^8 m9 A: ivRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
/ P6 Q/ t# S, P! ]9 d' ^  cvRsinfo1=MyObj->GetMeiLei2("手机",4);
% w/ q* W. N' u0 vvRsinfo1=MyObj->GetMeiLei2("15757753770",5);9 V6 M) ^2 ~+ i3 }" p* H( c6 K
        return 0;1 n+ k% L% @5 M# s; J+ }5 R9 ]
}3 t# M5 B, u. w: h. T
; j2 R* S, v5 o7 L: _/ u
HRESULT ComInit()
+ a; z; k' h9 [8 O{
! `/ \1 K4 Y1 k5 t        HRESULT hr = S_OK;7 j: T8 B* {, _  E+ @
        if FAILED(CoInitialize(NULL))
; m: j4 U' [: \  R6 p$ x        {$ Q' W+ j& n8 Y' M
                CoUninitialize();/ h! }1 v- v* x& I4 `
                hr = E_UNEXPECTED;* m, R( ^9 s) i. s( r9 q7 P6 \
        }
% K  N/ R& I! s        return hr;: [" e6 p- X9 q. G% L
}9 u+ M8 a; ?0 n* U8 K
3 t0 D8 Y0 z# e8 S

1 k! m0 {1 ?- E+ r0 o6 d& O#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))). i: o) C; g9 S! f

5 c3 h1 `: E" }" E" s8 S+ Y1 m. X9 M" z' @

* J) r. u0 A) m* rstatic int report_error( char *file, int line, char *call, int irc)3 Z( l+ o( a- M. l
{
4 h1 m' @& x5 z( |# E. x8 f# C    if (irc)
9 ^1 W0 h5 z7 h# X    {
  g' L4 ^7 G1 h: x9 n  I        char err[133],- X0 P1 s' R) p3 u& J  l
             msg[133];# A. L' V, }9 `8 p2 F& |8 B

- P0 u2 D, u. l$ {        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",& `0 E* c. ?- E. |
            irc, line, file);. n* u3 C9 |7 T4 W8 t
        UF_get_fail_message(irc, err);$ g4 h5 Z/ W$ q0 ^- ]9 n

, z$ s* \, \) |$ U        UF_print_syslog(msg, FALSE);
4 d# V# u, Z$ ]  M7 r1 [        UF_print_syslog(err, FALSE);
2 Y6 G  q# J' ?# B/ E1 G% N        UF_print_syslog("\n", FALSE);! }( Z, e! s8 _6 a
        UF_print_syslog(call, FALSE);
( M$ G( b$ w, S. z- H* V) @        UF_print_syslog(";\n", FALSE);) [+ t; }# e* O9 a( X

4 \& Z9 q1 |, V" E& z* r  P        if (!UF_UI_open_listing_window())4 x. t6 B$ @3 V4 `+ F! y
        {+ W8 z2 @2 D9 o
            UF_UI_write_listing_window(msg);
+ p* E4 Q4 m5 P4 p6 S$ o8 X            UF_UI_write_listing_window(err);
9 m+ X" |8 Q* a* T3 l            UF_UI_write_listing_window("\n");
  Z* g6 T* O  m$ K: {            UF_UI_write_listing_window(call);
* J- ?5 w, j: c) j' b            UF_UI_write_listing_window(";\n");4 G1 V' ~% }; n' R; C
        }
- n3 O2 u; A; M2 _/ K2 Z0 R    }  f3 c% G9 E1 E( H
/ `7 _8 X8 c, o0 t  F% ^  O
    return(irc);8 {# R+ }. D1 x; S: r% a/ h* i
}
" h5 A2 t% B  r
2 ?5 t: Q  v4 @& s2 f% O  |1 Q3 W# x: X$ ^7 g6 o7 z
/*****************************************************************************; E0 Y: H( h4 n/ T9 N
**  Activation Methods1 D6 ~/ [1 W5 H% x" v% \2 G
*****************************************************************************/9 G, Z9 f3 R, |# t: a
/*  Unigraphics Startup
" u* D( ^* W/ N4 f0 Y5 b- t**      This entry point activates the application at Unigraphics startup */
0 q9 Z# o5 e) Y2 k. ]extern DllExport void ufsta( char *param, int *returnCode, int rlen )5 D9 [2 y# |5 U: r- k8 _* @
{' F7 b6 r, i: R
    /* Initialize the API environment */9 p7 i' @9 E1 n: I  |5 j6 _1 d
    if( UF_CALL(UF_initialize()) ) 7 Y& ]. n7 E$ E2 b# P
    {) |! F9 q) I* W8 ~1 z! [- q; f
        /* Failed to initialize *// o  \* r3 Z' {- L7 Y8 D8 b
        return;6 O" K5 l/ A& r$ d# l- i# c3 X
    }. y) L) z* u% G( L
' Z  @7 t+ [. b% p# t0 e
    /* TODO: Add your application code here */
, K+ f. C. h7 _
" a* o! K; D, \( D/ H- K$ _0 A: I$ u
7 g* }" T- @; b$ T. I, X- e% g$ C9 o! J: d' X% T
        char b[132]="";
0 Y7 s/ g$ I: P, [/ G# D5 {7 ?' I        mmm(b);
  [& ~# D5 y6 ]- `2 m        uc1601(b, 1);   //在UG弹出显示框
+ B: n6 f: V1 g
. l( p( b7 v% h1 E9 ~/ \! I" v( ~* V/ \4 R" T" t9 B
    /* Terminate the API environment */+ T* S* K3 W/ |. A9 v6 w( C
    UF_CALL(UF_terminate());
( m' e$ X0 s( n* p9 ^7 e9 }}1 _1 v1 i9 P( L7 F

. J# @# ?* Z' T# y& p8 ]) L/ z/*****************************************************************************
" p& o0 P' T& i. m+ Q  o**  Utilities. |# K4 O$ J1 k) R& X* g/ o/ n& u
*****************************************************************************/8 ?  _9 t2 D) R! G

. d' D+ Q" J# u& T/* Unload Handler
0 \. W- `1 O1 S**     This function specifies when to unload your application from Unigraphics.& b7 y4 L* L3 _% C3 `1 P
**     If your application registers a callback (from a MenuScript item or a
, Q& ^$ K5 h6 n# V( x( S**     User Defined Object for example), this function MUST return* h, ^. L6 }( s
**     "UF_UNLOAD_UG_TERMINATE". */! F" J5 M1 ~; f1 l* j
extern int ufusr_ask_unload( void )
6 @2 u* b! r' H( [{
1 y& E: L  v/ c% Z0 G+ {    return (UF_UNLOAD_IMMEDIATELY);7 M* T$ w$ t3 W0 r8 H4 J6 c+ L
}
/ O2 \  V4 H& a- z7 i* Q. W) b' W# M" C* L6 d% Z

8 K- V2 i" x. o8 |1 i; P9 {* e, b+ {7 Z% q4 c# [5 O
1 B" Z5 `8 `2 P4 N- n; |
" {5 P5 M- Q' y
4 f( g0 O4 y; G
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了