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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件  w# v. j5 D+ a9 V( j0 \

% f$ f$ M. l& K) e; q! i★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用7 V+ r- U# j* Y8 X" _# A  u
0 o# Y4 J7 {" V' B3 N6 f5 W1 A) T
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册! Z! J# b  y7 T
" ?1 Q. Z3 _! C$ ~) N
=============================================================================
  O. w6 ?7 M3 Q! d7 l+ ^在VC中调用VB编写的COM组件
4 N& L/ W% t* d4 i. e. C6 ?( F0 ~& X3 E: Y0 ?
梅雷 - QQ1821117007 0 _8 X- r! l4 b0 A4 K
亲测 XP、win7(32/64位)可用6 T7 d0 O( l6 M5 U# E  N) ?0 q

$ }+ N, [$ m' i$ p1 u. P. fVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
6 Q3 L5 K* g6 d# J3 b$ m为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 . P' W! {* K& a, j
先说说VB开发一个COM组件。 / X. U- U) O, _% ^1 t
用VB新建一个ActiveX DLL 工程,
8 \2 G7 Y, M" q5 ~2 N4 P+ S* N然后修改工程名称为 MyVB 0 ~$ p# B7 Z2 E
再修改默认的类名为 DEMO 1 m: u+ p6 g: n* [
然后再向类中添加一个函数作为测试用,如: Visual Basic Code. M; V- [  H) M1 T, ?  O: P6 i
) X: c$ U: A2 Q3 c/ E
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
/ x. u( o8 m# {- l( c7 @. [' h! I: K; X1 A. u% v5 F
( v0 k& j; w: C, x- l1 s

& t1 S* [9 `) F- f4 t) P+ iDim str(999) As String) c/ G( |' [) b; L( Q

# I8 U' }0 k$ ~- z  v3 dPublic Sub GetMeiLei0() '无参数传递
- k* b- f% h" r* E1 G! {MsgBox "梅雷qq1821117007"
# T; u* O! n- N$ w) d* iEnd Sub
1 b6 _7 Z' K9 E9 G/ G6 L7 Z0 P. X7 z9 s' I4 H
5 K  V# V* U1 ^, H
'带参数传递   Public Function
8 _- r2 Q" ~8 }% q; ~# y4 CPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
3 ~9 E) n5 X0 J9 k) e6 G3 V6 P2 Dstr(n) = str18 a# D4 `# R' z

5 C) x2 c2 L+ gIf n = 5 Then* G4 s  L2 c4 X$ L
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
+ z, K$ L# v% v. a5 y2 `' `8 ]End If' i5 G$ j! ~6 q: ~( _9 o
# c8 j( S' N6 \* U3 m" C+ O$ f& v3 H
GetMeiLei2 = "数组传递0"3 H! i$ f& d  o, C$ M

6 h% J0 L4 K. m5 h( T/ iEnd Function9 T/ I4 i* D- V

: t* T( K+ \" p3 N+ C9 w$ N2 O: a; I/ w9 U. M) d
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 : c8 y  V( b( a5 ~8 W% X  Y" n/ `

4 k6 G" z" I3 J. K7 l! Y- z& z注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
3 u" C) _7 W2 o$ w
& w4 I7 Y1 V4 y2 `* K' }) P0 p/ C' |9 m
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, / n* Q2 G" F9 l, R
而 VC 里调用可以这样做,如:
( x0 i' P4 \  O6 J* k4 n% vVisual C++ Code 6 x) X8 ~% \. `$ V4 d  k9 c
$ I9 R5 S' b# }8 V
//新建一个 UF程序,输入以下代码" U: R5 j, Z7 h' l, w8 f  I/ C
/*****************************************************************************
( z1 O; i7 F, S$ [**
1 y$ A& b8 J2 v3 L+ H** C++调vb.cpp% Z$ l6 J" k2 v* o& k3 P( g
**/ k$ d6 [+ Q  ^1 k, w" W
** Description:' o9 B6 S# e8 e
**     Contains Unigraphics entry points for the application.% Y* N8 \8 v) q' Z: d4 ?
**
: {' |& o0 x0 D' `1 [( O; M. P*****************************************************************************/$ d+ q. ~! }) A9 G8 x$ M- T& P
' {+ K3 ]9 y7 B! T
/* Include files */
  C; c7 l: K+ V1 A#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )! P1 `# @/ r' p) [* A" ~! H  F) W
#   include <strstream>
) ~+ g* b4 |1 h3 [#   include <iostream>
* G% s& g  C2 W! U2 z' Q  X    using std:strstream;! v# X* Z4 h- W: n4 {
    using std::endl;   
3 @  V! a* C7 b: J: C# ~  R9 J/ _    using std::ends;
5 f! m. {0 T- J; `    using std::cerr;
- {1 o" e1 p% B3 ]#else
. G  K: P' v- i2 V- j7 {& w. V#   include <strstream.h>
, r8 x1 l- @1 z- |9 J- b3 V#   include <iostream.h>7 \+ N& g* H. P! c0 \  G+ z
#endif! {% D1 x5 K( g4 l& y1 g7 R5 n: l
#include <uf.h>9 q6 b$ x! w8 Z% r8 T
#include <uf_ui.h>
0 A- [0 b5 V/ s  ~2 e- H" G#include <uf_exit.h>+ p3 v  I5 [4 T. c+ |  l) z( U0 _
#include <Windows.h>
7 r3 k; x8 o; b4 B% @
5 }9 I3 S% p7 P$ d6 w, \#include <string>: t5 {/ a5 F4 q9 i' w0 ?3 X
#import "C:\MyVB.dll" no_namespace! z, }5 R- a" A1 v
//using namespace MyVB;    //这里是COM组件名称
# N4 Q' k# l7 P  w* V8 c7 \5 }4 Y& ?

& n+ O6 |9 D9 ]HRESULT ComInit();+ F8 H3 p7 N$ C4 c7 }/ B
int mmm(char* str)
3 w+ b+ t2 G1 p{' H/ X0 s- a  w  O/ v
        ComInit();
2 |, d4 q# z2 S) T& I6 p4 q9 F3 K
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象2 a1 V2 ^. T, c5 X: I$ s5 j
        MyObj.CreateInstance("MyVB.DEMO");
  @5 h( G( L2 O& r8 V6 |' k! f/ d- J" ~' \$ C- r+ Z! `
        //MyObj->GetMeiLei0();//无参数调vb函数
5 h, Z& O6 g) X/ _2 H
9 p! }  H: l4 @% n) ychar str1[132]="0.0";
  H! T$ U5 V. H2 v" w  Q. Y1 ]& p$ t) S0 ]$ ^( u( ?
int n=5; / b& N& ?4 f& a( s& J
7 v2 m4 E2 O8 ]4 D7 ]: E
_bstr_t vRsinfo1;4 F% `0 v4 V# r, R1 w% Z

$ x( ~' |" [, G8 E9 CvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传7 l- U" c2 U6 q$ L1 t3 k& ?, k( ]' z3 \

# f6 \6 T1 O* K/ hstrcpy(str, vRsinfo1); //字符串赋值$ F5 _$ r* X- T+ B) A7 P5 Z& p! E

% f1 m* Z7 N* N. i7 TvRsinfo1=MyObj->GetMeiLei2("梅雷",0);: S0 m. i3 ?! F8 s: X& ]- f
vRsinfo1=MyObj->GetMeiLei2("qq",1);! a6 x8 j/ P$ |' P) P; a7 A/ F
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
5 c* S4 t' ?6 W. S2 CvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
. m4 V) ^) x+ m7 ~* hvRsinfo1=MyObj->GetMeiLei2("手机",4);& Y+ u; v0 h0 S5 S/ k) A
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
1 F# z1 l) X; A  H4 C5 s        return 0;
3 C0 V, g2 W2 D' x/ p$ T1 T) K}4 w* W4 `& ^2 \: y  ]

* A$ a1 l# K: `( ~1 N2 h+ kHRESULT ComInit()- M$ f* ?( u, w6 k; W% B
{
! f( g; |0 r7 @: j" k        HRESULT hr = S_OK;+ u% p/ W: h. B+ Y  A- f! L
        if FAILED(CoInitialize(NULL))
8 q: C. ]7 }# W# x8 Z        {
6 P/ G8 g( R2 `  z% F                CoUninitialize();$ b8 P7 I7 P7 `8 [
                hr = E_UNEXPECTED;
7 Q8 V) `! w+ D2 i8 C- z        }
+ L# e8 u7 n5 D        return hr;
4 ^+ R! `+ ?6 _: G}5 |3 o; h. B' S
5 \/ u5 {9 @, Q

3 g: D, @& ]+ E2 e+ M3 N#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))' l- h5 ~# G, }7 m! H

& n6 G1 t6 k' {- R! M
  M6 U' O3 V8 V: C( R- c( f9 @
* d7 i  _0 u) X# bstatic int report_error( char *file, int line, char *call, int irc)' A! t0 m" k5 \2 _- b+ B8 U
{" x% \4 @4 u4 ?
    if (irc)
: Q8 T$ }9 W) D( o9 b$ P0 B    {
' u6 P) N$ }2 U        char err[133],
3 e. S; c& H. d8 m             msg[133];! S& K8 k. W6 {) B% O
+ X9 ?& ]3 v. J+ B7 o
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
6 N2 d3 t2 P5 X3 e7 v: j: X8 B5 v            irc, line, file);, n7 q* G2 y' F, N
        UF_get_fail_message(irc, err);6 X; P  d  w8 d" n3 k
( n! P- P5 F% L1 [$ ]7 @
        UF_print_syslog(msg, FALSE);
+ M# B0 O" _# v5 q' m4 ^        UF_print_syslog(err, FALSE);
- t1 j) ^( _6 h/ j/ u6 j: }1 l        UF_print_syslog("\n", FALSE);
/ d  p% e7 J$ e( x& c. v- Y! }/ H! B- Z" |        UF_print_syslog(call, FALSE);8 U+ F8 H  L/ g5 ~
        UF_print_syslog(";\n", FALSE);
  j, q$ k7 A" `7 N/ F! c- {1 W8 E; Z9 i$ E& x
        if (!UF_UI_open_listing_window())" a  ?8 s. G3 s8 g0 a& T* I
        {2 @- U1 C3 t$ b$ f9 g3 J
            UF_UI_write_listing_window(msg);
6 x( _7 v4 n3 Z- j8 r- c1 Y            UF_UI_write_listing_window(err);
( n8 {; Z$ |- Q. T2 @6 o( x, `$ I; a            UF_UI_write_listing_window("\n");: A* K5 O$ U/ k# V" C
            UF_UI_write_listing_window(call);# D) ~& x- M! y$ Y0 N" W) q6 W
            UF_UI_write_listing_window(";\n");
5 W! ]3 K3 [8 u2 a) J$ e+ ?        }: t& x: g, J. d* U+ M# V7 e
    }' c9 J2 Z5 ?' [0 v) U6 D5 w
/ o; n, {/ x( k! Z# _7 P
    return(irc);
4 b! |4 r8 A4 Y}
7 }+ ]7 u/ j' U( a7 x) H! Y7 s# q! c7 A8 C& _- v. }

% H5 t5 n# `  |0 h% l( v/*****************************************************************************
- ]; W) u% I$ D& z, u4 O$ l- L**  Activation Methods3 @4 j3 N7 W+ k' H) p1 o
*****************************************************************************/
8 y' Y; ?; f5 k+ b# s* V- O: ?% E. z/*  Unigraphics Startup
1 W) B/ P+ ?& h1 q) p**      This entry point activates the application at Unigraphics startup */
) ?5 [4 ~* U: `$ }+ Q9 Y* Qextern DllExport void ufsta( char *param, int *returnCode, int rlen ): D/ {0 \/ X9 \: ^6 @' N
{4 p7 g" R$ `# a% Y1 |: h
    /* Initialize the API environment */, F; t7 k* g; g* z  w3 A* c8 B
    if( UF_CALL(UF_initialize()) ) % g. e1 f+ ?$ k5 A* G; P4 ~# Q, y
    {( |3 y  {8 K! [1 s5 W1 x0 Q
        /* Failed to initialize *// ^! I- ?: R" k5 B9 T0 o- V
        return;
- ~/ G5 M3 r: _9 p    }
: o; D# ]4 K3 Y: X% H. T8 l
# k. F+ R  m1 r9 j! [    /* TODO: Add your application code here */
- H0 M8 v! @  g2 P+ V$ a! t3 x
+ h' N/ Q  [+ G  ~2 N, s, r5 I; j5 `( f3 W$ w; s

8 Q# G$ [+ e" Z% P( i7 c- ]        char b[132]="";6 I& K! z$ C6 I$ T
        mmm(b);
* f9 d6 U. U! l        uc1601(b, 1);   //在UG弹出显示框( E6 [' F1 h( |

- w( y. O( c4 R! |6 p# F) S" G7 L# [3 L; l
    /* Terminate the API environment */5 B4 Q7 X% O3 W
    UF_CALL(UF_terminate());5 L% f( P6 g- `& {, \/ F
}
2 N' k/ j/ l  z" R' F5 A1 \5 e" Y! p
/*****************************************************************************
3 g, f& I$ T6 f" o0 \0 W, b( a**  Utilities
5 f% R: {+ W* [3 I& X2 V) i# ?*****************************************************************************/
8 b4 {9 j8 b- \0 P3 E# e5 Q
- N# L% ~: f# }1 ?& w, v/* Unload Handler
7 v) n2 z, @6 I+ _**     This function specifies when to unload your application from Unigraphics.
9 m4 j( J+ c! D- Q# m5 d8 @) ^**     If your application registers a callback (from a MenuScript item or a
5 f" R4 [+ k2 C**     User Defined Object for example), this function MUST return
( H# ~0 Y, g2 _**     "UF_UNLOAD_UG_TERMINATE". */
% ?, z; T) n' p8 u3 mextern int ufusr_ask_unload( void )9 O7 B# g! k! O+ }
{4 ~1 E0 |4 L( N# ~/ W
    return (UF_UNLOAD_IMMEDIATELY);
% ^- J. y6 g: `/ h0 K}
' k# R. F) K, g" _; k/ d. x  b& r, L4 V8 Z) h; c+ h

. i. |: R2 P" L/ [$ ?; K8 d3 u
& P$ j! I3 V1 [1 K6 B+ V! S# s8 M. ?; k7 D5 l0 ?' M+ l( z
* Q) `  s) ]& |

4 a4 S1 k7 X. K. F
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了