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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件+ r3 U  e" @6 L: L

! c% b4 c+ f+ W5 k5 `★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
5 E- S' j$ P6 f3 m2 ^
/ ^0 y9 @% `% y% l) `" Svb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册1 s6 Z! ?" W) l8 v* P1 K: Y* T* ~

" V. i/ A* e  i6 P$ U=============================================================================
+ M1 e, J. w/ H4 ~- G9 T在VC中调用VB编写的COM组件
3 Y# L, p. n7 t8 y) q! {0 k, C
: \1 ?0 t. m$ I% z+ \梅雷 - QQ1821117007 7 J! a& b9 S! N# \0 }7 v2 M& y) Q
亲测 XP、win7(32/64位)可用
$ \9 C. O7 }* D3 s- a" r8 c( a- F2 a; j& c6 B, _
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
$ g3 i; ]/ Y* B2 {+ u* A为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 1 \7 ~7 l# d( {' q! k# J" l1 Y
先说说VB开发一个COM组件。
# Z! B% ^( K2 z- z用VB新建一个ActiveX DLL 工程,
) @! u( R* K1 K2 I) j$ {8 @然后修改工程名称为 MyVB ' C" c2 X  M) n7 l1 \6 ^& n) M: W" ?
再修改默认的类名为 DEMO * T2 {, n( E9 G8 z. b3 F2 k2 v
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
8 K. t  ]# D/ o" _* b
3 d. J2 C) j( q( l注意!工程名不能为中文不然在c++中会出现无法识别的字符串
2 z1 Z+ C0 U# J7 g& F! k& A, W8 Y; i) p1 k5 i
$ H, U* l) ^% o( _

- ^8 j# V5 Z( W5 bDim str(999) As String# c- r3 v6 @+ _# U1 \

9 B6 Z# t% [4 i" c- |: Y$ K+ N# j7 kPublic Sub GetMeiLei0() '无参数传递# x! ]( W6 B! n" F' C" u. r$ ^
MsgBox "梅雷qq1821117007"8 M8 x6 }( }3 g# a
End Sub
  B. N4 L8 p1 q0 V+ U
6 Z2 o: \, v# h
, ]5 r8 Y5 ]- Z'带参数传递   Public Function  d0 R  F4 y9 [
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
" {# H( S) J! B, O+ Hstr(n) = str1# y$ N* z& U& G( |% ]4 ^- u

- h  g+ Y; L  D, V3 l, jIf n = 5 Then
- N+ Z, l1 ~9 C- o7 t* b* c, L( gMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)& k+ p& s' m) m% E% ~, O2 o+ N
End If
3 b- X; F+ B$ t; s1 e8 x. g! k5 K: n, E9 d  f6 X# g! j/ \: n
GetMeiLei2 = "数组传递0") A3 u0 E, T( h8 C  a
$ @( ]3 {& v$ ^% K( n& Q
End Function
9 L' Z9 M6 ?5 L: y# s/ T1 [8 u8 q+ ?" W/ E% X2 M

/ `2 \9 E  h% z+ W& {4 j/ b* ^/ X然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
( b( L. J0 n$ C5 Y9 K! S1 j- K5 R+ l; }: e8 s7 t& F* v
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 7 k. ^# K/ ?2 X$ i' C$ H! Q& A& M
, D: [. z' A" k9 k( h1 A
( l. N2 d: C& Q& m
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, , w$ _6 c( r6 I5 P6 d' W
而 VC 里调用可以这样做,如:
4 A! L' i) t. W. W4 ?. XVisual C++ Code
0 M+ E% |) C% \. {8 T1 d- w& w( t* Z: V9 u; N
//新建一个 UF程序,输入以下代码
' U8 |4 W( N" u/ C9 \/*****************************************************************************
, W7 O, A& f6 v) |& v1 C**# P, W/ N1 h1 q, d
** C++调vb.cpp0 r: L; y6 Z  x3 J' j
**5 [1 L5 N3 L$ Q* X; m( k" V/ G
** Description:! i! y$ a+ W+ t; S
**     Contains Unigraphics entry points for the application.% y# E/ ^0 U7 k
**
, D1 r# k! I0 v1 q& V*****************************************************************************/
/ H. u" n4 k. H/ F# k8 N9 F
: ]# z8 m% @" k. S$ L/* Include files */
4 [; Q  F& `7 q( R% u% W9 G#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
! Y8 |& ~4 p$ `8 `' z9 S3 T- ?  T) p#   include <strstream>1 }& [# x0 |! a% @0 W
#   include <iostream>
- F+ Q- x2 E' z* @% M    using std:strstream;/ A' i; b- r7 }  N# ]
    using std::endl;   
8 ~* A1 }$ x( r3 c* B" q    using std::ends;8 i& Z! C( O) o! R7 B
    using std::cerr;9 _- r1 G: K7 @! v
#else7 l0 d- [1 j6 }! f; m3 R
#   include <strstream.h>% u5 T! y9 X9 T. I/ H+ a' e& P: O& g5 V
#   include <iostream.h>
( |( j6 f; M3 w. X, x#endif
1 L8 e% h( h& e8 W4 W1 ~#include <uf.h>
; J! J8 k+ ]0 P3 w  S9 [#include <uf_ui.h>
! O$ Y+ `5 L6 g0 z+ U) G9 ^#include <uf_exit.h>
$ w9 b2 P4 O+ i$ M#include <Windows.h>+ C7 ?# q( m3 k. H" y9 t

8 ]7 O$ w, S# S, ?#include <string>
1 W0 H- m! I, g5 A2 r#import "C:\MyVB.dll" no_namespace0 u; S$ l2 c1 e; k$ M
//using namespace MyVB;    //这里是COM组件名称) u$ p7 r  ~$ o

+ h& {* ]8 G' j" c9 K2 s0 C3 f; b1 U+ s7 Y3 E
HRESULT ComInit();, L8 X2 @0 @& L3 h
int mmm(char* str)$ x2 t& [+ B: h5 @
{9 s$ W8 K& L' Q8 e8 v" h
        ComInit();* B0 E% q% r- h2 i5 y; _1 x
7 ^% }2 }# @( @4 f& N4 O; e
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
: m. _, o! N! {. \* I% p( ]: C        MyObj.CreateInstance("MyVB.DEMO");
# w0 K4 D% F4 L8 W0 C! R+ @3 l# f- ^/ _9 [2 M# i3 [4 v  }! Z
        //MyObj->GetMeiLei0();//无参数调vb函数
1 e( h) v: i, u0 M9 m
* \& T; e' t% G9 o; tchar str1[132]="0.0";' |0 S' K  ]  z! }7 r* L

" E7 C2 N8 k5 u, k" Y9 {/ ]: M5 H% Pint n=5;
0 o6 s8 Y; i" }! ?  ]1 L- |" G8 E3 b: n% K
_bstr_t vRsinfo1;
, z1 q0 v/ Q5 z( Q1 e" X  i. n6 c) G2 ^9 u
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
3 @* O  v# h! R
$ F! r, _6 {( g/ y& o; ]strcpy(str, vRsinfo1); //字符串赋值
  f" \  r( r! U, ~1 O0 m/ h) u! d6 k+ S) w% }
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
) R7 O% \1 e7 D1 N; A; FvRsinfo1=MyObj->GetMeiLei2("qq",1);
: m% |0 B/ H" vvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
; ~0 x5 `0 M, a# Z3 |- \9 Y8 ZvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);" p& v3 d( Z+ e
vRsinfo1=MyObj->GetMeiLei2("手机",4);5 h  K( S( H/ a9 P( `/ ~
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
1 N) z7 z4 w3 C        return 0;5 j" O" k' ~9 w# r  G
}/ I: \! E9 V7 J4 U/ Q9 e" N

% {: A  m5 t+ Q, x* H  B: yHRESULT ComInit(), r4 z- R& N( }$ I5 T" O( s1 y
{/ i$ E8 R( q$ r! Y; H
        HRESULT hr = S_OK;
# t7 D5 X# D' c  j# }3 W        if FAILED(CoInitialize(NULL))& z  Y! @( e3 k
        {
0 [# ?- z- N3 c7 \( K, {" I  o                CoUninitialize();! x0 C! j2 t% o  I# M2 M) w  ~
                hr = E_UNEXPECTED;
' Z( w% Z2 n& a2 ~  W$ P        }/ X) Y" X( X' w) Y  e: ~5 t
        return hr;
% L# t# p9 F( H9 W+ M. g( ?4 w) z0 T}' w* b/ @1 [1 D$ `
/ x: R4 w$ \0 w# s4 `

5 `: Z$ O, e$ i$ p0 e#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))( E& U3 r( J5 g- U: J

6 }2 C4 R0 l/ O- V. |. R
& X3 f+ L- T' o' M2 D; Q$ h) I- m7 M# h+ M
static int report_error( char *file, int line, char *call, int irc)
; m- f$ Z& x9 ]/ B7 S, f{; p2 `2 ?# p7 W
    if (irc)
6 B. ^$ [; u' e: f6 U    {0 X4 E( A! h( C
        char err[133],
: `" E& ]0 W* C  Q% p  |, n8 X             msg[133];
4 X; X4 m+ I1 ~7 |: [' d& r0 g6 I; y) t' d8 s4 P/ D% R% D
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",* B. d2 ?  l' U  V  Z& P4 X
            irc, line, file);. ~0 b- j( X% q, ]+ H, r, c  S3 d
        UF_get_fail_message(irc, err);$ F/ w% ]; @( I" G2 A

' e% _- j/ M1 d8 D! S( t; Y+ S        UF_print_syslog(msg, FALSE);5 O! i& b# h* @3 f
        UF_print_syslog(err, FALSE);
1 X: e5 m3 u$ d; l3 R        UF_print_syslog("\n", FALSE);" Q/ J# y3 T4 i3 Q
        UF_print_syslog(call, FALSE);$ b# l/ w' d( Z4 P' _
        UF_print_syslog(";\n", FALSE);
2 w& f5 C  f% C0 m' v' l: C! f0 [$ c* @  n
        if (!UF_UI_open_listing_window())
/ G9 A; L# R' ^+ i' [        {; J2 }, N& l- ?4 g0 B! M5 B$ Y
            UF_UI_write_listing_window(msg);
4 A8 U. `% W2 z8 F/ g* q            UF_UI_write_listing_window(err);
: \: v7 A9 ]! R0 @# b: Y            UF_UI_write_listing_window("\n");
" T9 R) I* e' N* V            UF_UI_write_listing_window(call);
1 Z, h4 U. K/ E+ o' K            UF_UI_write_listing_window(";\n");( ^7 P5 X' }4 P. j7 {
        }
+ |$ ^6 Y% m; H3 J; f2 W1 P    }
# [/ U: j: o  Y: i# S! A$ i+ Z& g* Y- ~, H& j: B9 ~8 }  b
    return(irc);+ K4 _  @: Y* c! n2 y4 _6 D
}
, ~' n  D9 y% n
5 K' H5 L: r3 W4 b6 Z, w! r$ v, B0 P8 P6 W
/*****************************************************************************
7 A9 ]4 k1 B9 C  _: ~% G**  Activation Methods
' f" T0 w: h3 ?0 c6 k- L. ?) ~/ b*****************************************************************************/
0 h' t- i+ P1 ]4 [. A; v/*  Unigraphics Startup
( V/ p) O7 d7 A1 K- x, p6 D**      This entry point activates the application at Unigraphics startup */- y! _& q; k$ C- w! Z
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
6 e8 M  q4 C% H+ C# m% E  I' }{2 _- e+ w% A: p" S+ @: p
    /* Initialize the API environment */
6 ~9 ^; v% N0 S) p    if( UF_CALL(UF_initialize()) ) 9 |0 A( k) p% V, J" I! u
    {
2 H$ F7 e# [* l, G; w        /* Failed to initialize */) D3 O4 F; Z  `) s+ k
        return;
* Y1 x/ M. c6 P. H/ D$ O/ F' D6 _    }
; d- r- g2 _/ R1 ?% U1 E% M  t2 F( W( _: |
    /* TODO: Add your application code here */
- d; F4 c) g+ ]  Q8 Q* |: j4 C+ @- r
4 D" F) f" |) A: g6 ]. v7 t, k
) [/ P# ?& I1 r+ Y; H2 c1 D8 u- ~/ o. P- l, d( ]; x# q& }" m
        char b[132]="";" p- d, m6 X1 `. g
        mmm(b);- i3 N% h+ ~2 {2 x" V% g$ W
        uc1601(b, 1);   //在UG弹出显示框
* L& T' w- M% i- J% F0 q
$ x, |" h* i& V2 X6 h
( l+ i5 u! c8 @( J' I/ b2 P9 c    /* Terminate the API environment */- E9 N" f  j* @& u/ ~" l
    UF_CALL(UF_terminate());) {, p6 a. T6 p0 ~" K
}
* E3 t# R; a: E- ?
8 w- C+ t1 o3 h$ A: H3 l0 r* X' D/*****************************************************************************: [6 {3 D5 n7 s+ f
**  Utilities. D5 s9 U* A+ a- j2 e
*****************************************************************************/
  p5 r4 a  a1 F2 M8 W7 Q
9 o! v% V# p& f% ?' a6 a/* Unload Handler5 \! M0 Z4 Q' E
**     This function specifies when to unload your application from Unigraphics.
7 U. W) z- o9 t" m# }**     If your application registers a callback (from a MenuScript item or a: `2 F" a6 K4 [/ A, [% Z
**     User Defined Object for example), this function MUST return7 m" R8 j" ~6 y6 u
**     "UF_UNLOAD_UG_TERMINATE". */6 R3 S0 ~' m8 H
extern int ufusr_ask_unload( void )
$ J% z) y2 r$ b{
% ^, m* ?0 E) u    return (UF_UNLOAD_IMMEDIATELY);/ g. B% w6 O, S$ E' V, V
}
$ m. \( n4 D1 v0 b5 j
7 z+ _/ o* {' S+ o7 Y  ]% m  |8 U3 g* O- M, z  \; G
8 k. _/ [' l" G/ M) o$ r# k8 m6 B

/ I- s6 v$ R1 B( R- V" R9 R' G7 o1 a
+ U/ z( n4 p# U) z/ F" C
5 s8 q0 K. Y8 o# a) B
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了