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

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

[复制链接]

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

8

主题

10

回帖

146

积分

注册会员

积分
146
QQ
发表于 2016-12-11 15:05:21 | 显示全部楼层 |阅读模式

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

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

x
在VC中调用VB编写的COM组件" x7 V( j- D7 S( W

; v4 P4 }# e) N2 P  d' Y★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用. F% c4 r, a0 o, q  i

6 e  P6 e+ u- lvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
0 N/ Q' @+ j4 G! K6 n4 H* ~$ u, r" Q- L5 b$ f
=============================================================================. ]# |& s( |( a$ m( Y- n: |) j. O: T
在VC中调用VB编写的COM组件
8 U, h  ~$ d/ {$ }  V4 ~
- t! J- n1 s( \9 m1 X6 u梅雷 - QQ1821117007 % z7 B. s' ?/ H) `& I
亲测 XP、win7(32/64位)可用4 b" L4 ^) {5 G
( h' g) F, b: n  b0 o, _# i
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
# \7 n8 l, K8 i/ n2 x  ?为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
& S$ N+ `  x8 F3 c) Q: h& b先说说VB开发一个COM组件。 - C- T; @3 ?* r5 E# E' m4 \* {
用VB新建一个ActiveX DLL 工程, * b- T$ n: L1 a7 U" T
然后修改工程名称为 MyVB
" f7 ?6 P3 l( x! w再修改默认的类名为 DEMO
1 `8 K9 B* i3 M* ]3 ^% J然后再向类中添加一个函数作为测试用,如: Visual Basic Code. l& N6 ~( B' F3 [% q

9 ~0 p. D  f0 Y* u注意!工程名不能为中文不然在c++中会出现无法识别的字符串
0 J; e9 S7 G  \
; Q3 J5 v5 b( @1 X# _) x+ r! G; r( P+ s0 B* A

! [2 _6 M6 T* _' [+ EDim str(999) As String
% g% f, F( a3 B; X1 Y4 k/ o. R# J
6 Y1 q) H  c  a3 u( l% z+ I* jPublic Sub GetMeiLei0() '无参数传递
* w6 b6 u6 V2 g" q9 f3 T0 pMsgBox "梅雷qq1821117007"; s+ n  C/ R! j( B
End Sub
  Z& X# c0 U" W7 I, o' ?
6 I" U& P- g+ n) B- [! u' l
9 }% V( t: D& w( X* j'带参数传递   Public Function
" R. w. R) {# h% X: g" C8 d  L# jPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
( l6 \3 a( [7 [- f* n- mstr(n) = str1
" i2 V, @) N. v2 U: Z3 c+ G: Z2 V7 k  Q3 h
If n = 5 Then
4 g& n, S' F' f  o0 f7 JMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)8 k7 D' L0 X3 W4 O
End If
, q/ ]% o. O9 S* f& t
* t( V( I! j  A. s& A4 }, |3 YGetMeiLei2 = "数组传递0"
4 Q3 b$ ~$ a) L! }; z& L. n
7 T, D: [. p' y4 _+ U' r$ mEnd Function$ k) Y4 V, {, u" R# g

( J( n5 E9 W! t, W+ z
+ \7 }! Q: b( J$ q) A, s然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ; M( Q* N! g, y6 d+ f

9 P9 T9 l& l9 E: O注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
1 Z( K. F0 }+ O) Z
/ _# j+ N9 g2 c  @' N. b+ e
5 u+ T+ a' j: v( G! Y7 ~; e其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 7 D# d+ |1 \3 K
而 VC 里调用可以这样做,如:
# \/ ^9 M0 ^; S- Y5 ~+ WVisual C++ Code
, k1 e7 w' R% a5 d/ {  d/ n( o+ j9 U2 r) _
//新建一个 UF程序,输入以下代码
8 }; N$ k5 t& \6 v  S: W' @8 h/*****************************************************************************
, p6 U. A* {5 t# B  t7 Y**: f& H8 l1 p- p3 h; A
** C++调vb.cpp
# A$ @( b; _9 u" @  k3 R# h**
: X8 l9 N; `9 Z7 M+ C9 w** Description:
0 W, ?, s3 Z: W$ z**     Contains Unigraphics entry points for the application.
1 Q/ q1 g; d9 N+ G+ u**
; r. D0 x6 x9 X; x*****************************************************************************/
! D5 F. o( M' [$ h9 v* e3 y% d- f9 ~( k
/* Include files */
0 Z9 ~5 g4 J; p5 j+ o3 k#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
% `, E. ^: _5 O( T; x1 }#   include <strstream>: K# ], r: P; J
#   include <iostream>
7 |2 b3 ~+ w' U* |5 q    using std:strstream;, Q2 O2 r8 f/ c
    using std::endl;    , @/ |: S+ C) a4 A4 x( Y/ P
    using std::ends;0 ~% x6 l" {- n, O0 w) u( W* [
    using std::cerr;
2 c2 S# j( B: x+ {1 J9 M  a#else) }4 U3 o, G/ |( j# T2 L! Y
#   include <strstream.h>
: I) Z9 O) v+ C/ Z; I#   include <iostream.h>
! {( j% y6 [" I#endif# R' m: K  V+ T8 E1 n
#include <uf.h>+ |. {# T! o* ]  Z6 r  s2 Y1 V; K
#include <uf_ui.h>
. Y9 L- F. N5 n( `- G#include <uf_exit.h>
. r; U4 x- z6 N5 T" c+ q#include <Windows.h>
8 m: \2 B5 k: T7 M7 Q0 y* |! `( a
$ t+ D- W+ _1 y' |$ S! ?#include <string>3 j" r7 \  _9 D/ R" j" F, a1 j7 M
#import "C:\MyVB.dll" no_namespace' O7 I1 a: e4 o9 ^& c+ F
//using namespace MyVB;    //这里是COM组件名称7 a' I& U5 C' O1 V; Z) M

0 ~8 i; ^2 I& [& ]  @3 E9 d% g' |5 C2 v6 K+ Y  k; W3 |& n
HRESULT ComInit();8 K+ E; W# R' f4 v' u
int mmm(char* str)/ Z1 `) K8 O8 G% k. c
{' |# H7 ~! w# X5 m
        ComInit();( d* }" W) c( g# w8 N' s: ?
9 o; y, }6 x: |
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象8 v7 Z+ r' H) m! P
        MyObj.CreateInstance("MyVB.DEMO");9 B, o+ h1 a6 F& E  }& O$ H+ X

. S% V  @6 d" S4 R9 a. Z- `        //MyObj->GetMeiLei0();//无参数调vb函数; W# N) I* @; {
2 Y6 p' L3 \* S, J" m  R( w; M
char str1[132]="0.0";
& r$ j4 K7 x" b: g7 p8 N' k4 U) Z* I; n
int n=5; + R* t4 |2 K% J( J8 n" v$ N
% b9 E% T% i  w9 _& }5 _
_bstr_t vRsinfo1;
- q% P# E  h4 q$ s% U$ f' g( ?
7 K2 E8 I+ S2 W& JvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传+ r' M1 W$ X% ~9 g, M
6 c4 ?. J- a' S- f& o, b0 T
strcpy(str, vRsinfo1); //字符串赋值- }3 X9 }& B$ y' Q5 f
' I: r: ~; H& Y; L% ]/ {+ Y2 `
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);  M1 i5 [/ e/ T+ k$ S4 R5 |
vRsinfo1=MyObj->GetMeiLei2("qq",1);
% P: x5 X( ?) R; S" \( g! @vRsinfo1=MyObj->GetMeiLei2("1821117007",2);' Q  k' r  G: e! D4 l9 I- Z' R
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
2 w! D: \' _6 g& a  GvRsinfo1=MyObj->GetMeiLei2("手机",4);7 ?% ?; s, b# A- l/ h
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);  w' a7 U( G/ i- D4 m
        return 0;
/ l3 w" v' O$ Z, p}
; n: X$ }* o# z' _% @* s3 V% K% c' i8 O9 _5 `. y4 h6 {
HRESULT ComInit()3 I9 L3 u0 e& J; B* P
{
; F0 u- ]& A' ]+ C/ P        HRESULT hr = S_OK;0 B! d, D6 k$ M, t$ Z# ^% r
        if FAILED(CoInitialize(NULL))
' t" U' P/ V& l1 G/ }- g' x        {
& ]+ I- E4 k0 a: D& E  E                CoUninitialize();
5 a  o& I( Z- [9 B                hr = E_UNEXPECTED;1 W) H4 K* q$ l
        }
2 D# i8 N) d3 q1 a8 [+ u4 q        return hr;
' ~9 L. E7 I6 |( Z# ]" Y}& A2 h+ @7 T% z7 V

3 n! V+ S5 N4 Q: s  P8 M- H0 g
% D6 D5 Z, O0 E2 D' J5 A#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
8 {4 ?" B9 G# J% n( J3 b0 C) Z: \+ q) y

5 J: L: v5 N' a/ S! n  h2 s" L% f( n5 ?- }
static int report_error( char *file, int line, char *call, int irc)
8 g) H" ?& Q4 A. X8 q, C3 h9 S{; h: [2 H5 w" P. b3 d
    if (irc)
! k+ v$ E: K& ^8 \, q    {9 R4 B" c: i! `& f
        char err[133],. Y$ O. |+ C" `  Z1 I" G5 M
             msg[133];8 f. r; N+ Y) L4 e
4 H% Z. r! }& J3 f! i
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
# \9 m6 u+ Z' r2 J3 u            irc, line, file);
6 S9 k* K2 y& Z7 [+ u+ \& ^: z        UF_get_fail_message(irc, err);
% I" W: l, V, {1 V: N4 [" }6 h6 {" L- V6 M/ p& U' ~* H; g
        UF_print_syslog(msg, FALSE);4 [% H: c% K+ w
        UF_print_syslog(err, FALSE);% v+ J+ U' }$ |# E* N/ z
        UF_print_syslog("\n", FALSE);
& M; X1 \* `8 D, N6 @        UF_print_syslog(call, FALSE);
: p1 |3 \1 b- C. B. W% ~        UF_print_syslog(";\n", FALSE);
0 l" V' V' G; s( x8 n1 q/ H$ V! ]2 [, T' o
        if (!UF_UI_open_listing_window())& p; K5 Z* s  w$ I' j$ i0 I+ W8 z
        {, u1 G4 u) j" y* q# U9 Z
            UF_UI_write_listing_window(msg);
5 F( X: J. `" t& @% A            UF_UI_write_listing_window(err);
( t* C3 y- H8 C  L( H            UF_UI_write_listing_window("\n");0 d, Z/ C/ G# E; x
            UF_UI_write_listing_window(call);
2 H* h7 z5 j* z( r) w6 P            UF_UI_write_listing_window(";\n");
( u; C/ r  |4 x- z$ m% R        }
0 u; Y$ H( V. q( t% b. y    }
. {) Q; _# |' P+ P- \' d/ o5 N1 V( O3 x. g! R2 c+ i
    return(irc);
0 f! s* S& ]! b4 z! R}; A' v$ x, ^# Z7 B8 f7 D- y  S
! H' t6 y; i# y& C# X! S
* u# f8 R9 }6 V+ n  |( J: f  m( T
/*****************************************************************************# P0 O! {3 p* F( E# P& }; O1 h
**  Activation Methods
) w8 y# l5 }* x: t; t*****************************************************************************/
* c. }% T7 B/ Q% A& u( s! Y2 {/*  Unigraphics Startup  j5 z- [+ T" s1 |$ T% g
**      This entry point activates the application at Unigraphics startup */6 D  I6 \7 `. Q+ `. Y: P2 i
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
5 Y5 ]. v, |3 @6 Q{, L( ^& _& ~( j0 i% l
    /* Initialize the API environment */
7 o6 q  v, e& \+ e    if( UF_CALL(UF_initialize()) ) # d' {- @4 s3 g9 a
    {8 \/ q" m9 M( R3 {+ U' l
        /* Failed to initialize */
; z% I" a! a4 y& R. p5 p6 Z' l        return;" \  |; W6 K8 O. p" [' b1 G
    }
0 g& E5 D; m9 H: r7 N
3 @( P6 S1 D" t* R    /* TODO: Add your application code here */5 {' V) v1 X2 e2 z

$ g. c0 N7 F" j7 r" C( D9 |7 p$ N  h$ \: y) f; r. Y( A- K

, {; a7 Q' c" e/ D# j0 p) n7 H  d, ]- o        char b[132]="";7 o5 |8 o+ _5 o  g
        mmm(b);
9 i: O- d& \- a; I; Z' Y$ P        uc1601(b, 1);   //在UG弹出显示框: _6 [: w5 m; v7 D- s, ?2 r5 X" b

" Y( S) c8 A7 \  X; x- A7 {4 o- g, w/ }$ |* b. j* B1 O
    /* Terminate the API environment */
$ Y/ N# S9 i. P1 M. O    UF_CALL(UF_terminate());6 A1 R7 I5 I; J/ J# v
}
: N- H; Z; t) ]# D- k
+ D5 |, |7 B( n: G/*****************************************************************************
0 I4 p8 @/ S  H* v**  Utilities# x* X+ w( y, L+ M% g* U7 c
*****************************************************************************/
6 u: u8 E( P* a
0 ~! s  B6 u- v0 V& n. M4 z/* Unload Handler( S7 F$ u( e0 ^
**     This function specifies when to unload your application from Unigraphics.
) K! p* b' h! S8 t1 T  K' G8 h**     If your application registers a callback (from a MenuScript item or a6 p5 Q1 T1 r3 _) f0 g- t
**     User Defined Object for example), this function MUST return+ w2 ]: o/ U( F! u5 {. W& f8 Q' j1 j6 J
**     "UF_UNLOAD_UG_TERMINATE". */- g  W8 ^2 b! w+ M8 K/ }) ~
extern int ufusr_ask_unload( void )
- R  ?1 W' p3 a% V{+ X* f6 H( A# {
    return (UF_UNLOAD_IMMEDIATELY);
9 v% \! S4 |$ {  R}- v. a# P  m& C- N5 K% v5 n1 T
2 {9 ]) X- K" _+ i6 q
, n/ @7 k* }$ W' c
$ H9 c, ^# p5 d
) j, {( {) M+ V

; T. P& O  R8 B9 z1 V: K6 ]- q3 W" z9 b8 [
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了