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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
! q& Y0 m, g( M5 q$ ?% o- X' n% N! U7 R, e% f8 p* t) V) _. P
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
8 h' O$ W+ H0 Y1 F. P. x: k+ o0 y' p& \7 `
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册# Z! U; N$ a  M3 g) A7 [/ H
9 b, T8 p* c3 o* B1 Q9 M0 m6 F
=============================================================================, J" t2 u/ [6 n( A9 Y
在VC中调用VB编写的COM组件
, I% l: f& y2 X5 _
, s" u& n! D2 ]+ ^梅雷 - QQ1821117007
2 n% d7 F: E/ ^) b( u( C$ N  v亲测 XP、win7(32/64位)可用
6 n5 _' v8 s' ~9 f
  s2 C- M- [# E% E0 AVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。" h0 v) {7 Q& U5 S5 }' v/ a
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
, _- y% o, h+ d9 ^' b$ k先说说VB开发一个COM组件。
/ T% m& g  a' V4 s& P用VB新建一个ActiveX DLL 工程,
- I  Y+ R% H, l6 g5 F然后修改工程名称为 MyVB ( p1 F7 D5 W# N1 Z6 r8 x( \
再修改默认的类名为 DEMO ' w. H2 w7 d* G
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
( O' N# d# I& F$ n
- d' _1 ?) G" C5 a" F9 S1 y* Y6 S注意!工程名不能为中文不然在c++中会出现无法识别的字符串
( w1 g0 |* K2 x& v- y
1 P2 j8 H* ?+ [& O# _4 R! z6 C
6 b' q  _, w1 _3 d8 U+ o7 U
: J, A- V. Z1 }  X5 u* BDim str(999) As String$ Q4 Q1 \' s& _
' \% I- g2 E# g! {# q
Public Sub GetMeiLei0() '无参数传递
7 U5 S% R" N6 M9 kMsgBox "梅雷qq1821117007"
8 n! i! v% i! q% k5 T, IEnd Sub
+ Q* L9 E+ k) s5 `0 Y  ~' n4 Z, e. o' H$ O6 L
. ?) w% u& o  o/ N, ~3 I" C
'带参数传递   Public Function
# D# B" w% O9 q+ j. c2 HPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String5 I, y1 X+ R# c7 m6 L
str(n) = str1
' a  L1 Y3 h- T; {, L& K+ Q* ^$ u$ f3 J$ p( r# ?
If n = 5 Then
+ K6 B0 T& ?5 vMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)) o" g/ a, E" i+ C' `# m: h
End If7 h% g% C& e+ N( x" b

0 `% f  L5 H( H# h$ `$ G! H6 kGetMeiLei2 = "数组传递0"
( A" S) L6 b; [% g$ G
: S$ t) Q1 t  W  oEnd Function
7 K8 X0 o; r/ p. {3 {! b) N; |' z* u/ l

& F9 r# I5 d" o- ?& S然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ' |1 l- a# p# H7 V4 S+ G
. Y. O  P7 O/ h. i4 d
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
9 t3 q3 u4 @3 r7 w4 Y2 ^2 k$ u# D& M  o, P2 j* F
, Z8 A9 w* z  i$ u6 F; d" N) u
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, + p7 w) m* h# y* E3 O
而 VC 里调用可以这样做,如: 7 v7 J' a0 M2 Y" C7 Z8 J1 c
Visual C++ Code 5 \+ o) k* @' Q8 @3 e+ e3 ~$ E% _
. K( m8 u- u' K+ m
//新建一个 UF程序,输入以下代码
7 i4 ?( g1 l1 |; e& M8 b/*****************************************************************************
0 `/ K# }& n4 \- E9 K& V! R+ t8 s**
3 k$ a- @+ N4 o/ y& j8 }5 h3 p** C++调vb.cpp
" I/ k  ^* Q' n3 k6 f8 A**
0 ^! l( t7 k( R# _** Description:9 V  p/ a, i2 V* X2 e
**     Contains Unigraphics entry points for the application.
; |+ s4 O* ^7 {5 X**1 V8 _- x5 o2 k/ ^9 L
*****************************************************************************/
- V0 u7 O  S9 q, ]* `* O6 `
- w* b/ x7 E1 I8 T# M/* Include files */7 k+ v% H6 o. H8 K0 u# I0 S
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
2 i: P' R! G: m#   include <strstream>
2 n/ y; M$ x6 ]% h( O. f' }#   include <iostream>
9 ?) Q$ G1 \8 E    using std:strstream;
  m& L: @+ K( c    using std::endl;   
, d7 S' w' R- f- D- }* W    using std::ends;
; u- z" P( }3 S4 y; X$ Q" f    using std::cerr;
" H" H) |/ y, [0 k5 I* u# L/ y- R#else
( c8 j: O$ d- Y! t$ _/ Z& }#   include <strstream.h>
1 i* h2 L& i' `5 f5 [" O* b#   include <iostream.h>+ O" {9 Y9 z+ ]
#endif
( {- ]. T! G+ t$ B1 h$ n6 h. X7 a9 h! u#include <uf.h>
2 x1 ~1 ^4 l7 Z+ t2 k#include <uf_ui.h>
! N: C3 u* i- h5 y+ L0 {& n#include <uf_exit.h>( G3 U* a. E4 v* V* P
#include <Windows.h>  ]. {1 j- Z7 {% V5 y( D

9 J* ?) c6 A/ \- p1 g2 F5 N' M#include <string>, m7 [' L" y1 @: a
#import "C:\MyVB.dll" no_namespace
! a+ b0 b/ s, g" b4 Z: w//using namespace MyVB;    //这里是COM组件名称5 B( v& g9 \5 e) B# a

6 L* i4 F1 N2 g( t' |& X0 k1 \9 B/ X
! P, L" \1 ^& l, L8 {) fHRESULT ComInit();
' @+ s' B" b! ?7 m6 G: [int mmm(char* str)
! {. P& B# e) [6 d; W{/ d* _9 V& q! J$ \( s
        ComInit();4 ?" i( t& S% B5 ?

" C- x! `% D$ v3 \* x        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象1 r9 Z/ l- P1 Y) t
        MyObj.CreateInstance("MyVB.DEMO");
3 F" I8 T/ W) M6 z, a, I% U
( U  c, ?( b# g1 q( p3 e4 x        //MyObj->GetMeiLei0();//无参数调vb函数
1 D$ }6 b. e) E. j0 N0 m$ u
( O0 f9 ]8 ?$ U  Pchar str1[132]="0.0";/ P7 \6 `3 n& x! w2 h, f1 A
6 O) \% |$ j2 ]
int n=5; $ X% |5 O% K7 _+ O$ ]

! Y7 k+ ~1 Q' j4 k& ?5 n7 T' G_bstr_t vRsinfo1;; G; x1 C/ W* U' R0 O% d8 J

9 H* ~1 `9 l  M' s: _$ e2 OvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传3 E' ]. w$ ^9 s) |, n+ r4 L

7 f, ]5 t( L+ [1 }8 o4 r% ?strcpy(str, vRsinfo1); //字符串赋值
. U$ J6 @, g' t: d$ d3 i8 {5 y3 Y  }  v& x( P; w) I6 U
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
. b  r4 }+ W$ T# gvRsinfo1=MyObj->GetMeiLei2("qq",1);1 C* [( W4 L) T+ Q. \
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);+ N/ O: V9 r8 w6 p1 S. X
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
9 {% e$ U/ V% j; q8 EvRsinfo1=MyObj->GetMeiLei2("手机",4);
" y( T7 Z( l2 e: `vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
5 ?7 ~3 B. J$ ^/ V        return 0;; x9 M. K! `5 r: l' p% m
}6 {! |. m2 g$ {% O  h% N3 n' Y% h

, O2 S+ i* d* ~$ VHRESULT ComInit()- J' U3 S; s4 F$ b
{/ I/ P: |% o! Q$ j! G8 F
        HRESULT hr = S_OK;
4 U" o8 r! h5 i  R2 F' L- M9 w" v        if FAILED(CoInitialize(NULL))
" w( R* x5 S) `( I' U        {
' M5 _4 V" m! _7 t! {  T                CoUninitialize();
" S! ^2 n+ g, \                hr = E_UNEXPECTED;: I' |1 e/ c. Z& w' X( a: T; z* W
        }7 z/ O- x4 S/ t7 N; D
        return hr;
7 J0 _3 v* u9 g8 @; ?}. \9 s  R( f1 d& j+ T! _/ n3 e

8 I: N: \- d& n9 }0 c  K
2 u0 ^- t* @2 a6 ]! U7 o& l2 w- e7 B- M#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))* o# J+ g9 d. k4 z' l6 j$ e
2 J3 M2 e; F7 d# F
, l1 F* p  r+ b0 V8 H7 p
. t3 m: q+ p" S/ N" A7 R6 q
static int report_error( char *file, int line, char *call, int irc)
# ~4 @# Y. h0 d9 @{
/ _- O: G7 \2 z# j# `$ R    if (irc); R7 m8 A/ [0 O& M9 ^
    {, v$ F0 i6 Z' w  D$ m( |' x: n
        char err[133],
3 N8 F" r1 f$ H6 w             msg[133];
9 f  f2 L& U9 P* i9 s2 J% n9 m
: ~6 T- t7 z8 w6 Z5 _. X2 V        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",) x- e0 ~* |/ z% R& z& T
            irc, line, file);2 h! Q' h$ T  ]% P/ ?
        UF_get_fail_message(irc, err);+ G# V0 w- b& b; @2 X8 ~# |* t0 Z
' z6 x! C2 o/ w" a
        UF_print_syslog(msg, FALSE);
+ F! ~3 q8 R1 W/ H1 j        UF_print_syslog(err, FALSE);
' q  Z% [& T2 m        UF_print_syslog("\n", FALSE);
1 w, S/ L( C3 C2 {4 N' B% v        UF_print_syslog(call, FALSE);
1 u+ `( h9 y5 I' Y( C) g6 Z5 Z        UF_print_syslog(";\n", FALSE);* ?! D; @# [, o0 U8 B8 ?7 ]
* I% ^# f* _( x$ _
        if (!UF_UI_open_listing_window())' a) T* q2 C! P
        {9 S' e7 }% S: y7 f, j
            UF_UI_write_listing_window(msg);
( {* G+ H+ j  H$ s            UF_UI_write_listing_window(err);
- G8 A  I9 k2 U& g0 D2 x' N            UF_UI_write_listing_window("\n");
: w+ o/ Q# h/ g( ]4 B2 `! n            UF_UI_write_listing_window(call);4 ?. j3 F/ t8 Y  S, l5 ~
            UF_UI_write_listing_window(";\n");
! q+ _4 }0 Z. c        }9 z/ U$ E0 o& @; ?: _$ m& X
    }
) B. d6 @7 S# M$ m2 I1 A8 F/ K# m  ~: U# C9 Q9 `
    return(irc);
8 j6 s9 N, o8 m2 {}. q, g: e$ T8 |* ^9 n3 D

: L# T+ W) x# G& \' S8 K0 F7 u. l: N8 z% W! l7 O
/*****************************************************************************) p0 R8 X9 Z# A9 D
**  Activation Methods
9 V5 |( Q* h" _% {*****************************************************************************/, ]7 o) ]4 [5 B# r8 S' a
/*  Unigraphics Startup% y3 v- \7 H8 t0 N2 ]
**      This entry point activates the application at Unigraphics startup */$ X$ s5 @2 V# c) v
extern DllExport void ufsta( char *param, int *returnCode, int rlen )7 u. N+ P0 K- Q" O7 p
{
5 A, s3 T7 q/ r6 P    /* Initialize the API environment */& B; S$ B8 v0 y+ B5 m" j0 L6 ?
    if( UF_CALL(UF_initialize()) )
7 j7 R( j' u& U1 F* x    {: O. N' t) i8 g9 ~: E
        /* Failed to initialize */
( @/ D* ?: u6 M0 Z# T( C        return;/ h  K! p$ b% A& r/ j$ i
    }
, U6 K+ `  J! r7 J
9 D+ b* y+ T3 q* _    /* TODO: Add your application code here */" f) B1 a& ^7 @! o$ s& q8 m* y( L8 |
- \* o! w2 L9 a3 `; R

' c+ u+ T2 K- d* v; i
& I" m2 u$ ~0 s6 m        char b[132]="";
/ O/ y) Q. m* `4 U/ X% _! `        mmm(b);
9 N0 v/ H6 _. Y8 a# R        uc1601(b, 1);   //在UG弹出显示框" g2 z8 [  h5 |! _4 o( h* C: _
. t: P- a5 {- `3 [/ Q: U# k7 M8 x
: s) ?$ H+ r: I& f3 M% D
    /* Terminate the API environment */
. R( n( t. _, @4 v2 z( h9 C' N8 S    UF_CALL(UF_terminate());
6 R1 a6 h2 M' R5 I7 W- p) T/ ~}
& z$ p% S7 C: p$ B) ^  L( H
. |2 f+ G" H$ j3 i% D9 J1 D6 c/****************************************************************************** Q8 b, h2 A3 t, g6 O. i2 \
**  Utilities6 n; G1 s& J! C
*****************************************************************************/0 R1 ?; x; k  k
  }( n( B* K) V3 f+ a& L
/* Unload Handler
( Y% k( v/ E; r2 X( `6 Q6 S. k**     This function specifies when to unload your application from Unigraphics.
0 L# O% ]$ w5 r. {' n**     If your application registers a callback (from a MenuScript item or a
* H7 i6 M# D' \; ^. g* ~**     User Defined Object for example), this function MUST return, [" N5 r& A3 E7 Q5 ~7 e
**     "UF_UNLOAD_UG_TERMINATE". */. T4 }  V9 r) ~# g
extern int ufusr_ask_unload( void )9 ?2 e4 Q% Q# ^& p% M# S" v! _
{
$ X1 f- A& a) J0 S    return (UF_UNLOAD_IMMEDIATELY);
; j3 k! b) f* f2 A. |}9 B+ D% X8 [) `4 D4 O
( ^/ n' n! I: d- D; N0 v

7 D7 p- g' O# M. _& \2 p" j0 N  A) F" T9 b- i

# b2 v7 L& f, j7 M3 ~
* S/ b& |' @2 F) d0 _8 T
; `9 m- L1 S7 n& D  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二次开发专题模块培训报名开始啦

    我知道了