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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
" D! H2 ^- ?0 p' [( G+ c+ }
) b. E/ y$ I. A% z  @) B★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用) t. x2 O$ J8 O; E& I& @0 j: h

+ o3 Z2 C; h! ~% h9 Uvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
) c# G+ A1 O- }9 j9 V2 ]) C, t8 u0 t% v( i9 Z) q) a9 ?' \
=============================================================================, _; l+ m- q: T* l7 \: H
在VC中调用VB编写的COM组件7 C1 p. z) n  A% n5 m
! q9 R; u3 v3 f+ G
梅雷 - QQ1821117007 ' w, v1 C5 b& ^, \& p8 p" W
亲测 XP、win7(32/64位)可用, H2 D4 O. R; T" \2 G6 j
! v% b; u! n  r" D& X. M
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
) C4 B/ j9 X$ R7 @为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 % x0 r$ }7 v8 b- H, Y( H
先说说VB开发一个COM组件。 9 O+ G( c6 {- _  b/ I; v
用VB新建一个ActiveX DLL 工程,
4 ~: u4 A4 F0 a# \. s然后修改工程名称为 MyVB & S( B4 e" Z1 ~6 y6 J* T
再修改默认的类名为 DEMO
% M) N& R& F7 G" B1 S( l) F5 J/ r& \0 y然后再向类中添加一个函数作为测试用,如: Visual Basic Code
+ O* S+ N- M# |/ M+ `# M7 D; Y$ i) d8 |7 B" J+ @  b
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
; v) [7 B2 F* a8 E+ \) J$ f+ D
6 A( Y, |+ ?3 t( I
, Q- @7 C3 \  Z. ~- u$ c
5 F) n) `7 |2 c  C5 b5 bDim str(999) As String
4 q6 v! n6 y7 v" q9 f7 G4 p# V( ?( g# k$ P
Public Sub GetMeiLei0() '无参数传递
: z0 d5 N, Y9 o: GMsgBox "梅雷qq1821117007": W  p5 q7 Y. g% E
End Sub% J2 \2 U. A& C0 J
& e! Q3 T$ Q1 ~. I$ b- ?
5 T. k$ K9 G5 A) i0 V5 C! H$ a' O
'带参数传递   Public Function
/ w1 g8 k$ w, S. m2 _  V) BPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
: w' ?9 F8 @, A' h# mstr(n) = str1
* q" s! O8 z. A9 f) z, x2 J( O% E2 u9 t! }$ _
If n = 5 Then
  U) C& r; r% \MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)4 i+ U# I  A$ t+ v: c
End If
2 @1 F3 k; v- e% S; U0 m
. U' d  l7 k2 F, T2 j/ I7 kGetMeiLei2 = "数组传递0"
1 q2 c/ ^- ?5 \9 I' e9 X- o2 b" s' q4 `
End Function
& ~7 x8 g% E* ]! g: g3 e+ C) K7 u" p; R6 b& R
, @4 I5 _0 D. Q- a& |
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
0 o' I3 I4 [1 {0 R( C
0 N( T2 V2 y5 l, C注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
$ g2 Q: C) m- C
$ T* J  _4 K1 D- t+ H& s$ r/ L+ o0 x8 ]8 R. q  e, |6 [
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
& Z' r9 C7 I5 x! ^& X0 s而 VC 里调用可以这样做,如: # t! H0 i- ]1 j2 K+ ^
Visual C++ Code
* g+ N" `+ V# n8 d  F# q, s0 S7 V* g- P% b% q& k3 L
//新建一个 UF程序,输入以下代码
. h) I/ N  R/ L. W- i1 n6 V: `/*****************************************************************************7 _8 N3 X1 R" j6 \! _& @( T+ C- [
**
/ L8 x1 x7 b% g' ~8 j  D1 X** C++调vb.cpp
9 S3 d9 j! Z7 |+ K6 _**0 C' c4 v7 R/ N/ |) G
** Description:* t; Q( F0 [% B- K3 a
**     Contains Unigraphics entry points for the application.
/ e3 }+ M  Q' x- z+ M! R8 {7 r**
$ b/ T. w; `: E6 I6 I3 a. a*****************************************************************************/3 g$ u+ y: r" g' K# ~7 z1 C
7 L6 Z& [% x. d8 E5 D- z8 N) m
/* Include files */; d9 W" L8 O) r- g6 y) A( Q
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
0 Z0 K3 ~4 T" m#   include <strstream>
% A- S+ W; k- {$ ^9 a6 b0 `3 r#   include <iostream># ]1 E* [3 c2 z, C. m3 k/ Y
    using std:strstream;3 s4 T  B5 O+ C7 u9 i) n
    using std::endl;   
3 ]% Y4 g" ?9 L, ~& |# O    using std::ends;
- V0 A' b" Y0 k7 ~8 a8 A. g* U    using std::cerr;
/ }8 O+ q9 a% \- q. B1 f#else
# P3 H$ i! k3 F! o#   include <strstream.h>
; g) N$ f* F( X  Y) u: W4 y#   include <iostream.h>) D: Y; V" c) R0 w/ [
#endif
. _5 F! s  s5 I& F#include <uf.h>
$ l+ w7 v; b0 g& u3 `$ L% k* k4 y#include <uf_ui.h>
6 z( p5 \/ v' @* _1 Z6 A#include <uf_exit.h>3 e* V1 V* _7 S: o3 I
#include <Windows.h>" n+ ]$ z9 W3 U' j% b6 {
: u+ G, V. Y  f
#include <string>( O$ p  k, ~" m5 x! a7 l
#import "C:\MyVB.dll" no_namespace3 i" Z/ t& X- Y0 d# u+ W( H
//using namespace MyVB;    //这里是COM组件名称
5 i/ F. ?3 R- d
1 Y# c- {  p7 }& \$ M4 I; y+ [7 x' \5 t/ h0 z! \
HRESULT ComInit();: G5 j# V5 A* E: t7 G
int mmm(char* str)2 O2 |9 V3 |3 L) A$ ^2 e
{
% c& l8 @6 w- z/ Q9 E6 E+ @( k        ComInit();
0 b. v- Z4 `- u8 W- N
. ]$ X. Y( `1 a# A1 i        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象/ V7 z; V/ I* \8 T0 c, B$ ^
        MyObj.CreateInstance("MyVB.DEMO");
3 H  j; g3 m2 T* K) O1 x! x1 g/ I0 s4 [1 `
        //MyObj->GetMeiLei0();//无参数调vb函数
. H' L6 N8 s, V3 {" H, ?  k# U' O6 n4 e: `! _- v, C- \
char str1[132]="0.0";
! X+ {. {6 `' `8 _$ v3 q7 T) U, a# e) W& E, ~
int n=5;
% m$ i. z9 a2 }* q1 O1 o2 t2 W. ?) u
* E! U6 G2 C7 F! w4 \_bstr_t vRsinfo1;
/ G! c; n; n+ Y; F. |$ c1 ^* C, l8 d, x7 m
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
' U) I8 R- z+ a% o' e9 W
( `' T6 `  c6 G* vstrcpy(str, vRsinfo1); //字符串赋值
# v/ U) u! C9 ?. H7 C5 s  ?( W" S8 X+ n, Q8 ~+ x1 s# S7 l
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
* \  j2 z& x6 E: o; _0 JvRsinfo1=MyObj->GetMeiLei2("qq",1);0 P0 ]3 ^# ~! ]3 n8 x( T! o
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);+ K2 O2 k7 y- P2 W5 @
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
- k+ @  |6 M; }4 dvRsinfo1=MyObj->GetMeiLei2("手机",4);! f( \  u( `3 E  ^1 K1 r
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);4 q6 Z; f/ X" ^6 T' W5 d+ V
        return 0;
" q9 y% w* }. Y4 a4 j$ Y7 M}
6 y" A% }# ?8 f* ]
- h  d) `7 u& OHRESULT ComInit()9 m) m* `; \% X
{: T' `9 j5 N4 V' S- K
        HRESULT hr = S_OK;1 U1 {, Z1 o$ c6 [+ [
        if FAILED(CoInitialize(NULL)); \8 y& ?" L$ ~2 C( f
        {
& ?6 L( [  b5 ~% L9 b                CoUninitialize();
' E. \! u4 _& k                hr = E_UNEXPECTED;
. A1 I8 f9 L0 K+ ^        }+ i! O8 W8 L$ B
        return hr;& v) `# |6 F9 n6 l) `" R+ p# I
}; e- j8 z8 H) C2 H5 y

/ Q1 G" R) v1 v/ I) k) j" a; P' [# p* h, A
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))% s2 {1 G6 L" A0 d8 D" t+ e- ?2 U) ]
2 E# b/ k' v2 O1 R6 W
( @2 ?, z" `# ^9 S: y, H. Z6 k
9 j  w9 P4 I  \( y) D
static int report_error( char *file, int line, char *call, int irc)
; i+ x7 A- b( m# p4 M( B$ t8 Y: w{
: H# R! x' O( i    if (irc)
: P3 \" B. T+ ]" c( a/ r    {
/ u$ g* x. u! p+ j; r7 J. o* G# y        char err[133],; o4 M. R8 p: K/ A  X+ |
             msg[133];
' {. q4 X- M* E" n! C$ o3 Q! I6 Y5 f7 L
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
6 [0 z9 Y& [9 b            irc, line, file);
( J' |" Y4 J/ ], ^3 E" U0 ?        UF_get_fail_message(irc, err);
) D; q& ?1 [% t+ L& e( y+ }# `) L# X5 Q6 a3 O8 e( b. x' a0 o5 o
        UF_print_syslog(msg, FALSE);; N8 o0 P2 Q3 e2 a5 v" k6 k5 b* _
        UF_print_syslog(err, FALSE);$ u1 G2 @' G/ `8 n+ K0 L
        UF_print_syslog("\n", FALSE);3 F* _. N8 E! v" V
        UF_print_syslog(call, FALSE);
$ C6 R4 E& B1 c. D        UF_print_syslog(";\n", FALSE);
: @3 A( R, }, d2 ~, q7 @6 l% U6 e! {0 A+ z9 @
        if (!UF_UI_open_listing_window())6 h. V* B& j- v* `" ?. c/ `8 z3 e
        {3 ~3 c; d; I2 G5 B( t* N3 |
            UF_UI_write_listing_window(msg);( e9 o6 S  I2 Y/ Q
            UF_UI_write_listing_window(err);
- {; _6 s+ o0 W+ [. O- l            UF_UI_write_listing_window("\n");; s5 L$ R6 T! O& a& P
            UF_UI_write_listing_window(call);
8 z. A) T( K# Y1 X# }% U% w1 E            UF_UI_write_listing_window(";\n");
8 @$ F- H3 z1 T0 @        }( {+ O7 P/ F6 I" e: s3 x
    }* N! }5 e0 M) v; \/ s# j0 V0 m( @

3 J5 e$ Y' L% r0 h- P. s, m% o3 u    return(irc);
. w) `3 ?+ b- c) ^. W/ ]( x}
. g+ L& o# ^# g6 X
% w; {, D# v2 |) f# y" f6 l4 w3 ]
/*****************************************************************************  s) I. s! _2 X% |8 h7 E$ ^- v
**  Activation Methods& A& c8 G3 v7 ^0 Y
*****************************************************************************/
  d! S/ \: e6 F1 @/*  Unigraphics Startup7 P6 ~5 X: ]0 I: R" J
**      This entry point activates the application at Unigraphics startup */
* F  e. R) B+ w0 c8 O" iextern DllExport void ufsta( char *param, int *returnCode, int rlen )
2 h- B9 t; H: _9 v- t  Y, O{. M8 `& h& {& g* F' z
    /* Initialize the API environment */
  e" V* W/ Z! q; ~/ U    if( UF_CALL(UF_initialize()) ) $ s  |, V; H/ G& T7 o8 X2 r) B  Z
    {  I& W9 d1 l6 k/ d. ]  M, x
        /* Failed to initialize */
+ L1 w: \+ z: X/ W; S        return;
* @2 s$ `8 }. V7 r; z% {    }  v( f6 @9 L% H# |

7 w* S- I  x3 r    /* TODO: Add your application code here */9 A: E" H* @7 k7 S7 m! C
  h. S: m0 B3 I* R5 H; x
8 _- [& O) W2 K0 f
" \# w3 A# q# C
        char b[132]="";
, \1 f2 m- C' ^* a        mmm(b);, @- v& `' x. x6 p, Q2 |& |1 p
        uc1601(b, 1);   //在UG弹出显示框
" }' r$ W4 \* R' f" ^6 L% G# G6 C: c6 j4 Z; S; D

, j  C. J9 f3 T! y3 P    /* Terminate the API environment */
- _2 x- B% Q1 H. f$ Q    UF_CALL(UF_terminate());$ q* p) i4 e+ K! G; s
}7 y6 q7 S" i* g9 u
/ L; n4 f. a- m# j, T3 o
/*****************************************************************************
1 i$ f  U8 ~0 ^**  Utilities
$ r; a) ~* _; |9 V* z*****************************************************************************/0 S- F  O+ o9 Q8 j
3 n- t5 v7 p) O* I8 r  V% f; \
/* Unload Handler
1 S) m. a7 L; ~& V0 I**     This function specifies when to unload your application from Unigraphics.. t, D' U! ~# T
**     If your application registers a callback (from a MenuScript item or a
; y! m9 ~+ X. O% T+ t- a1 b**     User Defined Object for example), this function MUST return
7 A* T7 ]. ^! J: Y+ B! B% c**     "UF_UNLOAD_UG_TERMINATE". */: j% l& z0 k3 t- P: w
extern int ufusr_ask_unload( void )- X& m6 a" H) M3 U" a
{+ _2 Z) Z4 o/ z( i0 B8 L
    return (UF_UNLOAD_IMMEDIATELY);
/ D; N7 E: F/ G* \/ Y. V}
+ G8 C+ \' p! p! Z( H8 D4 I# F: |! ~7 e

+ Z5 a# Z- ^9 r( @  J  c# [- |( X0 l: ^: X* [9 V; O

" n( \1 i+ F% y5 n* Q1 J$ ^! W, Z' b8 c5 Q
2 `9 F6 E" s% _9 m/ O7 u' W9 A
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了