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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件5 d4 R5 L( ?) w+ d7 T7 w: R

0 r0 A) N' y4 }4 E- U/ E★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用% S2 _1 G8 C$ h
: T7 w/ U  S7 o0 U
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
8 C& k! D- L( ~; V  x4 B% d/ |; y& I" Z
=============================================================================
3 S* @( V8 m- U. Y! q# s# \( Y在VC中调用VB编写的COM组件. W4 N: n7 W( q4 g

7 h/ D+ x! f% k/ u4 i/ F6 X梅雷 - QQ1821117007 % y* v! q- S: W( f( C! w
亲测 XP、win7(32/64位)可用1 m' O2 Y9 K0 w2 y, [
4 L/ X; T; C9 D; P% J
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。* E! l4 z2 ], m
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
4 V$ ?! S4 d: r5 Z: ?; f* a先说说VB开发一个COM组件。 9 C  ]/ `. O! |! A% K( c
用VB新建一个ActiveX DLL 工程, 7 f8 Y% r% I6 N8 i  D; [
然后修改工程名称为 MyVB
7 G; j4 |1 b* f. t; u再修改默认的类名为 DEMO . R) c% V5 ^  F+ _" G+ p3 ^9 t
然后再向类中添加一个函数作为测试用,如: Visual Basic Code& C: G8 r) P2 X$ F8 {; T
& O" e& `& J0 f$ C2 ]( G; }2 i
注意!工程名不能为中文不然在c++中会出现无法识别的字符串5 f/ v2 H. _0 k$ g- e* d0 T4 Y* v

  p$ U- w: Q3 d# F7 w$ x  W8 G7 ^
( _: Y/ ^& W. A
% Y- N' a/ A/ v, Q" xDim str(999) As String8 Z5 y2 N7 X3 V2 a$ U  T6 C6 j$ d
; E. I2 y" l# ^2 }; A) h
Public Sub GetMeiLei0() '无参数传递
. a" R, r6 M& O/ t  \# ~MsgBox "梅雷qq1821117007"
$ F4 h9 O9 E( i( }End Sub2 h- X9 z* I. Q
  U  n" C; L* ~4 m5 e* I
  E+ }5 Q) `& F8 J
'带参数传递   Public Function! d$ ]% z! q* M4 A
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String* r5 A5 ?8 g! s' _8 `; u* g
str(n) = str1
/ u* Q+ f: \/ h) X2 h* b" j0 q, g/ o% ~! e, Q. Z* k* v
If n = 5 Then
% E$ L2 N, m- y( H8 M/ N  N5 SMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
  u! e# ?. e2 u; H: i1 {End If
8 F# Y" _- a' [3 |/ e
: O% ?/ s- q( D  [GetMeiLei2 = "数组传递0"
2 f5 k! x& w5 t& w
4 m/ T& g3 k- [+ U0 K4 L. `End Function
' I* t: W  B, K4 A  Q& B0 Z- e" b2 r& V6 C; B: r5 }) C

* D$ J  c" i: R' W7 v# m1 N然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 1 D+ s+ f! P! A
% k1 f4 d# i3 t! q
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
8 g9 S$ R6 y% X' _. c  f8 G/ f% _5 b5 @9 |" D# T4 D
2 C. R( {/ G" {8 u0 D. u9 x* O- p7 ?# D
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
3 ^* p. C8 }3 q& _% k0 ^' [而 VC 里调用可以这样做,如: 0 ^4 E7 V9 S2 C, F
Visual C++ Code 6 b  d  ]3 R: m# b

  a6 F- m9 T# y8 F0 S//新建一个 UF程序,输入以下代码- f, A$ }* w0 @- _
/*****************************************************************************
2 O" [9 [$ c6 K0 }**
! U1 a+ W% Z$ Q** C++调vb.cpp
  y. k# N' J9 s0 m+ r- T6 P**1 L# |! |2 T& X4 m1 l* E. E( S
** Description:
, \1 J# _* ^. {; g2 x: r( d! T**     Contains Unigraphics entry points for the application.
. h1 t% V! O3 h7 ~" }**. s7 T# d+ Y  l
*****************************************************************************/
, L2 G; F2 E, }) w: l& h& @5 l+ `$ C  V# b+ l. U+ c7 K
/* Include files */
+ n1 I8 W$ B! `) k; R6 `# d+ n#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
& x: V4 {" Z: p1 u# W#   include <strstream>
! j% L! S  w$ u3 Z" v#   include <iostream>" p1 H* E1 U; ]0 _8 e
    using std:strstream;! f# {6 r/ i& ?
    using std::endl;    # ?- C. A$ K+ L, y/ r* ]
    using std::ends;) h5 K8 w2 F, C- L8 z# l/ m4 D0 |
    using std::cerr;1 I* k5 d3 C& j% `# Q4 _  Q
#else
/ P" v: V8 ^9 g/ ~* j0 t#   include <strstream.h>+ L; c8 Z9 Z# Q3 \
#   include <iostream.h>
( w! X5 S7 r( i+ b: i4 i: k#endif: w+ z  b; u8 F$ D
#include <uf.h>, C4 B" q9 M8 _! q
#include <uf_ui.h>. x2 b& }9 O5 J: g# P* X
#include <uf_exit.h>
" v% }  h+ _4 @: d. b  a- h3 w! N0 A#include <Windows.h>
. [. I" h; D$ o; ^+ ]  A$ _, T9 s2 |8 d
#include <string>
" l( i6 h, P) k# A4 z3 h! v8 m#import "C:\MyVB.dll" no_namespace
$ y5 y' f. K5 l+ q. j, Z* \# i//using namespace MyVB;    //这里是COM组件名称
& ?8 U3 Z% ~  {
, P3 M- G, z( {, Y8 a
  `5 v3 L, H& P4 D( U/ u5 `4 |HRESULT ComInit();
* v+ R3 I6 `# [  Y& @- @( `  eint mmm(char* str)
0 ^& e' c' m6 l0 |" p8 Y{
, e% q- V+ }0 f* h% R        ComInit();1 g, s# ], F0 E: g( u' w
  z/ z+ w$ c4 N. |  R. w/ _* l
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象  B9 k1 m3 ^7 Z0 b0 j
        MyObj.CreateInstance("MyVB.DEMO");) ~. o# y: J5 X4 I+ i# I. [5 c

9 F5 B$ u# X* B# B. @  x8 }        //MyObj->GetMeiLei0();//无参数调vb函数
/ B% L& s/ r+ X6 b8 j7 ~4 f4 v3 v8 N! C. h' D* }3 v7 g
char str1[132]="0.0";9 O4 ]" {- i, m6 O  A) B8 f
( _( ~, \. ^' j$ F' Q" I
int n=5;
# Z1 J! _! m! v8 U8 q
* f) U2 V5 z; ?( R8 C% U_bstr_t vRsinfo1;
) V* v/ G6 [4 y/ D8 a+ m
; t" e) X, R1 x6 Z0 l6 ~vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
( E; Q. L+ s# r# {. [' j9 k+ X, ^4 H) \: J( y5 |
strcpy(str, vRsinfo1); //字符串赋值# j- M, W+ a+ W9 t/ @1 l

8 h& o6 j  H/ h1 n) ovRsinfo1=MyObj->GetMeiLei2("梅雷",0);
/ _. h/ p* d# P/ RvRsinfo1=MyObj->GetMeiLei2("qq",1);1 J1 a1 ~, j, C. g* o( M# \1 K2 F9 @
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);! n8 E. p! X( M  ]' b% b
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
, j2 v% Z+ D8 E: ^% ^0 g6 xvRsinfo1=MyObj->GetMeiLei2("手机",4);% ^$ z/ M3 v: W1 M5 }7 R
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
; u3 N) T) h  G. H* g, r1 V        return 0;
! A# y& F; }- x9 y7 W}( A4 z6 s; k) g8 |, J  G& G7 Y

+ J( }# d5 g1 `  J3 ~3 ^; YHRESULT ComInit()
: r& h- k, s7 k: Q$ D- K. @{: b3 i8 G: c9 |% ^
        HRESULT hr = S_OK;1 N7 r# ^, `/ k  z. ~. s
        if FAILED(CoInitialize(NULL))
3 W1 ]! U; V$ a6 R        {8 j* ^8 Z* j# I; v
                CoUninitialize();
. N1 ~2 z+ Y- y6 H- V/ @+ v0 o9 u                hr = E_UNEXPECTED;
2 {& `/ B) E8 i( L! b: f        }4 A; I# k* l( E: |
        return hr;
2 f. ]# `6 R( ?4 `% R) L$ X( U' N}
) k7 s8 c  Q. a! f3 g$ j$ a4 f) u8 b) W* N- d

; s3 ^- K# N# [- H1 r1 l#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))): R  V5 d* p6 m3 W

4 d+ u2 S+ `; V$ g
5 I$ h: S. B$ g6 v; L5 K& M
, [0 H' c8 b) t& Rstatic int report_error( char *file, int line, char *call, int irc)1 K# \# M7 F5 U( [# p4 J$ }* J
{
- j3 A1 Z" m) f0 z# V    if (irc)/ e  T, J4 Q. a- p
    {
: b7 k8 r6 A3 I5 }8 ^9 A        char err[133],
: F3 r, d9 D3 Z8 J: e* ~2 _3 |             msg[133];& Y* h# [4 d) X: ]  @) ^* G

7 T: }, C* U, f+ S        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",' O1 ^6 B' G' C0 j
            irc, line, file);
7 ]) `/ |/ ^7 j3 S3 V, x        UF_get_fail_message(irc, err);
& }# [/ V$ j9 o; m9 U% b, x' j2 N$ c8 ]. y4 o: _
        UF_print_syslog(msg, FALSE);
$ p. j1 P( j4 o1 c$ r        UF_print_syslog(err, FALSE);
" N% ]9 p, W& z  W) d        UF_print_syslog("\n", FALSE);
# Y6 v, w2 i+ f3 C) ?. F& [) H1 I5 @        UF_print_syslog(call, FALSE);
# {4 `" X& z2 E- _, t+ Y; r4 G* x        UF_print_syslog(";\n", FALSE);
" ?. [' [- \- C- T2 e3 x2 R
  H% J; E4 ~% l" W        if (!UF_UI_open_listing_window())! |6 l% J8 X3 e6 A4 f: U+ N
        {' \1 i7 D$ y; R
            UF_UI_write_listing_window(msg);
9 k& @- W& \$ z, H. ^            UF_UI_write_listing_window(err);
4 J1 A# j% p3 Y            UF_UI_write_listing_window("\n");
. ?+ e0 O8 s4 ^            UF_UI_write_listing_window(call);" p; z0 W; Z4 n9 H  _, p
            UF_UI_write_listing_window(";\n");/ y6 j4 {6 S( f6 K2 p$ Z
        }
! c* p# k' v1 _$ ]/ j* i: T6 R    }4 f4 w$ T2 e# ]3 y

; u& ?$ Z* v3 C' M! r    return(irc);
& V0 f% t0 P- t3 v}
9 ]# q, L1 t: ~: d  N! }/ n; a% _) }$ E! R0 a# P+ ~
1 O/ `& s+ k2 ?
/*****************************************************************************3 {" d1 E. Y( G# ~* g6 f5 n
**  Activation Methods9 K* c5 G, ]) b/ a- d4 Q) \+ x8 L! Z
*****************************************************************************// G  c$ x% g: ?9 t8 h
/*  Unigraphics Startup3 x6 P) X5 M. p! Q$ \
**      This entry point activates the application at Unigraphics startup */
3 a0 l+ y" `5 eextern DllExport void ufsta( char *param, int *returnCode, int rlen )
6 K9 d3 S! ~* Q8 V( z8 l{
  F( Y4 F; W% p2 N4 d. p    /* Initialize the API environment */
9 w$ Z8 ?. W! N9 z- D( B( l    if( UF_CALL(UF_initialize()) )
* m- i( C9 F- E& ~& G- u" K. M& ]    {" e0 q/ l  D. _1 N% [
        /* Failed to initialize */
8 e- o& G# ~. v+ U: V6 q        return;$ N7 Q7 T) q9 }8 H3 ~1 [
    }
3 E9 I: Q$ o& }5 f# X6 v1 M
/ P$ g! m; y& l# R. C    /* TODO: Add your application code here */3 w+ @  x7 Q; d3 P# n

1 J3 \# V+ ?# L8 }% o; |* h: E, N+ Y- |; f, v
$ n/ G4 [. r6 S$ k3 @. C5 @
        char b[132]="";, D% Y0 v+ X4 l0 P9 x) K8 }
        mmm(b);
9 Z$ I, u9 K" V' B* V+ K        uc1601(b, 1);   //在UG弹出显示框$ `/ y* a- E# \: O9 k" G: O
. L: L  m, p" P6 p0 s
' T2 L  M( D) s0 n0 \
    /* Terminate the API environment */
$ e! I* }2 {  d+ y! L    UF_CALL(UF_terminate());. k  s# L! E  U0 O- z  |
}8 J9 d: }4 Q: R+ \
( _- A  M& C# _/ P
/*****************************************************************************' j/ h8 f! I3 _2 E
**  Utilities
7 X1 r$ N9 i1 E. s*****************************************************************************/
5 ^& S5 q# T7 ~$ a- y4 s
" b+ A+ c" I# S$ _/* Unload Handler
! b! `. p5 C' w/ Z& ?+ u**     This function specifies when to unload your application from Unigraphics.* _6 c( k& }$ m
**     If your application registers a callback (from a MenuScript item or a
! E, T2 I5 {; h. N7 R**     User Defined Object for example), this function MUST return
! N1 I' N; x' `; Q( m0 z5 M**     "UF_UNLOAD_UG_TERMINATE". */
' r( N. U2 i9 U# s% d9 s, uextern int ufusr_ask_unload( void )
) ?! K2 b- Z; T1 p4 c! r{
* O7 d" e5 f" ^4 n6 H    return (UF_UNLOAD_IMMEDIATELY);) s9 ~! L- C4 r
}7 q, h, {4 m) v$ v
' X- x' M0 q( i6 f* Z$ X2 u
% P( M9 c/ o! N  c& s

' I$ r: \- r  g5 Z' @5 D% n  F) |  K8 g8 I
6 @. j! O% X8 V. R2 n# y' t
7 m1 f/ X- _3 ]2 L$ 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二次开发专题模块培训报名开始啦

    我知道了