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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
( u8 }$ r5 E9 F5 f" w
# W6 O. P& r( ]★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用4 d" s2 B: {) H4 F! i

; q) D* K0 K; _vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
- }2 h; i6 `2 [6 f9 H
% n& S. f0 }$ \! m=============================================================================. @# |* d1 Z0 m: _; s
在VC中调用VB编写的COM组件
) X. o% |/ }6 [+ P+ a
) B9 ?2 z) _* ^5 X梅雷 - QQ1821117007
9 p* U* ^4 s) r亲测 XP、win7(32/64位)可用
0 e6 R0 E: Q0 G' y2 |
3 c  G8 F) u8 I" E* r9 s( aVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
+ N; k8 J( L3 `; j为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
( _* F  w* C; F, |' t! L! p5 H$ I先说说VB开发一个COM组件。 6 Y) y( |& {6 U* K( v% s
用VB新建一个ActiveX DLL 工程, ( }% v% t1 e/ Z  B+ ]( \' f( f
然后修改工程名称为 MyVB
; R( e( b/ j. P7 |- h* Y& b+ v. r再修改默认的类名为 DEMO
& [5 G* I# s  O- i4 A; h. O然后再向类中添加一个函数作为测试用,如: Visual Basic Code6 H4 j5 \6 t& o! t, Y  k, e: }
9 Q+ v, y! |7 x! {% N2 y
注意!工程名不能为中文不然在c++中会出现无法识别的字符串  m) }* B3 b. X" Z9 a) _
4 X, n( |5 x8 Q# f0 o2 g
$ m* S, i6 H3 }+ ^

$ z: S  c" K6 K% B0 c4 U, R0 JDim str(999) As String
0 Z. T. d  P1 ^& o
0 U8 n* `9 P6 Y( qPublic Sub GetMeiLei0() '无参数传递
; E- [* M8 E: D( [: W* D0 v( _0 m" dMsgBox "梅雷qq1821117007". ?6 s+ I6 t3 U* p5 J! N7 _
End Sub! i  ?/ m" h/ s. Q) X

1 a( X6 L) T- x$ _) Q  V
* ?% X; B8 t# z'带参数传递   Public Function( w7 J6 {/ q+ t4 F8 S
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String3 N4 ^: C( `( h2 ]/ E5 V+ u
str(n) = str1# p  j) q6 `. `$ t* r7 @9 l6 e

$ ?" x5 g; K: V, S2 O5 O( aIf n = 5 Then
* C, Y6 s# s# VMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
2 `4 P- ?# j7 \) L+ `End If, a' ^$ w. `# V% l+ o) |. M' G
1 x$ |+ F) m( z) a
GetMeiLei2 = "数组传递0"; Z# a8 m- ~. K! q% q- }% }* K# Q

0 @3 i  n5 ^8 F) A) y6 t( yEnd Function+ \. b" i& C6 U/ ?; U4 q
, t& E. G. n  l$ c# O% Y
  U. Q( ^& D; V& T6 _: C, s
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
6 n7 Y5 Q8 N) b$ q: h" z5 t9 Z. \3 {% a& y3 Y. U& T
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
3 a' S, v' Y' W# E7 u3 o0 `1 P0 o/ h% Q7 l" t9 m7 ^

  Z$ A5 y( u2 P  J4 S( F9 Q其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
7 J* ~. o; K+ A$ ?% G4 ^而 VC 里调用可以这样做,如: 8 R# F! k7 S( s. [' \" n2 T3 J) W
Visual C++ Code ) f1 `* S8 l5 Q" ]( E4 o

- g4 y5 h! m" L! t' R//新建一个 UF程序,输入以下代码5 C) C3 {! @. ?
/*****************************************************************************
3 l6 X) ~9 D; i& s% h: @: y**0 B0 P0 b2 T( E
** C++调vb.cpp  F$ Y$ ]6 j1 ]" n* z
**
' m5 s+ f1 {. B/ ?; g** Description:
' {' c/ H, `- N' h( Q5 {* ^**     Contains Unigraphics entry points for the application./ A# d' Y: {1 V+ M0 y, M  E) P
**0 P( [% A5 C2 a
*****************************************************************************/1 [0 Z& b% H# a; ^2 Y8 ?
) j9 Q" W0 j  j. Y: Q3 ]
/* Include files */* b/ @3 B$ z7 \# _4 i# v" D
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )/ ?% W" H) f8 W! g
#   include <strstream>7 A# ^" d  b# u* S( e* c
#   include <iostream>- \1 ~$ ?# _) t% c8 n! e
    using std:strstream;3 N5 ]% O' U/ ^
    using std::endl;    1 X% m# p6 k* h0 Z1 j
    using std::ends;. n4 n2 w4 P9 F
    using std::cerr;
9 B3 ?- j3 k4 Z" `% G: {8 G#else; z0 v; r0 e) N  i0 |/ E6 O$ u, |
#   include <strstream.h>
' t1 |# M: L4 @; l( B7 y  u#   include <iostream.h>
$ u5 U# L% q" L3 `#endif& W; S- i4 w* S1 O# K
#include <uf.h>  k# B( s4 Z" P% k! g# O* x
#include <uf_ui.h>6 v5 N) I9 \+ g: ~# U: P
#include <uf_exit.h>
* Y: z. t$ Y  @. D# j8 D& i#include <Windows.h>
" }( }+ ~5 _: L* v3 p( C
7 O% G* P4 D6 K0 p#include <string>* P) q1 H- q" b, g
#import "C:\MyVB.dll" no_namespace5 v) _" w1 Q; l
//using namespace MyVB;    //这里是COM组件名称
/ P. n# F7 a- Q- q2 {# v* R! e0 }: t1 _. v# l; k  u
# ]1 s" v* Y  F5 t
HRESULT ComInit();
# o& L8 t# X% k/ Z' fint mmm(char* str)/ k+ w! o' g, X; [+ l
{
4 l$ Y- W7 R: G9 P        ComInit();
4 o0 c! O# _' w7 Y+ ~% S, I' v4 \9 G# }& L. E' p1 r7 t
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
5 Y* @6 u5 X, g. n+ D/ B9 ~        MyObj.CreateInstance("MyVB.DEMO");) e  s5 Y4 y+ D

: c, r$ _  Y4 c. L        //MyObj->GetMeiLei0();//无参数调vb函数/ `# \" R. J. ^8 ^: _; Y
) f) z& k' `: V
char str1[132]="0.0";
( J; G4 ]7 @+ Z
" c" V( ]$ N. o, k, wint n=5;
( G% v; o* K+ H! \/ x( A3 ~; K, A# R+ e: |& L
_bstr_t vRsinfo1;
1 D  l; o: x2 G1 n  b3 o) q% r# y9 q  h
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传# t. e  a; f/ M
* d6 _# |- C% ^, V2 O" D% J
strcpy(str, vRsinfo1); //字符串赋值8 s2 E. U$ v3 k; N

% Y7 N2 Y* P$ R$ I9 ]8 U- i  c9 O4 GvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
' I; Q0 g3 c1 y5 RvRsinfo1=MyObj->GetMeiLei2("qq",1);
7 E; I( H* F! w4 WvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
+ @* q3 D1 K" _vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);" A* t& s9 z; T2 k3 E7 ~
vRsinfo1=MyObj->GetMeiLei2("手机",4);: C. R' j4 ^: S$ u: A
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);1 D5 E# T* Y) u3 X7 B8 E5 ?
        return 0;
% Z9 F2 R$ ^- a. @9 u$ Y. f  r2 {) L}/ Z/ ~4 C0 y4 N  e
% Q( b) d2 i- ?2 r. a
HRESULT ComInit()
% d0 N# q' k9 S2 w8 q, j{
( y; o9 ^+ ?# q1 j        HRESULT hr = S_OK;4 b9 c) C, A/ Z# |
        if FAILED(CoInitialize(NULL))  K6 [2 w% B- K' R+ z: |8 ^
        {/ D" y# _* {/ c; K# t
                CoUninitialize();
* M  S. L( A# k1 R% n                hr = E_UNEXPECTED;
3 L& D+ Q( V4 ]5 A, j        }$ W  S- |7 ^% D0 O9 h) D4 P  W
        return hr;  \% o; K2 O9 U3 `0 p( D- Q
}' D3 h, @5 `6 v" d
0 Q& y! f7 s* Z4 b
% v. T* K& K* b
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))( \' @& M# o3 l/ k* b) h) X. O( |
& o* _9 M. M0 A5 A

8 a' p* a' m6 s" F) @4 }# {. A" L, X. P) ~5 E: N
static int report_error( char *file, int line, char *call, int irc)3 y2 w8 ]& d  `, P% E1 y
{
( t4 u* Y; |, F3 E+ V' u! ~$ d    if (irc)
( y. ^$ `/ Z' B" z* w, h0 L    {; T3 y& a- U" w" `9 x; w/ ]1 w4 E
        char err[133],
/ L) p9 Z/ Y: j3 r4 ^  y+ W: d( e. b             msg[133];* l/ x8 I. i6 L( M1 u1 ^3 D0 L0 g

: t3 }5 V0 J  {: z. s# O4 {6 N        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
: B% Y9 ?3 t8 _# t- z            irc, line, file);
5 m; g. i; h5 ^        UF_get_fail_message(irc, err);
$ }$ E7 a1 T$ |- t& {+ ?& \3 D6 b* |, B, K8 V6 L8 U5 T7 ]8 f" ?7 d
        UF_print_syslog(msg, FALSE);
/ L5 `- j: f( f; r        UF_print_syslog(err, FALSE);3 g3 r+ Y9 E( ^6 u  D4 e6 h" E
        UF_print_syslog("\n", FALSE);
$ Y6 ?9 [/ F! g+ E7 e% n3 K8 C        UF_print_syslog(call, FALSE);! u9 i7 I  _8 `- b8 _% e3 d4 d
        UF_print_syslog(";\n", FALSE);
/ f6 [' r) y9 i+ ~, p- o
& X) A& G9 W3 A: N! Y        if (!UF_UI_open_listing_window())( H) @# G4 j) R4 S6 o6 ~: a7 `
        {
' s, W0 r7 S# U            UF_UI_write_listing_window(msg);
3 P& ]4 t, O8 D' V9 ^, F+ J            UF_UI_write_listing_window(err);( {" \2 l$ C4 F
            UF_UI_write_listing_window("\n");
- i8 X4 T9 F! l# Y# i            UF_UI_write_listing_window(call);5 H" @# y1 U* K4 Y# {
            UF_UI_write_listing_window(";\n");
2 N1 o! B3 M1 l* q1 i+ c        }; W: r7 ^, m( o' a
    }5 M; N5 d4 l0 Z5 A  Q( N/ u* a6 T
( O; a4 c* R4 r% G8 Y6 ]
    return(irc);$ M: K2 A6 a8 V$ a
}) I3 M5 p3 a0 m% ?: [6 d. G: l

4 T& a( F1 o+ _* C2 y" E6 v  _6 E. `) z' h7 `0 `; H: i
/*****************************************************************************
* @- o' b' s) ?* R9 ^5 ~**  Activation Methods) c& f4 i+ y8 [# X$ {% Z
*****************************************************************************/
+ ^" c$ ^) x  ~0 a6 k/*  Unigraphics Startup
6 w2 e8 l6 H4 O* `3 {**      This entry point activates the application at Unigraphics startup */
% B- j  m0 H6 q$ uextern DllExport void ufsta( char *param, int *returnCode, int rlen )
3 h, T- L9 Y, a# |3 z{% H% f  V4 `8 y; }
    /* Initialize the API environment */" A7 z9 J; Z& I  R. G/ \3 G
    if( UF_CALL(UF_initialize()) )
2 c' ^( i1 W1 C8 E$ E+ q, n( g! C  T    {1 M1 R# s6 u, @  J" S
        /* Failed to initialize */
( f9 |+ F4 u# a+ t        return;1 t( \1 F9 ]  w% h
    }! z- v% b' x* |4 ]. H1 \7 }6 v( B

) d; B" _7 W: [3 z    /* TODO: Add your application code here */
+ _* B: }# o' V% W( d0 L6 ~" {9 @0 t, |! B% J

7 v1 V/ I/ j. C$ V* \: E( _# b  C4 @* g+ `
        char b[132]="";
; N! b% a* b6 f0 p# Z) Q% V        mmm(b);
/ u' R( t8 |" l0 u        uc1601(b, 1);   //在UG弹出显示框
8 K9 ^7 Z- d; ~% W& H4 r. L, O1 G  ]+ h9 }' \
6 M. U8 g) j; t8 G; w! z8 h
    /* Terminate the API environment */
; D! M% J( j* p: a( N    UF_CALL(UF_terminate());
2 p& g- o. u1 a% u, R}
, q& |( g1 e. U- s5 D( J# q1 B1 `3 y6 R0 a' v
/*****************************************************************************: v2 ?$ {7 s! ]
**  Utilities. ^# W! g% E4 q: r  B7 p
*****************************************************************************// g! y+ {. q% ~4 U/ D0 l- W" i

/ a/ i+ K6 G. b7 \, Y* a/* Unload Handler
) R0 S, o; |0 `/ R/ [**     This function specifies when to unload your application from Unigraphics.
: z4 m! m& I, V% \**     If your application registers a callback (from a MenuScript item or a( c8 @4 b0 ~1 B
**     User Defined Object for example), this function MUST return' G8 G4 O4 P1 ?& V, d
**     "UF_UNLOAD_UG_TERMINATE". */
2 S3 S8 q- i! m: o4 ^extern int ufusr_ask_unload( void )  ~5 @6 p7 h% q' R. B5 Y. v
{' p6 b% Z- f7 ^/ I
    return (UF_UNLOAD_IMMEDIATELY);% n9 I% N1 d8 i( Z" @  B5 Z" `: z
}
0 L! u, @5 ^  B
- M+ n3 s' e! I# l, o1 X7 T1 J  i5 v
; _4 G+ B4 O  w  W8 v& u( d+ z
  L" g% Y& ~: d' X) S. X
  P1 p/ }3 P3 L' P# e% _
! ?/ F) _! u1 _/ Z0 n& E$ f/ w% [' ?. p8 K6 ^$ {, i$ q( W
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了