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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件9 z8 r. g% B# e5 q
2 j: E6 x3 w" S+ m
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
0 I; C$ o" P+ e* W% C6 ~
( i8 s" W( h; ^  y( {& d' f4 bvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
; M0 X% e% p" W9 @$ D% w- Q' ^/ }1 g! W8 S8 H
=============================================================================& }; S0 a4 G' `1 [) W
在VC中调用VB编写的COM组件, n" f6 }1 f) C. @
5 I9 F6 ^# i2 ~6 Z) w
梅雷 - QQ1821117007 & f' S$ W4 T7 N: ?1 G
亲测 XP、win7(32/64位)可用
2 S/ w* G) A& ]& z& V. @
, Z9 V! g( I9 ~/ D' wVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。1 c, {( W) n" K1 d5 {; [2 T6 K
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
7 Q8 D( W! e. P* l先说说VB开发一个COM组件。
, c! }. Y7 R. b3 _7 f3 I用VB新建一个ActiveX DLL 工程,
, G5 e8 @) q/ v: d/ X8 K9 x然后修改工程名称为 MyVB
5 q) q$ I  m2 B! X6 G再修改默认的类名为 DEMO # m' g+ y2 y0 q: z( P& u
然后再向类中添加一个函数作为测试用,如: Visual Basic Code+ b: r' M) }9 [; e% c
1 T6 w- K. H% q1 g' R+ O: e
注意!工程名不能为中文不然在c++中会出现无法识别的字符串" [3 h( O' X* w3 M
& X$ W# I0 {( h3 w) x

* y# N9 N4 h% d6 E, d* p( k2 T0 W# p6 }& W9 J" B
Dim str(999) As String, I" A5 j+ N: f& v

- X: K. |$ [) ?Public Sub GetMeiLei0() '无参数传递
7 x1 p2 @6 T/ W! BMsgBox "梅雷qq1821117007"7 f' K. M( U4 q, n; S" T5 o
End Sub+ T" K0 B! a$ ^
3 Y6 B6 L; T! [

2 c$ A& i) W( I1 V1 I' F# w, N'带参数传递   Public Function
% D  Z+ B; Z2 YPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String9 M' J8 s" K9 M6 J
str(n) = str14 q/ F& w- B  F+ |5 p$ ?

0 M' A9 |* y! z8 m$ xIf n = 5 Then) \9 W# \/ p5 s7 n( g
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
4 w5 g1 ]) y9 WEnd If+ ?; O$ k! B( T2 O% }5 [
9 V% p* H  e! B, U: C4 b- n
GetMeiLei2 = "数组传递0"
7 |7 B, M! N& ~5 \- C$ G
* S$ g) }& I  T5 M  s# a- s# TEnd Function/ R, {* S4 h& M" ]- T: ^
4 y" z! Z* {0 q/ Z' v& R$ S
2 q/ _3 v8 X, W& P8 ?
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 " g/ a' V5 U; w, w' T9 n
" @0 s; B( l3 k; U# ]
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 $ G- k8 Q2 P" d; o% @

2 R  ^1 n! x1 E9 _" U
* P% g" Q$ h/ `8 L其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 1 P6 g5 z5 S2 G/ a6 c. @
而 VC 里调用可以这样做,如: : r6 g# F# H$ `0 h7 g
Visual C++ Code
* M7 T8 k" q' `" U& r6 L2 k4 o: k$ y) t! J  W
//新建一个 UF程序,输入以下代码% v& S; b# }; a8 b5 y- ]$ g, w
/****************************************************************************** {% x3 e1 Q( E/ F: F3 t2 y2 d7 M
**3 M# M' G: O% Q9 ~4 F
** C++调vb.cpp
: E2 z$ e2 o. N* S, E( W% Z**. O$ {0 t  ?  W3 _+ ?  m) A+ e
** Description:$ Y) i; k/ \. w) F2 i
**     Contains Unigraphics entry points for the application.
8 b' ]; a' S5 I/ k# H; \. {**
4 K5 d! Y. w& [9 {*****************************************************************************/- [( U. ~# `" \1 j6 C. p! s* w/ [5 s% F

6 [" Y/ h; k- E8 f* C7 R9 I3 g! P/* Include files */
- k( m* p6 D0 ~3 ^#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )) c$ j  s: L2 j7 O: Z) Y( u4 K
#   include <strstream>
! S) K+ P5 }) A6 _5 b' q#   include <iostream>4 J2 |9 p# q4 h8 }  K- p& E
    using std:strstream;
' _9 N, E- f- F0 Q& s) U    using std::endl;   
" O  ^/ L- \( u1 r    using std::ends;( N( u2 `4 p& l) k0 h
    using std::cerr;
# e% p& Y7 u) T. a. Y& a: K#else4 R6 u5 t/ Y4 P$ ]( M* O( P0 u
#   include <strstream.h>
+ @; M2 @- d9 S+ f#   include <iostream.h>
" |9 O( b# h% H( N  u6 X( e#endif
- j; t4 r) U6 M7 Y! G" ]#include <uf.h>
: E. X' }2 g4 d#include <uf_ui.h>6 P1 m( E0 f+ C2 E
#include <uf_exit.h>& m: m5 X1 o( F% f
#include <Windows.h>
, D* o: @0 J) C3 T( _: q3 T" v0 X: p' q5 P6 r+ p: `: L) w+ C/ T
#include <string>
( ]* B0 q  l, H+ }#import "C:\MyVB.dll" no_namespace
+ F3 r1 k! {: a: E& }$ Y//using namespace MyVB;    //这里是COM组件名称3 t% I5 v: _/ [) V8 A4 l

$ Q3 T4 a  t) I1 Q3 S5 ~: ?3 y- v0 u6 Q9 I
HRESULT ComInit();: v8 e9 U2 @  e$ ~5 _% ?
int mmm(char* str)
6 @  n; F' M- J; ?+ a{
5 c- g" K- U' a2 y3 S/ |        ComInit();" ]2 [' x% a: R' F- V

+ O# F4 T* H# m1 E        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
4 _7 _- t/ Y+ G9 V: Z1 i        MyObj.CreateInstance("MyVB.DEMO");& p0 V6 [- w% J/ z3 Y
3 H! }3 }- P0 _5 Q/ R* \# o; b, p
        //MyObj->GetMeiLei0();//无参数调vb函数
5 x- f+ b% ?  @6 e
$ H. O. z! s. [& m: D) }/ e! I. r$ [char str1[132]="0.0";8 a9 u( H4 c3 l8 ~9 V/ }" ?0 H. |

4 P$ J9 D; L/ s4 d' Mint n=5; : s4 ~2 A1 G, }! q; V/ o/ [
, @5 z% w" g* Y# _$ {
_bstr_t vRsinfo1;
# ^1 C7 {! L. V1 J. c* Z& i; W& b( o! k/ S% c
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
  p& h1 V$ T$ L, X! f# u
9 {0 ?* W2 Q! O9 C( b. l5 h8 sstrcpy(str, vRsinfo1); //字符串赋值3 B: M6 }; w, b+ m
  e! @/ o% c! _
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);# G0 i5 Q# H* c9 P) c  G
vRsinfo1=MyObj->GetMeiLei2("qq",1);1 U0 X, K4 Z$ C/ o& ?9 ~% x
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);; h; g% _5 i( [
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
* _' F* u: V; D& o' Z9 o% bvRsinfo1=MyObj->GetMeiLei2("手机",4);
' |( U" V9 E8 N$ dvRsinfo1=MyObj->GetMeiLei2("15757753770",5);( A& O& }+ q0 s3 ?. z+ J
        return 0;. Z& h% Q8 u+ U' z
}
* a0 ?$ n) g6 l9 ~. _% X& O2 E
& C  b3 E6 A9 l( ?$ `HRESULT ComInit()2 M# J" @; T. g5 C6 w( ?& F
{2 r) Y4 a( N' }3 W
        HRESULT hr = S_OK;) I) z5 h' w3 G# _6 e( _1 @
        if FAILED(CoInitialize(NULL))
9 W  H  ]' e. ?! F! O        {
. x8 o6 M" t3 _3 y0 A                CoUninitialize();
7 ~. p' g- z, M; K  U                hr = E_UNEXPECTED;
; T/ S8 c0 {' A6 e. M* V2 A        }
- m4 k/ }2 u" l0 V/ g% ~6 i' E; X        return hr;$ x- `+ @: S; F
}
2 l1 l* b9 B* i; L5 x" J( R; Z# ]4 |

3 S# O3 }: u" c  S#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
9 G3 E7 W) b( s; G+ ?6 z
& U  ]  _) D0 \  |0 @! W& U& Z% Y: ^8 g  f
; r+ {2 A1 W  S5 I. D
static int report_error( char *file, int line, char *call, int irc)
, Q8 i+ U3 k2 o! z& w{
2 W" r3 O& w# R* N5 t    if (irc)2 Q9 K$ Y- M; C3 T+ y
    {( x3 N& o0 A. C- C% O- M
        char err[133],2 }3 @, w( B" _0 O8 t4 B2 `
             msg[133];4 c1 m* f8 ]! q

# G; ^6 M6 ?, {4 g* E% E: Q" c        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",# i) |' E4 E1 s" R6 V
            irc, line, file);
) w1 y/ V5 o; d. b6 I" W) W3 S        UF_get_fail_message(irc, err);6 Z# L/ Q& ]! L* s

% O3 }3 Q7 H2 Q1 H$ U        UF_print_syslog(msg, FALSE);
9 k* P3 k/ `+ s. P7 e        UF_print_syslog(err, FALSE);
$ g7 Z9 y* `1 Q* E, X        UF_print_syslog("\n", FALSE);0 T5 j2 L) c% }6 F" D4 ?
        UF_print_syslog(call, FALSE);7 \' w" M8 M8 I8 u$ Q; A3 @% @
        UF_print_syslog(";\n", FALSE);' G  w/ J; R: j/ W: p
& @+ G7 p+ t5 h' @4 ~' S
        if (!UF_UI_open_listing_window())
1 y7 w0 z0 w, Q* C$ n) F5 q        {
% t8 n6 C9 x% P3 Q0 p1 U8 _            UF_UI_write_listing_window(msg);
2 o  X' t5 b* T5 b; _% ?            UF_UI_write_listing_window(err);
% ?) ~1 l# ]2 c4 x* z) i            UF_UI_write_listing_window("\n");' J# ?$ I8 _$ y8 _/ b& ^
            UF_UI_write_listing_window(call);
1 c! Q& _5 C' W! H9 ~            UF_UI_write_listing_window(";\n");  H$ k; m1 e$ Q! ~4 _* h6 H
        }
1 N7 |' q/ z& {* F    }; o! \# o5 D" r( {

+ T7 ?' [& o; @5 g    return(irc);
6 R, _0 e: u% e  A' r- Z}' ], Y& L! f  a+ J2 E* ?: z) `
6 U8 ^  b# p4 V7 k8 `1 Q
4 o% N- e$ u4 m: P4 ~3 o
/*****************************************************************************
  v( p+ D4 i9 {3 M2 f1 }5 }& Y**  Activation Methods
6 w2 }: T: z: u* _: L$ l*****************************************************************************/
( y$ `1 z+ N2 S6 E" D  y% b/*  Unigraphics Startup
4 T6 f4 _0 E- k**      This entry point activates the application at Unigraphics startup */
, Q0 p& |7 t* [extern DllExport void ufsta( char *param, int *returnCode, int rlen )
( O. h: m7 t( G6 [5 Q{
6 f3 z! r- W7 R" R, q    /* Initialize the API environment */0 @* R8 i/ O# J% t7 I
    if( UF_CALL(UF_initialize()) ) & g0 q8 E7 i- K2 m: H
    {7 L# W/ Z* z2 S
        /* Failed to initialize */2 c, a: G+ @$ V( b
        return;
! z9 O; V* s* T2 G4 I    }
: @% v/ B# @7 q9 D: m. [4 @* P4 M, t2 S+ @: P1 V
    /* TODO: Add your application code here */, t( U3 v# Z6 Q3 m4 ~( _; C9 ]# Y
! D' D+ d" z* Y) D& N

  U, r. N! s) O3 [  @2 \% c% A  s# a0 K) ~7 s% R
        char b[132]="";0 A+ l' I5 c% \
        mmm(b);9 S! o: }% v1 M- A/ J+ Y
        uc1601(b, 1);   //在UG弹出显示框
  c) D! h; q% S6 m: k+ K) x# y6 ?5 e: [
, ?3 J2 }* ^6 m0 E+ s0 U$ \9 e1 e  f3 h
    /* Terminate the API environment *// }/ D8 P3 r% M& F( L, _7 R
    UF_CALL(UF_terminate());
7 A. F' A( H$ v: |}
1 t; _% v+ i+ Q5 O: P, @& V
' O# D( L2 N7 b9 u: y9 z! `/*****************************************************************************- P# S1 a( j5 Q/ a4 R4 R2 e" F
**  Utilities( |7 X+ ^% n( N1 u0 C4 a$ A* C
*****************************************************************************/( L- Z2 z2 {5 G, E4 o% R5 r' f

; ^: h/ z  r1 O, C, O/* Unload Handler* m3 r: z2 z8 d+ ]. k2 T! V- ^
**     This function specifies when to unload your application from Unigraphics.
0 ?! \7 D! x; t# o7 A% y**     If your application registers a callback (from a MenuScript item or a* G" N1 d! H% O& k4 _
**     User Defined Object for example), this function MUST return
1 D, o. S: H  o**     "UF_UNLOAD_UG_TERMINATE". */
6 Y  ]1 q/ @) k8 \+ p2 U4 |* Zextern int ufusr_ask_unload( void )! _, C' h3 `: J% D3 p/ Q
{3 `8 q9 I2 f4 u0 q9 f6 Y0 k
    return (UF_UNLOAD_IMMEDIATELY);" ]" t0 J2 W9 d4 d7 C8 B
}
0 i' M' T/ ^( Y4 G5 d  }- p/ G7 E1 j

: `1 r; k' ^0 u6 h9 G/ x+ e; u3 d+ ~7 Y# q  C4 _" z' U
5 _4 N8 _/ O0 ]6 p7 Y

" V0 B+ |3 s4 l3 e" P5 u* W( z+ f" W9 M! N+ |' |' U
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了