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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件! V' v( E# q, O/ F3 n( J- y
7 D3 }% _7 o# ^, u; H' g
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用& B0 X  f7 z( Z$ a3 Q- F# J' k3 ]- f9 B* o
; y  D8 d$ m" d, U( R4 ~$ |
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册3 v. e$ x  E8 l+ }* _
$ ?  F$ q# V  p- z9 l
=============================================================================
6 C; Z# t  G; j! P在VC中调用VB编写的COM组件$ P: }3 C" \& `% p# J$ ]: g! h
5 Y! M! \1 g/ z+ b5 L# V
梅雷 - QQ1821117007 , l/ Y  S) ]8 u0 u
亲测 XP、win7(32/64位)可用
# O, w) _" f6 i6 q+ y& N/ w6 P' K8 d' T: R5 K( _
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。% U9 B; R7 m5 w4 B9 u
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 - V- F* ]. Q6 K- o
先说说VB开发一个COM组件。
8 ]+ X/ Z. @7 d用VB新建一个ActiveX DLL 工程,
( U% R8 B. W5 P* v9 o% e1 g然后修改工程名称为 MyVB " w1 J; ?2 v! R  D+ ~3 Z
再修改默认的类名为 DEMO
+ [6 ]8 v# B: ^1 M6 r然后再向类中添加一个函数作为测试用,如: Visual Basic Code7 [# b: h; q, e- o5 s
* {! r. K# r* d9 K! }8 b0 `
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
$ [1 F% I- L8 J- R7 D/ P% J! _: S- U  ?# G

. G! t- Q% N2 {1 K# \, U1 m  r! B7 y+ i0 p3 N4 Y; r  @
Dim str(999) As String7 w& g4 x7 h3 P9 c- j6 o1 _0 K
4 O$ ^9 \5 k/ F4 r' T
Public Sub GetMeiLei0() '无参数传递) j4 b, h$ q$ Z, X* D" ^
MsgBox "梅雷qq1821117007"$ A" ?! N, ~0 M" j
End Sub/ y$ D8 x, X6 L" R8 o

: [4 \& F+ w* q( J9 }6 e9 K8 {
'带参数传递   Public Function
- h- v& _: z$ B8 r9 }$ e  BPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
! _2 O5 P5 ^" `4 g9 rstr(n) = str19 b6 m$ Y( T, O" I6 Q! V

% L1 p% T* ~# ^* @* Y& Y- @If n = 5 Then9 D0 V$ S  |# R2 G3 p! ^
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
9 y. x% }) A3 y+ j- x+ _End If7 W3 m: ]% ]  \  \
: d! h, {' w* |; U8 W0 C0 x
GetMeiLei2 = "数组传递0"
5 \# a% K- u9 [4 n# A2 a
% B. W+ ~4 f" K) @End Function4 e3 m9 X: ^! E" q( }
( O0 V, s0 Q7 X/ e: b3 r: ~
& V; V4 B, B9 F5 C
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
. E( |! y' D! i2 e! Q( T! u- r" F# b
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 9 i9 s, V; u* g$ k2 B. o( O
2 ~4 B+ l1 b5 R( }

. @& m# f  D6 N9 h: L其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
0 Y7 Y6 P  I' a: H- C而 VC 里调用可以这样做,如:
; ^6 w& Q! o: `* p" w: \" [Visual C++ Code * a5 H: g& o/ s: i! `& R

+ \5 c4 f% L! G% _9 I! E//新建一个 UF程序,输入以下代码
, d5 l. Y' ?) V# G/*****************************************************************************# \2 H! f. y- z: ?' m9 k- v, Q$ Q
*** @  f, s/ C# ^( T, q, M
** C++调vb.cpp
% W  I. A6 G% D1 ^*** N8 T+ D5 D. }6 U" f
** Description:
1 o* B3 m) B$ l5 y- O! E% K**     Contains Unigraphics entry points for the application.
% b! O- e# x" t; G  H**
+ y6 w( W' z* E*****************************************************************************/3 k& m* D' V7 b. v* s( y

9 G; w1 n, a2 @/* Include files */. c3 u; C4 P; R% j" V- [0 ]
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun ): B  X' g0 R% Z9 \
#   include <strstream>% e- Y( W: v  f4 q
#   include <iostream>
, @) r; {$ s) E, P& d, d    using std:strstream;9 t- a: c# p* Y( c4 c7 G! [
    using std::endl;    ' x4 Z" R' f! G
    using std::ends;$ q: [0 ?& L, p$ g& w
    using std::cerr;
1 e. w, t  L7 K, \, F3 c#else
% j8 n; q/ Z7 M. h! S+ e#   include <strstream.h>/ v0 {' s7 |# ?4 ?6 t' d
#   include <iostream.h>
4 e- v) Z6 o) q- `$ W/ g/ M#endif
1 T+ Q3 j  p  G+ U8 Y#include <uf.h>$ D. M% U& Q4 U2 E) X
#include <uf_ui.h>* Q1 E6 K, f* V1 \6 a* \
#include <uf_exit.h>
0 r& ~3 J- z9 C& g2 P: n; g9 Z( p#include <Windows.h>. _" u6 a) t; h
2 W" Z& @' h+ l
#include <string>
8 D: B4 q) P/ T; X#import "C:\MyVB.dll" no_namespace
9 S1 p- T" v3 j' C3 q//using namespace MyVB;    //这里是COM组件名称+ O. [* q+ B) w4 i
$ |7 h: {% s- K1 E- M$ r! p

3 z; D& X+ N# L( p) C, N8 M9 vHRESULT ComInit();3 ?' ?- h: g7 X: l0 d, n/ Z
int mmm(char* str)
2 O6 ^* q0 j& d7 I! ]: I$ l/ q7 `4 T6 L  t{; t- c# f; W* U% C4 _8 M
        ComInit();
' m1 W/ O& A3 N+ X+ D9 O6 n$ f0 B! S3 s3 q, t, \
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象# e! B# E5 ]! n6 ]! M
        MyObj.CreateInstance("MyVB.DEMO");) Q: X- C1 Z3 L8 m! L
. G  ?- j5 A- F$ }. N
        //MyObj->GetMeiLei0();//无参数调vb函数/ Y) j$ [6 r0 k6 o" v. o
( R" V  F+ t' Y$ [, }6 P/ b! g
char str1[132]="0.0";
. }) ]" M+ v, h0 X5 F( T  q9 x7 W) m* b0 {. v) l2 l
int n=5;
; i& i( F; \) @/ f8 }
% R* C% C* m$ B8 D$ G_bstr_t vRsinfo1;
# i: N8 u( Q" z( D- w- l7 z2 m- Z- I/ _! e
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传  L$ {6 b! b9 y
4 Y) e8 s& [/ z) u3 [4 q
strcpy(str, vRsinfo1); //字符串赋值3 F# R" o* A% s& W& D5 T% P
5 A' K, i6 Z  j) m
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);, C2 @% {8 V5 N: x8 J
vRsinfo1=MyObj->GetMeiLei2("qq",1);+ M( g4 c+ X2 J2 f8 g5 F: ~9 ]7 `
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
+ w! U- e& V+ p" c, MvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);- S# E8 K/ p2 `1 t$ U
vRsinfo1=MyObj->GetMeiLei2("手机",4);
9 l( I; t! `/ Z9 Q- rvRsinfo1=MyObj->GetMeiLei2("15757753770",5);
5 D; t+ x1 P; y, P! q        return 0;& l- M: u- O$ i4 G7 d
}& k+ l) d4 p+ H: L+ ?' f9 B

  e+ J" w: q0 E, Q2 c8 @HRESULT ComInit()* t7 K8 X/ M3 f( \0 s; L; Y' A
{
4 J1 g, r* H, ?1 O        HRESULT hr = S_OK;8 x% F9 c$ D$ I  F/ I" B9 [
        if FAILED(CoInitialize(NULL))- ?. f- z$ z3 F8 ?8 K4 S
        {
8 \' R7 Q; i$ m5 ~# Z3 \5 x                CoUninitialize();
1 m0 ~0 W& K! j) K0 ^                hr = E_UNEXPECTED;
* N" ]/ F3 f/ u' X$ W; j        }
9 W' w% I7 ~. A9 G; u* r0 U7 Z/ G        return hr;& d5 B1 E: |& k$ g
}
  L1 D. J6 g' L3 l
# S* ]4 |! r* m* n0 y4 @# M, X3 w' L7 R% I4 d) J+ h
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
7 q& t. D6 r6 D. Y+ k. ^
: Z/ a8 Y8 X1 r6 S) Y, r' a& o4 H& z8 o- {
( V+ D' n7 F9 c6 b
static int report_error( char *file, int line, char *call, int irc)
5 |3 O' _8 J1 H" Q. m4 F# d{/ E" Q) O+ f" e
    if (irc)
3 Q/ n/ d, B% p9 N: `    {5 W( K# X6 {# `" u. F, n0 j) F; H' Z0 J
        char err[133],5 K" F2 g  K) ?$ T8 j- z2 A
             msg[133];7 _8 d8 Q# A; u" C
' i6 ^7 `1 b( {4 r  k
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",0 Y9 ]2 d- E; x) ^
            irc, line, file);
9 b- q" e- H- B% q6 A& l        UF_get_fail_message(irc, err);' U/ B$ n" n3 {/ R/ T! @

' u# f* o, [. }4 [- M        UF_print_syslog(msg, FALSE);- W2 L7 }' S5 g/ P6 [9 H# D3 v8 [% ?7 h
        UF_print_syslog(err, FALSE);1 ~; W4 z9 ~7 q, I5 z  J4 y
        UF_print_syslog("\n", FALSE);/ e1 M: {% {0 e) C# ]$ l% u! ?
        UF_print_syslog(call, FALSE);2 [! N  f  \, P& z
        UF_print_syslog(";\n", FALSE);  b$ C' ~5 d, b6 q
, P( D) g+ d0 b5 C! A
        if (!UF_UI_open_listing_window())/ {2 k1 z7 G* d( s/ L6 t6 r
        {, [8 ^. q% i& \  }1 K* O( c
            UF_UI_write_listing_window(msg);% g% {4 l- s( d/ C
            UF_UI_write_listing_window(err);& ]% H3 @5 Y& w
            UF_UI_write_listing_window("\n");
9 s) _1 ]0 ?/ @2 B1 v            UF_UI_write_listing_window(call);
# ]. |7 l6 v* g) N% R            UF_UI_write_listing_window(";\n");
+ c. w- M& M6 v3 c3 ~0 I8 d        }
/ U5 O+ I% l5 w" |# v' V    }4 i3 c/ J  z! w; {% s3 ?( a
$ \1 ~. {0 W9 v  L8 U
    return(irc);/ N; L+ {1 B& I6 c7 y# \5 W) i
}( e0 |- {9 R( {: ]# ]

$ _9 }& |6 q% J2 M6 F! }9 y0 f0 z* t3 X" Y; {" i" p* _" _
/*****************************************************************************: E# ?7 o4 ?+ v% M
**  Activation Methods0 D' Z# U  |. T( P
*****************************************************************************/4 V& f( H3 L3 w( y
/*  Unigraphics Startup
$ \! A# s' m" |! Z/ O7 d% K**      This entry point activates the application at Unigraphics startup */7 x' @" g& c( e5 B! T# U
extern DllExport void ufsta( char *param, int *returnCode, int rlen )( M5 I: d" ~% e
{+ o2 R" V7 O+ Q3 U; A
    /* Initialize the API environment */
# e5 |0 M: ?$ f) E# a    if( UF_CALL(UF_initialize()) )
, g5 L9 m0 J: Q( _) s    {
8 T1 m3 g: V) F. T/ Z/ \6 \2 z5 u/ l        /* Failed to initialize */
4 o1 o& x+ A% s+ @6 ^7 _' L4 H$ ?        return;
0 V, q$ C% X9 M' {% K    }
" ^0 G, g. T4 ]) }
0 X; _) ]# Q5 z$ Z' A; D    /* TODO: Add your application code here */  L; I) J% P- a+ Z2 u" K

" V* e: S7 ^9 P# J+ b- {/ I  E. S2 @$ }3 ]+ H8 E1 C& |& z

% ^  n) G/ D: c        char b[132]="";7 Q9 `8 D) \8 ?% r6 ?
        mmm(b);% ]7 D. G0 P3 u5 g
        uc1601(b, 1);   //在UG弹出显示框
  K( P. @" ]/ J& q9 ?
, a" u' t( H9 ]2 P2 V( K
" V. o; j, A" K/ O% |% k    /* Terminate the API environment */$ b$ I7 n3 u3 `( |  j
    UF_CALL(UF_terminate());7 C1 r0 W) h$ k
}
6 g3 b& o$ z, D% P/ [1 \( ^% _- ^
/*****************************************************************************/ P' W' X9 S7 U$ i
**  Utilities
" }# b& u, W1 c1 _  D. K*****************************************************************************/. b% u2 a4 u- J

: s8 h  t9 q/ m" W) m+ q$ g- K% G/* Unload Handler
& x4 K" E1 f# g' W! P**     This function specifies when to unload your application from Unigraphics.
1 \7 T7 J$ t# w) l**     If your application registers a callback (from a MenuScript item or a) G. }% T( u, y2 k8 ^
**     User Defined Object for example), this function MUST return
+ ~* I" w5 B& I**     "UF_UNLOAD_UG_TERMINATE". */
' {6 r# M2 z$ I; i- g- A; p% @4 |extern int ufusr_ask_unload( void )
  g& S: u6 l& V: a: Z{
$ Z$ C. E+ F, w2 k0 {4 @" u    return (UF_UNLOAD_IMMEDIATELY);) y0 K% _# v. i5 V( N' }& t
}
+ s( t' {: G: e& `& t8 M1 U+ d8 A! x  O
6 g) ~2 ?* F) w- ^4 ^; [

, F$ H- I: W: H( W* u3 s9 r
' J7 g0 B3 j3 s& j! r) u: e
& T+ R5 Z) E# ~6 r8 N
& w" }5 n+ H* p+ @  u3 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二次开发专题模块培训报名开始啦

    我知道了