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

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

[复制链接]

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

8

主题

10

回帖

146

积分

注册会员

积分
146
QQ
发表于 2016-12-11 15:05:21 | 显示全部楼层 |阅读模式

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

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

x
在VC中调用VB编写的COM组件( Z$ N% r1 a, ?$ L
. T; C/ I  B+ f6 O8 ~, T; H
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用4 K( A" ]( k, x6 g* i, Q# T

- W# R, w) K6 D6 Lvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册- X5 Z- \: w' c' ?4 g# T. T

2 g$ z  M, B& t3 S! q5 x=============================================================================5 `* [! c4 @  [" \7 p
在VC中调用VB编写的COM组件8 n, B* q$ H' f  t) k3 v

2 A6 k3 @1 b9 D: }' m; t梅雷 - QQ1821117007
8 Y5 E3 P8 q1 h" e亲测 XP、win7(32/64位)可用
6 \( D/ `9 R3 b9 x' h* T: R  Z3 h
! n2 x3 O7 j3 S! OVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
# d5 C/ U4 b* Q1 @* u  w+ {为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
) B: b9 s5 a* E0 p* f8 g" B- n( k先说说VB开发一个COM组件。 - @# E/ R& |+ D  h. c5 Q
用VB新建一个ActiveX DLL 工程,
. f; ^# I* `5 x7 Y+ F7 s然后修改工程名称为 MyVB 9 y) b6 I5 W$ q2 _& J4 z
再修改默认的类名为 DEMO 9 A; c+ C2 D5 C8 ~
然后再向类中添加一个函数作为测试用,如: Visual Basic Code" Y+ |! M# b$ O# }; N
+ Z8 j$ r& s; N4 c. B
注意!工程名不能为中文不然在c++中会出现无法识别的字符串: N3 s3 G$ I3 u) A

2 |6 v1 x0 J* E2 _2 K; d
6 x, e3 B$ I& @) b, x' C/ S
* ?. @. l7 K+ m& U3 R7 iDim str(999) As String, W$ Z  W  f: L" d9 [- K
8 X+ a& P# a/ V: ]: K3 ^
Public Sub GetMeiLei0() '无参数传递
! h5 g7 i5 |. f/ lMsgBox "梅雷qq1821117007"
  R  R% i- Y+ C( |2 x- AEnd Sub- S0 k8 u; b! Y

4 h0 Z% L! m' Y+ D# v
# _. a; P$ c& I$ a- d! V: N1 c% ?'带参数传递   Public Function
: ^  o6 R3 n* F1 r- o- MPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String  _! U6 N0 k' K! r
str(n) = str1/ O' T4 A7 y' D. I! L

5 f) H5 `; h  v1 {If n = 5 Then4 L! S/ l, x+ x/ b5 q$ g0 v6 {. o
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
3 M- f5 K! g9 W; S2 v& g0 y0 `: dEnd If! `' W, I$ `  q# j! `/ o! O
. r, `! D7 k( C
GetMeiLei2 = "数组传递0"' P- p: G! c7 n8 M1 V

1 a' t! K# t  p, B3 |% }End Function8 L6 `0 b5 k& o% u: A: v% W- E
4 Y' S& |0 U) t& a- `; e5 }
- [2 g) z9 k" s" ~# F" W7 b: s/ I
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 + O. O2 t  C7 d2 F
7 [7 L* X. i3 U) b8 f
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 # |% A7 K& d/ ]. r3 f) }

2 Y1 d% w5 M# x% J) b4 @. {
5 `; M1 B* m) J7 k& {( |6 ~其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
/ B" x& u6 E9 ]/ }而 VC 里调用可以这样做,如:
7 }" ?: f. y$ d# l% lVisual C++ Code
" z8 `6 F# z$ n" T
, M* U! A% i# U. H, B6 L//新建一个 UF程序,输入以下代码
3 ]1 k. C" g! l1 A/*****************************************************************************% C8 y  [9 s6 O* E) F/ {5 ~1 `+ C
**
' S- W9 V' i- }* l** C++调vb.cpp
5 k" y( H6 o8 U$ @( v**
- S: p, z2 ~: n** Description:$ x! W% ?# k2 r2 K7 i3 C) I% E$ d
**     Contains Unigraphics entry points for the application.
; K! @8 q+ ~- j) `**
% c4 Z# L3 r- t  \5 r8 \+ ~, A*****************************************************************************/
% u; L3 S3 q$ N, L; N4 A+ ^' l& q7 [; T5 D. i& y
/* Include files */
1 ?  W3 V8 J9 c9 x#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )! M0 h7 `( q+ i4 `1 R- j4 ?
#   include <strstream>
8 Q5 X" D1 j: o$ N) c# E' {9 B6 w8 ?#   include <iostream>* P: D/ n( E) x
    using std:strstream;2 L& x! c/ I, e
    using std::endl;    5 P+ c3 i0 z% q/ I* M4 |0 s
    using std::ends;
" A% Q9 D) N* C/ ?; t# e8 i7 R    using std::cerr;
9 l. G9 S& w9 o#else. a/ f7 o1 A* Y4 n9 s% A
#   include <strstream.h>3 F- Z6 a7 A+ K' |; M
#   include <iostream.h>2 i% _( D3 q9 f5 T
#endif
/ Y/ M5 Z2 I! G#include <uf.h>
8 S5 s& R! V9 S8 \#include <uf_ui.h>5 T/ S; Q5 B; X% }- L! I
#include <uf_exit.h>% S9 H; h  K$ L
#include <Windows.h>
- r( h- l- n6 c3 p5 y  @7 ?/ `, m% o1 y8 n
#include <string>
+ m" M5 s' S9 N#import "C:\MyVB.dll" no_namespace7 I1 r" N' s/ a' P2 }
//using namespace MyVB;    //这里是COM组件名称5 B' q% J* g) a4 [6 k0 @2 {

0 W$ r# e4 s+ \  T0 B( K) y8 c  C, t
HRESULT ComInit();3 K' b, M$ X+ e+ ~7 }7 b8 \
int mmm(char* str)
& p6 W" N9 Y7 S  [$ @{4 f5 r% V4 Y6 f7 u
        ComInit();3 ?: B/ ~# J% s" L5 |6 q" R9 k
; M: i! g+ U$ h5 ~5 z6 G4 [
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象0 `- p6 `3 S2 w8 P: t9 e# _& @$ a: M
        MyObj.CreateInstance("MyVB.DEMO");9 i/ ?8 K! i8 O8 o5 D
; V4 n9 X7 O. K" ]3 \! O$ Z
        //MyObj->GetMeiLei0();//无参数调vb函数
2 v8 S0 n+ u. K$ V. t  P& a. C% [* q  L. L& U/ n# a
char str1[132]="0.0";" L& _: d) I3 u( x3 E4 k

% P/ K& p! ?; a% i2 iint n=5;
$ k! Z% ^/ ]4 W5 r( G, k: Y4 P1 S8 r. l! ~0 z: G
_bstr_t vRsinfo1;
# P# `. M$ [) P: o% {& _( E; p. S( Y; O
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传' p' q/ O9 w2 d/ a. v" Z

* L1 d' B: }. q- Q3 V  G' h& kstrcpy(str, vRsinfo1); //字符串赋值
" n. V4 l2 {# f+ Y3 e) ]
& _! O( d4 S# b3 _$ V" M' I3 t3 yvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
; f8 H4 B. L) v2 Q- ]: z0 H+ JvRsinfo1=MyObj->GetMeiLei2("qq",1);
5 g9 m2 B  Q: {$ d- o1 E5 hvRsinfo1=MyObj->GetMeiLei2("1821117007",2);6 Y" X: }8 r: u9 G2 R  U1 U
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
; S- _% z7 Y/ ]$ A- D+ W4 ivRsinfo1=MyObj->GetMeiLei2("手机",4);  ~3 ?9 I9 a9 m* I8 f6 ^: [* H
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);/ s: K/ i6 |- c8 ?% [8 M3 j/ \
        return 0;) Q# ?0 x; W7 h0 ]. J+ w4 o
}( a4 x% C+ u7 T/ V( o6 z. ?

; n5 P0 Q3 Q! |2 l- WHRESULT ComInit()
& ~9 C5 H) W2 W{) r$ ]% u2 x8 _  S* Z1 A- x
        HRESULT hr = S_OK;
- J' n/ @9 K5 y1 D( P/ a        if FAILED(CoInitialize(NULL))
/ m+ b4 D! }# p& G        {3 O$ f; H2 Y7 U' _; l7 X
                CoUninitialize();
; j+ w! P, u/ u' C( z1 _+ R                hr = E_UNEXPECTED;" [% B! q1 [: Y5 y$ ]8 h
        }- |3 d" z  {1 M0 F3 Z
        return hr;
5 y; |/ R5 k6 q% f6 X}# D) [7 L- ?5 k3 h
+ w0 H, o( H$ p1 `6 r
! P. S7 s( A7 C, h! s) k
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
7 B7 O! }1 |0 T0 A& }+ d' d" Q- ~: ~

& V! Z* H! Z. N
9 A6 k9 b5 [9 R) Mstatic int report_error( char *file, int line, char *call, int irc)! l3 }9 S! [2 R# U, N3 v# {
{; |  D: O% B: N6 E
    if (irc)! i# [; E- \2 v
    {6 h  O& _/ H* L/ \* O( _
        char err[133],
9 d  {' f" E5 s. I  t1 f; v# |             msg[133];( p# X, \5 l- U2 ?

9 \/ t6 j. M& ^! }( M. W7 y        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",) }/ {8 w2 t$ |  \* F1 |
            irc, line, file);0 d( `+ e! j  ^: L
        UF_get_fail_message(irc, err);6 D0 \4 _, p/ Y' J9 L2 ?) X( K
9 W+ r( u) U" k3 R: ^8 A% g' c
        UF_print_syslog(msg, FALSE);
: O; ^- G3 z5 C4 e4 k/ B: \        UF_print_syslog(err, FALSE);
& O; G9 r/ H/ \6 }$ Z  F        UF_print_syslog("\n", FALSE);3 q) p7 M  z# D; S
        UF_print_syslog(call, FALSE);
; a* y" E8 M' T( D        UF_print_syslog(";\n", FALSE);* a' j; `. `8 s) g. s
& {/ z8 k! H# c2 }2 x/ y- E
        if (!UF_UI_open_listing_window())
2 |! h: e7 K; t" y+ z* k        {
$ e5 G* ]& c# R            UF_UI_write_listing_window(msg);  Y8 H- k$ A0 Q' d
            UF_UI_write_listing_window(err);0 @$ p4 {" `! p$ K: M( j# `
            UF_UI_write_listing_window("\n");
8 ~: A: y+ m; K            UF_UI_write_listing_window(call);5 [% S0 D0 S! i$ X1 x
            UF_UI_write_listing_window(";\n");' d! }( Z- i* t5 h# n- `3 u5 \. i
        }
& U3 k9 J& R  z6 w    }& i, S9 K8 k2 l4 i% R3 G
+ V5 x/ G' i5 i  W9 x
    return(irc);
8 u& r+ N0 c; [- z1 H}
/ I. u6 L2 e1 ^8 J1 I
6 O+ Q; \) l6 D2 u' {
' G8 t- S# u/ t  r' ?7 x/*****************************************************************************1 {: n  _2 l+ d" J% k
**  Activation Methods& h0 t, B/ _; J
*****************************************************************************/% T1 K- l/ m' L4 q3 H5 J% b
/*  Unigraphics Startup. e! y) ]5 u* R, n
**      This entry point activates the application at Unigraphics startup */% ^3 M8 I4 ~" U/ \7 H' `
extern DllExport void ufsta( char *param, int *returnCode, int rlen )8 M. ^* R/ I. E/ \6 B1 i
{
3 `! R& e( n" R3 i3 f9 @; g    /* Initialize the API environment */4 _: d' i1 W* C! K( o9 D
    if( UF_CALL(UF_initialize()) ) 6 C1 l  R, ?* x1 B* o; X( b% s
    {! ~5 F/ Z* }$ ]/ Y/ B5 V# D' \
        /* Failed to initialize */1 E0 L9 f$ |8 E: I
        return;
3 E/ i8 X# n! E    }7 \  g$ I9 _6 D

6 p+ ^1 N! C& {* J0 ^    /* TODO: Add your application code here */
" o) S% C0 b6 N; J1 c2 ^  H  N4 O$ d% I- H' J! E) L1 t

6 h, D- Q" O  J* Y% T
& {; `2 A2 H' T0 l4 i9 \/ I        char b[132]="";' a- b! w& z+ S% C# I# s
        mmm(b);4 u' o. {" Z; j0 Y, R
        uc1601(b, 1);   //在UG弹出显示框9 s5 ]3 X! W& t( A2 J8 o. Y

- E9 T! |: h4 T/ c9 j0 A5 W. T5 o, Y5 Z! _; O8 g; ]( g9 w9 w/ B
    /* Terminate the API environment */
/ L4 E1 J6 b- _8 d' T    UF_CALL(UF_terminate());6 L# R( P8 Y6 d; d/ U
}* z$ W, D6 {5 o1 Q* H% M* u

$ |1 k3 k. |2 @* m- O3 ]/ m/ z/*****************************************************************************! y; s8 S1 }" r" e
**  Utilities
7 M) O$ i+ v. ~* L8 H, [5 k" p*****************************************************************************// Y& U5 X- ~4 X8 b" s* d7 S
; K; q$ I$ `* d0 Y! B: f
/* Unload Handler
3 g+ b- x  I* x8 R  I**     This function specifies when to unload your application from Unigraphics.) m" t* {3 k! f8 g7 o
**     If your application registers a callback (from a MenuScript item or a4 Z* C. T6 R2 L  C
**     User Defined Object for example), this function MUST return
: W& H9 C. |! \! @0 k**     "UF_UNLOAD_UG_TERMINATE". */
& K3 h) P4 K( H8 E. Hextern int ufusr_ask_unload( void )
  h- {, b8 g$ I) p5 w4 N. i# P{; g- @; e. L  n" U$ Y6 k5 [
    return (UF_UNLOAD_IMMEDIATELY);; |5 [  E( d# N( @4 _+ L! X
}* F# k6 C' \/ N  v
/ S" H  ]5 O, o: I; A- B2 t! z
* m. K  O1 f/ F! E% h

. j7 x/ n; H! X) L4 x9 K
8 |, \( Y6 @- u9 Q+ V+ o: k. ^/ @# K5 U' L* |$ }& w

4 r7 M, G1 Z/ e! H4 o3 l' t
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了