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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
6 w9 U8 w) m& I/ w/ H  W
0 n6 Z; `0 m& |4 x★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用$ t! |8 H: w6 d$ x$ M

9 v  U. j# }# g. t; @vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
* I) O$ Z6 y# d: v
7 f# o: ?8 M4 }! E5 W( i0 P9 ?2 `=============================================================================% H, Q2 F6 J, }" c4 P7 ]
在VC中调用VB编写的COM组件
0 g! B% ]( u. h: W; y' \+ R3 t+ m) H( g; H  i' \7 r; f. R4 a
梅雷 - QQ1821117007
' r. I- X- _- y, y亲测 XP、win7(32/64位)可用; W$ i" r5 D( i3 ~. `% B
) h- t  n0 i6 n4 _
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。$ C4 ^$ R; v& Z$ }
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 4 N+ V% [, X( g# a% D7 r
先说说VB开发一个COM组件。 # S& m6 {9 a. t8 H0 Z
用VB新建一个ActiveX DLL 工程, 4 X7 D1 r  d9 o; I3 o# j: ^8 U
然后修改工程名称为 MyVB ' f- h/ |# W1 v: _
再修改默认的类名为 DEMO
) [. B+ C1 f, N6 h然后再向类中添加一个函数作为测试用,如: Visual Basic Code
7 [7 y# E0 t; {! R) e& K6 V. b4 K3 g+ U! }' r, [! j# Z
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
5 \  Z( }' }* \% m* K6 |- V* o7 q* O$ ^

- A; ^  l0 o0 J! S7 _
4 j3 h3 R8 t" ^) N7 @" vDim str(999) As String
) n. d/ r( p  W( X: Q# a
& T. S8 |! T* v4 gPublic Sub GetMeiLei0() '无参数传递( D6 S# I7 }: B! S# L  C
MsgBox "梅雷qq1821117007"
  d  B5 |7 b! P$ NEnd Sub  X3 S9 z5 [1 E% ^) x) ^- ^
4 Z( [, o6 G2 s3 J

- Y1 G/ z+ j2 s' n7 H'带参数传递   Public Function
1 v& C7 }0 `: t" G4 l3 t+ c) PPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String% }  e  {/ e, U3 p6 F
str(n) = str1
) r3 C: V; q; A- p& u* T$ h% V9 e; f- H
If n = 5 Then/ c6 `4 ~  @# Q$ n/ G3 k
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)8 Z- T$ ]3 M3 x5 ?! a
End If
4 }1 C# P6 t. C9 ~0 R- \
7 Z8 `7 B! ?$ _# _7 w2 [GetMeiLei2 = "数组传递0"
8 s9 p. h0 M3 \9 C$ \1 g- T2 P# i0 s" e4 q( b
End Function; w& ?( H- v' y! t: p

- ?  Q6 X/ O. v8 e7 t
. ]* h" z( J9 O& s5 I然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
+ B: X3 A+ [- l; M" Z! l
, f+ R( x2 A0 m: @8 d注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
4 j. L9 Y+ J1 j; y7 g1 Y1 q
! s- \1 J. c3 i/ V- D7 U* s
: x4 ?% o/ E) W4 {其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
2 l* C) Z# H8 y6 i1 }0 o而 VC 里调用可以这样做,如: ! Q' T( f3 o& P3 J1 o+ J
Visual C++ Code
5 K, b4 V& Y; S3 q, [, y
6 @( N4 m% j" V( E$ f//新建一个 UF程序,输入以下代码9 [9 x+ T2 W2 M& g1 A
/*****************************************************************************7 D6 X% T, @! n( m4 P9 ^5 \
**5 C/ t! k. u- o+ h2 Z% [
** C++调vb.cpp
5 T3 z) z! s# [& }( b; N# e9 |**- h& z/ o6 H3 V. K9 h6 l* N! U
** Description:
* H3 R) F- M+ h' t**     Contains Unigraphics entry points for the application.
+ Q- n5 Q# T6 V! n**% r4 @* y9 \% V( G7 t7 F' _& k/ a
*****************************************************************************/
: x% r- N1 j( t& e" o7 D
- Y. K+ V) A+ V+ A4 B4 {/* Include files */
' h2 R' a$ \# {3 t#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
2 ]" B' I( E% t#   include <strstream>3 z: \5 j/ |- p8 h- i
#   include <iostream>
1 O, g5 o1 m: e5 y  A    using std:strstream;
; V: _' w+ v6 _    using std::endl;    , {" v* s: m; S  O+ {4 y
    using std::ends;" i9 k' R+ Z- i; M3 G
    using std::cerr;) @  x. a/ }7 \7 r* |8 k' R1 A  _* W9 E
#else; M: h# V! Y9 b; d9 L& O  i
#   include <strstream.h>
1 l) X+ r- ^! Z#   include <iostream.h>
3 ]* i) i* P/ e% \" Y#endif& H2 y7 E+ n7 R. `" f5 C
#include <uf.h>
& C' E4 W& z/ _) h1 E* z#include <uf_ui.h>
+ s$ K  D) R* ^0 H, |#include <uf_exit.h>7 R  a  a8 w3 H7 H
#include <Windows.h>
1 M1 y$ v1 P8 p8 @# r6 L4 M/ j9 o7 [3 I8 o7 c3 p* {1 Y+ T
#include <string>
5 t* \( j5 ?" g8 T8 m#import "C:\MyVB.dll" no_namespace5 m; F2 D: B. a4 c1 p. m, S9 t6 [1 v
//using namespace MyVB;    //这里是COM组件名称
) @3 V, o8 _7 E( L# g7 n2 K) s1 G0 B' v; b" A+ o9 A

1 P. v7 c4 d3 ~4 V; d6 RHRESULT ComInit();
& n1 e- Y9 Q7 a: ?: k# z5 oint mmm(char* str): j8 L4 c) s6 ]( M6 V& m
{( _( l% V4 ^' }5 O1 S+ p9 m7 U% {
        ComInit();
+ j2 h# F0 C$ m8 a0 L' k$ T
* C/ c$ b3 d* W" X/ b        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象" z( k$ l, l) l( D0 Y
        MyObj.CreateInstance("MyVB.DEMO");
9 Q  k, @! L: A2 v* y1 H! B
) L1 D8 F) b6 j        //MyObj->GetMeiLei0();//无参数调vb函数- I: C9 r1 n5 l' [3 M( ^' V, G3 ]

  c# K! p/ w, k* ^) b) ~7 x) [8 a/ Tchar str1[132]="0.0";
/ G1 ^5 G' W3 _3 t
# E" X& J+ e$ o. h2 Hint n=5; - T% A; T# }+ ?# h
/ E- ~  p- ~' ^: r! y0 B$ |7 U
_bstr_t vRsinfo1;1 |" R3 u* R( T5 v  }

* V5 V( M6 [% e2 Q; M/ A. nvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
- n1 v( I" B1 C7 L+ V4 b8 ?/ l" i& e: L2 w& D. b4 F* \
strcpy(str, vRsinfo1); //字符串赋值
4 u' l) a, e8 O! h5 U0 _- g' k' v# z; C5 |! V1 ~
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);' H8 j- b3 O8 ]. x$ R: c! ~. `
vRsinfo1=MyObj->GetMeiLei2("qq",1);
6 W5 Q6 l2 w6 k3 U; l2 U7 J- ovRsinfo1=MyObj->GetMeiLei2("1821117007",2);$ y4 M2 U) {) g  v& m3 f- S
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
2 L3 z: f# r, A. o1 H3 ~vRsinfo1=MyObj->GetMeiLei2("手机",4);
, I9 B* F' B' @, Z' a* m8 h& i8 gvRsinfo1=MyObj->GetMeiLei2("15757753770",5);3 d: n$ _* ]8 `5 @8 K( \
        return 0;1 O2 ^* w  d3 Z9 ?$ z: U- w: r' G8 D
}
. k* R3 ^  S* h9 V8 A& X
( X" a$ r+ A8 }  EHRESULT ComInit()
& a# l) S: Y2 o6 W: \4 J. s$ h{9 n. f4 `0 c5 V$ ~' [* {
        HRESULT hr = S_OK;
4 i1 b9 C! Q# G! l9 A        if FAILED(CoInitialize(NULL)). y% P+ A# [7 a1 S( F5 H
        {
2 Z1 g( ~( }% u                CoUninitialize();& @/ Q, y) i0 }5 |
                hr = E_UNEXPECTED;
5 t: I+ ~- O( b: m' u/ K9 S  F        }
# w( o2 H5 I& Z# s: m5 `* \        return hr;
! J) M  ^. r8 Z# O9 W; N}' l; }3 b4 `9 C; h3 ?8 S
0 J" [( B1 O6 `- x8 E( n% j

, r; q& k6 k5 a% Y; v  A#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
2 W1 R6 W( N+ y# K* G9 [7 H, i9 v9 n  y. k6 |

% i) g; n( ^1 U; O- v
9 r- H) T) B# N1 Q: Q( Tstatic int report_error( char *file, int line, char *call, int irc)
3 \* n0 O* Y3 `2 s' i* f{
" h0 n" e/ `* `    if (irc)
/ ^7 d4 W+ A$ D    {
1 v5 {3 S" N9 h  A2 Z4 p        char err[133],) w3 _1 |! W9 ]/ u! B% o0 g
             msg[133];( j2 H4 c- [5 ~1 n) C+ T

* O' Y' D3 t2 ]7 k) e( m3 y4 w( O        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",' G" g8 i$ w9 q' V3 Y* u
            irc, line, file);
' L$ }0 a* k$ S7 V        UF_get_fail_message(irc, err);
+ M, s+ A( o. r% v; u
4 T% P, _  T% D- T/ ]/ j2 q        UF_print_syslog(msg, FALSE);3 O. ?# S# H# q; R" ]1 B
        UF_print_syslog(err, FALSE);1 X' d5 j1 O5 [& B& ^" q
        UF_print_syslog("\n", FALSE);
0 p6 b6 l' l8 T4 X, U3 y# }' o- t        UF_print_syslog(call, FALSE);
$ A. g9 ?/ G' q2 O        UF_print_syslog(";\n", FALSE);" q! u* C: c4 ]! P1 A+ ^
3 }$ q" d# c: f2 |6 `7 F) R0 [
        if (!UF_UI_open_listing_window())
7 {- g6 c3 r. o% Q& N/ N. Y        {$ M5 B, }+ \2 m2 }4 P/ ?
            UF_UI_write_listing_window(msg);
) {8 g4 t! w0 n0 k0 S, D: v7 R            UF_UI_write_listing_window(err);8 n  n2 s0 P8 g3 x6 e! B
            UF_UI_write_listing_window("\n");/ G( V3 x& h. W# z
            UF_UI_write_listing_window(call);
( U7 ~( o$ W# n& ]3 K/ m, e            UF_UI_write_listing_window(";\n");. o7 }1 {) t% f+ b# E) }& w
        }, @# f5 H8 \1 Z7 @
    }
" d2 x* p. r9 a8 F3 V$ @8 {
) U' z' \! _3 N0 d+ x- R2 V( T    return(irc);
! K9 G4 g& C: v( l}
4 ^" T9 W/ ~. l. z& g$ ^' S; d; P& d3 J8 D( f8 ~# m% ?: z* g

9 k  V# c1 ^" L: S- `3 Y- R5 q+ X3 j/ U/*****************************************************************************
2 L" k: i& s# X: a6 D' u+ `5 q**  Activation Methods9 d& O0 `  ]: q; W9 w
*****************************************************************************/# B( M4 l  F  Y$ q
/*  Unigraphics Startup
- S1 _' ~% Q+ r3 s9 k7 T**      This entry point activates the application at Unigraphics startup */
1 K/ H1 V4 T1 C7 i7 L) x5 Iextern DllExport void ufsta( char *param, int *returnCode, int rlen ), ]- B% @- ?- S  D- k. g! q( s. j# {
{4 @6 N/ _9 o5 u& Z% G0 j) `
    /* Initialize the API environment */6 _4 B6 P7 M% T( U& l
    if( UF_CALL(UF_initialize()) )
6 K% a* y$ `1 w0 z    {
3 ?0 |1 p7 U# Y) b/ g9 d        /* Failed to initialize */' R! s4 c' i% q$ I3 s  {! l
        return;$ v0 L: R5 G& L0 W5 k
    }
' N, U/ w  n' {$ d5 W1 \9 u
) i- e* C( x$ a  Q7 R    /* TODO: Add your application code here */
) r* ?* `3 v+ m$ ~4 f% T' k% p1 T# f

* K$ D  U5 L8 E$ n5 o$ ~: d% b1 O8 s4 g6 z
        char b[132]="";
: }4 @, _* U. p# \, U! J9 k: G' C        mmm(b);; G0 @. j9 H2 G$ t* f! B
        uc1601(b, 1);   //在UG弹出显示框; g# f# |# Y$ F# d

  _4 x4 H/ S5 u8 T  v$ G' n1 o# e  J# ?# Y" Q# P
    /* Terminate the API environment */
) k$ _1 U3 i+ E) ?  E% _    UF_CALL(UF_terminate());
4 Y7 {9 v1 \% O$ v  b7 r}
7 h  B* S- I8 U" e0 f  [
# b2 _* A: `( N* b( Y0 m3 Q/*****************************************************************************8 i% @1 O& L- r
**  Utilities
1 M, Q5 ~0 r) \  c" N6 f5 m*****************************************************************************/8 ]( N: X( y( O

: r5 c4 b! [5 j4 e6 z0 a/* Unload Handler8 i# ~/ i% z: ^' A- b9 i7 a" G
**     This function specifies when to unload your application from Unigraphics.1 R+ r  a5 T8 r+ I
**     If your application registers a callback (from a MenuScript item or a
  l* @  g- G2 V) \) E! w* s( W7 U* ]**     User Defined Object for example), this function MUST return' O. G3 Y- P# U8 o* w
**     "UF_UNLOAD_UG_TERMINATE". */+ |( N9 @2 S- I
extern int ufusr_ask_unload( void )
3 m5 o/ Z( N  m3 M{# P4 c9 ?2 O3 p
    return (UF_UNLOAD_IMMEDIATELY);
# w% |/ u; J; ^}
7 Y. A, }. H$ b  g7 [1 h
: Q$ [- x# V: V2 i5 z
7 M  @( M5 o" o6 l; D* u* [5 G8 @: }  T9 T3 G. X+ H0 w" A8 \. N

' X. t$ d7 Z. j# e$ ^% g5 a9 O5 o
5 c7 F7 B) y) c! P& r* B& W0 c
9 O% P& p9 {3 p: k& I: 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二次开发专题模块培训报名开始啦

    我知道了