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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件0 p% H8 L- W$ c& W. n: q

% J7 k4 c6 t8 g. Q★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用, [  n& U3 p. D

: n) B( H+ m% l5 Pvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
# |- T; Q7 J2 T& m
8 Q: @; s: E  L% P9 C& L: s2 e=============================================================================
, D! K! C" w# m7 Q5 }9 G在VC中调用VB编写的COM组件1 z6 x$ }- S, S+ Z. L! t4 [
5 r4 S/ Z6 m; Y" l. w
梅雷 - QQ1821117007 5 n; u9 Y' h* R! v4 o3 X
亲测 XP、win7(32/64位)可用( W9 r2 A+ [, z- @6 ?; S. U
! W8 {4 F5 H; s) ^' w5 C- Z$ w
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。* Z! ~7 ~' ]6 k' J6 u
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 % i% V& _8 m/ q7 ^+ A1 V$ \
先说说VB开发一个COM组件。
" {) j1 x8 `; G. J: ^用VB新建一个ActiveX DLL 工程,
; k4 O: |% i' p6 C7 r) @9 F4 N然后修改工程名称为 MyVB : B, r9 O! e! ^. B8 {
再修改默认的类名为 DEMO / \7 p( [; [# Y5 @6 Z
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
% W5 M$ K# ^6 t3 \  D* c" j2 d
4 I6 W" R* c' R7 \注意!工程名不能为中文不然在c++中会出现无法识别的字符串
2 D3 Y% ?4 v- q& m) K" P
; h' B* V( L  x: d) D
2 N  i& |- [% F- l+ m* _& C! B; ]. V: X/ a8 q3 V/ F/ ]
Dim str(999) As String& o3 ?  S$ h: K& S& D1 O2 i; D3 h

. H) G6 W& j2 xPublic Sub GetMeiLei0() '无参数传递
) @5 s5 ]: O6 {: }0 {% P4 gMsgBox "梅雷qq1821117007"
+ m  r* [1 m2 k$ c  g$ DEnd Sub" |9 p5 H5 o0 W; u5 E
% m, p5 l8 {5 Z# E/ ]) }" p

8 `3 u( `" G% G) N/ Z7 C'带参数传递   Public Function0 H: ~% X9 _! \2 [8 M
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String* ^) Z2 d0 o0 P. W% P7 F& e; O
str(n) = str1" }0 a5 r# ~/ D1 D" F9 x
) `& p0 ]% t/ Q- N7 }
If n = 5 Then9 c8 E! K' r$ R6 k$ c# f3 a
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)3 H0 U3 x5 i( a# K+ e" e6 {
End If- R- @# g, D* P, ~
9 s  }- ^/ Z8 J% T6 ^2 y
GetMeiLei2 = "数组传递0"
6 q3 e; E' n4 d  r! j! N7 z/ q7 L  ~% m, `
End Function
0 ~  m* x: G* [
7 r$ U- q6 z# b, o: f+ s8 x$ R
. k" m; p( M; T- X" r9 u然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
4 ?$ z' K$ P% l
) v( Q  h% n* k, j, |, A! c% F3 S注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 , z' @7 ^- s: r8 j& U
2 l9 L0 o9 ?" f8 q9 Z. A

$ O7 _/ H- @# p, _  y" B* D+ Q其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, # W0 d$ w$ L7 G8 M0 N& n+ S" g
而 VC 里调用可以这样做,如: 3 M( r, J8 q1 _* \
Visual C++ Code . E  [" f4 r# h+ q

3 v0 p7 t* c; O# R- E2 t//新建一个 UF程序,输入以下代码
7 p) j+ J7 \% s" m/*****************************************************************************) N+ T' _7 C9 Y& _4 R! C
**  t) `4 R5 c. m# X
** C++调vb.cpp3 A$ @$ H6 l1 G- R) W9 C
**
" _$ r% Q* ]! Z' Z* o/ q** Description:
% ]! R; W5 r/ S, h**     Contains Unigraphics entry points for the application.
5 h& p- m& `3 o. R( E6 T! W, G# J" I**9 [- I( l1 h, W
*****************************************************************************/
1 w; ?% v1 f' A. s( E2 f, W# I$ }5 |, E: F, L. e; o! W: x  s' m  m- C
/* Include files */
7 h$ z3 a2 x; m, L! j+ l" X- k#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
# ?' L2 e  }1 Q( s8 m% d0 N; L#   include <strstream>
; E& U5 P+ i  N4 o8 ]" j) B9 a( u#   include <iostream>9 U' ]9 Q2 k. f
    using std:strstream;
( H/ E% s! E, k* H. w; S$ |1 }    using std::endl;    2 J; \: l' s) k6 t1 ~3 g
    using std::ends;! l% V: B9 ~" @. s" x2 Y+ q" z
    using std::cerr;
* Z# j  o* l! D* N* U7 f#else+ I7 V! b; x8 Y7 H; S: U
#   include <strstream.h>6 H5 d0 [2 c' k/ z9 C
#   include <iostream.h>
" S  R, c) S' K% m% W# H& r#endif
% v; J0 e5 o* O1 |+ ^#include <uf.h>
- \5 k( M  B/ u2 n7 r( k3 h0 G#include <uf_ui.h>
0 [) {7 g1 I3 `6 p) E#include <uf_exit.h># j5 m3 `& _# ^* N9 h- l% L# t7 a+ I
#include <Windows.h>
/ K9 n- ~! S5 I; }2 n7 n8 c
0 W; E1 l0 @. }+ `. f#include <string>
1 f) }/ {% i# l0 p+ M#import "C:\MyVB.dll" no_namespace
! [- w3 R6 E7 h; S' Q, k+ P//using namespace MyVB;    //这里是COM组件名称9 ~5 \$ P  L; z- @( r8 o* `" _" ]& `
+ L! `. l8 ~  O
* |5 _  `# b/ h' I) }0 V4 ?# O
HRESULT ComInit();
! J; Z& U9 k: Q) u* Qint mmm(char* str)3 n( Y- y2 @% |1 Z5 q+ ?8 T
{
" m& N1 n6 t9 F5 u& O8 B& Z% Q2 E# R        ComInit();
) P* e! D: n9 N( v4 P- H( L  \5 \5 T
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
7 w5 U+ Q/ V# i( q" n0 F3 ^        MyObj.CreateInstance("MyVB.DEMO");1 R* z/ B* M7 e4 X3 _

6 c( V. L0 x+ V' W! R5 k# r* e7 ^        //MyObj->GetMeiLei0();//无参数调vb函数
, c) d, Q; E( E2 n/ S5 n' T+ ^
8 i# }3 `; V3 Ichar str1[132]="0.0";9 |; t0 {" d4 e% P% `) H
$ ?8 [3 Z7 |) J- y+ q$ O# ?
int n=5;
9 S6 F, a! w  v7 W% U4 u9 e& e4 n4 Y# P# L9 y8 {0 M
_bstr_t vRsinfo1;" O" I8 ~& Q) [  X
! M2 [* H7 P: }. x% a5 C
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
9 J3 Y- c5 A  G- u' W! i7 G. z& q) d3 ?% V: P/ J( ~
strcpy(str, vRsinfo1); //字符串赋值& f8 `( p: f  K9 i! j
* J# t) B2 f" Z! ~4 v0 @
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
: j! F( [- D0 H: P9 T8 rvRsinfo1=MyObj->GetMeiLei2("qq",1);* u! Z0 k; P8 t6 ]( Q% X
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
! G" }" G2 `* {, Z. N/ O5 |, zvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);4 g( n' u4 X: `5 p2 c! Q7 P. q
vRsinfo1=MyObj->GetMeiLei2("手机",4);2 |6 l, L% ~+ F; v3 m  ]. ~
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);0 S" S5 _5 {/ P& C" `' J3 q% o
        return 0;
, S; g0 d2 P; ?" `0 g# B+ \}- e( B0 @% D0 m& T  w# u2 N

: `+ s$ X& o1 }) \- j' |HRESULT ComInit()
" E9 I2 j! i, U" a8 K' r{# s! ]' E" j% J0 m% C/ y* a  a
        HRESULT hr = S_OK;2 r  k6 r* F+ X7 W/ Z" L4 v
        if FAILED(CoInitialize(NULL))9 J2 G& z$ M  Q' T: Y! }
        {
5 K6 R; M$ A8 Y                CoUninitialize();9 Z6 j* C3 X( z2 v5 H& R7 ]+ L
                hr = E_UNEXPECTED;
7 h9 u) n! Q4 ?& G- y/ L        }: Q1 y% d7 {% G5 A! C5 x
        return hr;
% w; P$ l0 {; G; G8 W}  N# j# Y% G0 n, J3 K

  r9 F5 F' _& g  D6 ^  f( J
( \& l3 X# |' U# h6 ^#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))3 l$ z/ P5 c+ V; I6 J

7 @! P0 t7 @' Z3 X0 i
. N; j" t1 H. f) \% }% G' l/ p" B
static int report_error( char *file, int line, char *call, int irc); x& y# ?0 J' Y7 D
{" c0 m. x9 U5 Z- U. I; [5 ]
    if (irc)
- Y( @; A8 M: u+ s/ _0 x, }$ U    {
, k. L1 [: ~$ _+ x, o  R; b        char err[133],8 M6 l& M' G1 A" g% V, {
             msg[133];
8 Q! K+ ?" \% i; K) O! l' H1 \. k+ p6 [1 X* n3 k3 S
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",  `, _4 Y* t3 i, h3 K$ U
            irc, line, file);
* k* A, q# [0 H1 P& S; H* j3 o        UF_get_fail_message(irc, err);
( \5 w% {* F  O' f: x" o  N, {5 y6 _5 k9 t) U$ s  B
        UF_print_syslog(msg, FALSE);" o" `9 a* ?" \5 a5 B; a
        UF_print_syslog(err, FALSE);
7 D% m, E6 x9 s. m        UF_print_syslog("\n", FALSE);  D0 U" O: L1 H7 {% L' Q
        UF_print_syslog(call, FALSE);
( ~1 b( T' L* o  P  {. s        UF_print_syslog(";\n", FALSE);
! \+ K0 |2 G6 v& J" i, m7 M
6 ]; U, K- L- J* y! ~/ ]/ p        if (!UF_UI_open_listing_window())  V* P; E/ p- S, W6 [( n0 j/ ~+ y
        {! _: S% U3 J& k2 X* I
            UF_UI_write_listing_window(msg);4 m) @. K. c: r# Z. D0 Y. y
            UF_UI_write_listing_window(err);
$ L) J  L1 P: G) r* T            UF_UI_write_listing_window("\n");8 C  O5 k+ c! n, W
            UF_UI_write_listing_window(call);
& a& f* G2 a+ C2 Y, p            UF_UI_write_listing_window(";\n");# X2 G7 a, `$ _2 q7 F
        }
% Z9 w$ ?0 B; ]: X2 ?( \' c    }
$ h; ]' d0 \$ z
! \, n5 E# D4 p5 J; e    return(irc);
' e- a% L( L% ]( P8 V4 @( Y}9 _: a$ y% }) D

$ G1 A/ ~; X- c% }: j3 h0 Y4 Y9 f, z5 z! `3 S/ k, h
/*****************************************************************************
  q3 D- X0 j. x6 Y& c1 ?( w**  Activation Methods) k- J2 U' W. z( D- F: o9 v
*****************************************************************************/3 U2 X: t* ^  q: X% W
/*  Unigraphics Startup1 o$ z9 q+ ~+ H/ }
**      This entry point activates the application at Unigraphics startup */
7 E5 v; _; y7 P7 ^extern DllExport void ufsta( char *param, int *returnCode, int rlen )
& J0 h3 A1 s- Y8 c% ]{1 ^% _8 G% o; t# f1 }5 H6 `
    /* Initialize the API environment */
% C1 V0 Z% ^" [" V1 l/ ?    if( UF_CALL(UF_initialize()) ) 1 H' W& ^' [1 H4 H
    {# f6 M# J  H% f" ?
        /* Failed to initialize */" |$ w$ d/ q$ K* W, h
        return;; x! @* e" b2 I( r$ P& C; I& b
    }
+ P8 |, t$ X# W  Z: j* ~: }' t  L$ P- _, u/ X
    /* TODO: Add your application code here */
8 l& I; a9 b# p; K5 s" s) B1 f8 G4 _+ H) {8 p, N

: `4 o  I" S1 D) ^( i& Q
9 N& `& T  X2 C5 Y, J1 n: ^        char b[132]="";
/ x- n7 Q; L: O. F        mmm(b);; L8 }  {+ J# k$ }
        uc1601(b, 1);   //在UG弹出显示框: {6 P4 B8 C0 U* U! g; k, |
0 G0 M8 ~# d1 p. i- p
) T3 [4 a( b  K& h# v
    /* Terminate the API environment */; M4 l5 N+ L; y  W3 f
    UF_CALL(UF_terminate());
% f1 N5 G. B% M* x# U}3 M+ N. f& Q: z
6 M0 J9 `6 g  P6 ?% J+ J8 N- v# X, Z3 v
/*****************************************************************************. D0 g" o4 u* a/ U8 F
**  Utilities
- Z  |2 {4 L) \! J/ |, w+ d( F*****************************************************************************// j4 u: x! h/ f9 j5 F
% H2 I) [2 |' A
/* Unload Handler
+ ~5 p& K3 K5 ?  j- @+ E**     This function specifies when to unload your application from Unigraphics.
" Y7 ~& L, d% Z1 Q7 \( |: _**     If your application registers a callback (from a MenuScript item or a
! }: v5 V* }5 `/ |* X1 P: i) g**     User Defined Object for example), this function MUST return$ b8 h, i8 z7 D: L
**     "UF_UNLOAD_UG_TERMINATE". */
0 k7 z1 @  z; h2 A0 @extern int ufusr_ask_unload( void )
, Y2 }9 n& @- e& z% L0 R8 R; N$ a{# k& U; u8 P' q! }8 K
    return (UF_UNLOAD_IMMEDIATELY);$ E# S( ]7 P( X+ y" d# |8 [  J3 V$ \
}
0 U& ]9 M- ?/ ^* {# T& t7 j! w) F* w" v+ G2 B  V& I5 |9 u4 p/ i

/ w* ]! G% V. _. I! Z3 B1 X8 ^
% S) I1 g  J* ~) k1 r8 g+ t+ Y' s0 Z' ?$ \' M
1 q& U: h, j! M; q

0 O) B6 R8 L4 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二次开发专题模块培训报名开始啦

    我知道了