PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
& ^% @7 c# d" z. l/ w# c
! o( H0 J- ]' z6 t/ R3 J7 G1 S% ~★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
* H8 j4 U* I6 [* L# t% X8 z4 @8 f! Y$ R  U' i
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册( \4 y- A# n* O! A4 K

2 w5 g$ B  ~8 N, |9 W+ O' L+ a=============================================================================
3 U# }" C8 g  X0 F在VC中调用VB编写的COM组件4 h: R: t% O  {

) {8 Y! Q; }$ x+ q6 F5 I  z  d$ @0 q' M梅雷 - QQ1821117007
9 H# }. H- }/ t' `3 ^- S亲测 XP、win7(32/64位)可用
/ O: A" o2 T: M2 Y( T0 ?$ e( U, K/ X. u- e$ \, i$ L; b
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。* C* `: n! E. d
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
: k; J; o3 \3 N& m3 a! w" m先说说VB开发一个COM组件。
6 s! ?+ P/ F4 E9 Y, ^用VB新建一个ActiveX DLL 工程, " {/ o- ^/ T" J" u& q
然后修改工程名称为 MyVB
3 ?2 u) s6 h3 O! j; |; J: Q再修改默认的类名为 DEMO - g- K1 T* p/ N0 t. b' A& }
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
- f: c  Z. x& e: H
2 L3 e- `3 ]9 U, N! z0 x4 x注意!工程名不能为中文不然在c++中会出现无法识别的字符串
. e2 [) s: C8 s/ w. v2 I, a1 |5 W5 T( t  d" }7 F

7 y6 f2 @4 H& Y
* O2 ?. G- f1 n4 E' ODim str(999) As String+ Y1 C: e; ~6 D! I

( Q/ k" J" K! p0 @' I$ vPublic Sub GetMeiLei0() '无参数传递
7 r; O9 U' _. @4 z6 iMsgBox "梅雷qq1821117007"  U1 s. Q( E; m! \+ Q
End Sub$ N7 `) \6 A+ Q7 N) x4 @+ h

& T  Q$ J' ]5 E; F. W0 R7 G' n: O1 ]! Y
'带参数传递   Public Function1 Z2 ~" r9 D: S6 u9 b1 y
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
3 E* o1 q$ t+ u& K' N+ X4 t; Nstr(n) = str11 [; p. `. N  a% h# @4 V+ q
$ {& c6 g) T# @- P+ g# N
If n = 5 Then( p# T3 ^& v8 X# p/ [$ h# G1 B( H( W8 ?
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
: v" z! _5 O$ P  g5 kEnd If
6 n  W2 ^8 B- s2 f
: v" V+ }8 d2 z  VGetMeiLei2 = "数组传递0"
/ \' K/ t+ ^$ l, g- I7 M- K
9 n$ k' @( a' o5 a" `% AEnd Function
% V; e) @% H4 P' a0 f! j  m% m, G
6 u- i2 \  X. r
, y; m0 F- `$ e+ j9 Z$ t+ T然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 8 X/ v8 M6 f+ t2 P: X: A/ {% h
4 Y' ?# J. k$ a3 \3 ^1 G
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 7 u" g$ r9 n  l9 v4 m  E7 [

; k# t7 D6 T& L
0 ]: h. |" g- {4 y其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, ! k7 `$ z3 k$ @# e$ S9 y) T1 {
而 VC 里调用可以这样做,如: 4 D  j* K+ k' f# |
Visual C++ Code ) i" i$ R0 D7 {2 M7 H

6 x: O' r2 C: x' X//新建一个 UF程序,输入以下代码- N* c9 Q; U2 w. _8 y8 o* X
/*****************************************************************************6 C$ B9 i% }0 B
**
/ {5 Q5 j8 T7 o* N** C++调vb.cpp
  d  L# d# B2 a6 L& [; x**
& \2 [. F) E4 e( R** Description:% M' e8 k' u/ b5 G: w! [
**     Contains Unigraphics entry points for the application.
# j; E8 ~7 C+ i! |: @2 X**3 {3 I! @3 u4 R5 b* v
*****************************************************************************// Y! D# c0 p1 m, ?

- g: ]  ?! v9 r& s. T$ e/ f+ s: _2 C/* Include files */
0 @7 t/ @0 y' |! _4 c# d1 L0 t/ u#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
- @/ Q# z9 y$ H  B5 n7 x" O" A#   include <strstream>( \6 `8 S! n" ?' q
#   include <iostream>
% i3 ]/ B& r- v3 u& z- H( |    using std:strstream;
' m9 c* @& B3 m& U5 a    using std::endl;   
# ]0 ~6 K" ~4 l6 C# D    using std::ends;, s* p0 f5 `- E* K4 F
    using std::cerr;
3 N4 g  O0 _# F5 Y; A1 O+ V#else3 o- Z( L/ I2 S, y/ l. X* r
#   include <strstream.h>
' _( g* v: h1 }3 Q( {6 F0 a- T7 b. y#   include <iostream.h>
0 V/ \( g; y4 p1 |* U5 V! q; s#endif
8 g$ o$ j3 x, b/ k! z1 e#include <uf.h>
9 J& v3 h7 Y+ K  m#include <uf_ui.h>& J+ S2 f4 z4 b) ?) |
#include <uf_exit.h>+ w" e4 S1 e3 X% |
#include <Windows.h>2 |/ y! `. i+ n+ f2 X

: Q$ r% l& W% U7 i#include <string>
4 S( |* h; O& n% S2 H. H#import "C:\MyVB.dll" no_namespace, ]( u! x& Z5 b; X9 @
//using namespace MyVB;    //这里是COM组件名称
% f( V; i: j" [! R! q4 s( s1 e; I. {  L$ _
! U7 v; D, i4 d6 I) e5 n# U- U
HRESULT ComInit();
3 ]: g  P9 u) Bint mmm(char* str)1 L$ M2 \2 w& F! U( H2 Z3 E6 f2 D$ c
{, q( K6 p" j: {1 s7 z
        ComInit();8 A& U  A2 G2 {. ]- z
6 c+ }, E; b4 }+ t! z
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象! _, l% n3 V* j* g, i& e+ @
        MyObj.CreateInstance("MyVB.DEMO");
/ S( z+ h7 m) D" p
6 L# `2 ^+ _0 Y8 W        //MyObj->GetMeiLei0();//无参数调vb函数" a8 h+ V8 d8 D
/ k1 g& ^. C8 i# A6 X( x3 ?
char str1[132]="0.0";
4 v) R2 y! s& ~: {- x8 A* ]# K# S% V: ~+ }  }* p- N" S
int n=5;
2 ]* D5 s. Z! h8 B. b% T. o  c, M# T' R" ]$ ~8 K' |
_bstr_t vRsinfo1;4 k1 N) r+ [* m  ?, o
3 Y2 [/ {9 R- L: c& T5 E
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
1 }, g- ?$ }0 v+ h7 x1 R4 y" `; b9 ^2 X4 F% O- n/ s
strcpy(str, vRsinfo1); //字符串赋值
) @& m) r3 G) p! [: k6 W3 v9 Y/ A, v2 e
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);1 l, l2 E% [0 W: ~- Q
vRsinfo1=MyObj->GetMeiLei2("qq",1);% s5 m5 j/ y: D* G5 q5 }
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
$ m" b$ M6 u. u/ bvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
& U2 L: ~9 a1 J2 l+ C, F6 O, W9 tvRsinfo1=MyObj->GetMeiLei2("手机",4);
. K" \9 G- M( u( ovRsinfo1=MyObj->GetMeiLei2("15757753770",5);1 H$ J) g, b* P, H: q; Z1 l
        return 0;
. F, o. G$ j6 J6 B" S' o}
0 [6 s! D, r9 k" x
6 ^/ ]4 L$ K8 X" U# ^; _3 gHRESULT ComInit(). w7 ~6 h. V1 R" `4 P
{' K! [" M. n9 b1 @, e: B
        HRESULT hr = S_OK;
& t: ^5 ~2 U; J  }0 U        if FAILED(CoInitialize(NULL)); e6 U9 w3 \9 m+ J
        {# }" S7 R; _8 t* {" O' W
                CoUninitialize();& F2 I2 h/ N* V2 p# a
                hr = E_UNEXPECTED;
- d+ Q8 w% N8 ]1 q) g( B) I        }0 y& v/ n& n" O. C0 {( V
        return hr;
& {3 i7 _4 v+ C+ ~2 u' q1 c- k}
+ E; i+ V6 N3 T8 I
3 k/ f4 e# C4 G7 U- l3 a7 [1 F
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))) L- |3 |2 }# v' V& V$ A

% D: R" C5 {) G3 Q! p
3 L" A0 `8 ]! @/ ~" |1 M
* R" K' }0 p4 ]& M0 f* Ustatic int report_error( char *file, int line, char *call, int irc)
/ i6 ]" T" r' `( x% R0 f. l{) H3 d( |; w( V- g# W9 G$ ^
    if (irc)" g  h1 z7 z" h/ [8 d  D
    {
" A( \+ r/ B+ D, \        char err[133],
0 M2 q8 \- Q3 ]: o- q$ @/ z9 |             msg[133];
7 u8 A9 I2 o3 g; `
3 U& T! k6 [# \& X) X, h  c; j* J        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
/ O. E3 D6 u  L. G; q            irc, line, file);( E) E# U4 h4 r
        UF_get_fail_message(irc, err);' X3 S; X8 j1 F$ _" H

+ A5 n6 j- o# A. k- l/ \        UF_print_syslog(msg, FALSE);
4 ?% C  ], m: n        UF_print_syslog(err, FALSE);
  T2 Q' `/ ]* |7 L3 ?# N0 N6 x  C        UF_print_syslog("\n", FALSE);
  G4 _$ n" A" r  e        UF_print_syslog(call, FALSE);
9 S2 W( S* S: m7 g  C. E        UF_print_syslog(";\n", FALSE);
$ i2 H0 D7 [8 T- z1 E6 p7 J2 }1 \+ R. K" t" B3 h, l7 X
        if (!UF_UI_open_listing_window())
, o: H) h/ @3 H& J5 [4 U        {
3 E* [! v9 c$ P# ?' x. R' v: i            UF_UI_write_listing_window(msg);
) T+ h% i- y+ U3 n; F; X( o            UF_UI_write_listing_window(err);
% k: I4 s( O% O            UF_UI_write_listing_window("\n");& N$ G7 d2 N5 M" p7 d
            UF_UI_write_listing_window(call);
& t% H* J% j, a$ A3 _. F            UF_UI_write_listing_window(";\n");
- y8 `* o# a/ f& h8 h7 t$ S0 r        }
( B# I% h( W- D( H; I1 {, q    }2 e: E& T5 m+ |( v& ]4 a

( ~7 J1 k8 ]& L' R5 _    return(irc);
5 w  `* h  f1 f# i/ f}
! H1 U  x, }4 ?9 {9 u/ Q
  ]. d) \# ]3 a5 p- z
6 M/ b$ c, }+ u/ D* O7 h3 a/*****************************************************************************
" V' @" H8 c. H5 ^) c$ N**  Activation Methods& |; \  s6 S9 y; N  ~
*****************************************************************************/" [6 a, `; H- ]+ I1 T
/*  Unigraphics Startup6 F' @3 L" z  k& m5 a( Y
**      This entry point activates the application at Unigraphics startup */
/ a+ Z9 t$ _% m" y* _extern DllExport void ufsta( char *param, int *returnCode, int rlen )2 g1 Y# H. E0 d: w8 S5 M3 {* s' V
{3 g3 \& t; {0 D
    /* Initialize the API environment */
- ?. }5 Q: h/ U) `6 D    if( UF_CALL(UF_initialize()) ) / v$ Z. g. w0 A+ D
    {  {3 S# }3 [5 x& i7 l2 `
        /* Failed to initialize */
& R& l6 J9 ]$ z: ^        return;
: p0 V! X% L" B5 K3 o/ a2 F; X/ j    }
' Z. U' S3 O* P* g& P" @( D" h+ B- B
    /* TODO: Add your application code here */
" Q. a  a* g8 o: I' l4 [, ~
/ o, r0 ], q) d: }+ Y9 [. @/ H2 f% E7 `" h

5 x# b( J/ l1 w9 F  y, V9 W9 a        char b[132]="";
: `/ B1 [! a4 M  u/ n3 w1 n        mmm(b);2 w3 m+ F' v9 v$ G2 c! v! W( Q) \9 A
        uc1601(b, 1);   //在UG弹出显示框( S9 P' F. Q! j. n0 M% l. G9 Z" d

) R2 M( t7 \  b9 r7 p  W
+ N+ u. G; m' g8 b' F    /* Terminate the API environment */, I) `, E# w' j" ^$ G/ L
    UF_CALL(UF_terminate());
5 U1 T* j" t. D6 \4 o( R}& v# h* O$ x. {; a6 U/ \2 ^

  K  l& \( w. P* ?* y: |/*****************************************************************************
4 b1 b& {9 T( z# d& h$ \/ s8 j( p**  Utilities
. _" f( I, Z7 |( V# v$ l9 x*****************************************************************************/
+ r9 U9 {; D6 E
/ d5 s4 `' Z6 }6 J1 c" g" y- ]/ Z/* Unload Handler
2 i6 {7 q# J) f5 M- O& j$ q7 Q**     This function specifies when to unload your application from Unigraphics.
4 {- [( q: m- N2 r+ ]**     If your application registers a callback (from a MenuScript item or a( ^2 a7 G5 B3 |+ e4 R( |
**     User Defined Object for example), this function MUST return& j' b0 b3 t1 q5 x# g, v, T6 f
**     "UF_UNLOAD_UG_TERMINATE". */8 E2 a* o& r3 h& ~, A3 d
extern int ufusr_ask_unload( void )
! b0 i' W" a- j# Y{- _/ L& i% B: m
    return (UF_UNLOAD_IMMEDIATELY);: Z& N, t. h4 W# O( S6 E7 d
}
( z( x% c5 o( l% }' w; b7 s
" o$ _! |' Y5 N8 F* i" f, i: K. d9 B4 M+ D. w5 w
. O" W2 P+ F0 K$ e4 q6 m
& j, F9 U" n' ^3 B+ ~1 x9 _

! E: I! t- G. N$ [4 k5 ?* R2 S# E9 }; R, w( m8 p" q
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了