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

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

[复制链接]

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

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

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

x
在VC中调用VB编写的COM组件/ d2 b0 l; @, l1 H. ^( d, A

$ K" D3 d2 K- ~0 J0 f9 r8 ~★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用# l' ^7 K6 A% {6 _& M# I+ L

' [$ g; {* V2 v6 n$ ovb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
5 p# E" U$ r1 j9 i- R
; k! d' o" f/ L$ R2 ]=============================================================================% A  x) M: f) y  d, C7 U) C$ |
在VC中调用VB编写的COM组件  y. {# j+ P/ `/ \% q% r

; m6 ^% K, \4 X1 B! ~* R梅雷 - QQ1821117007
. Z3 |/ G. d) k+ c8 F亲测 XP、win7(32/64位)可用+ r- I4 ?+ ~: ?1 a8 I9 k
/ o8 T3 t  z7 _# p( H2 R! y+ u( S( Q
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
7 Y5 V0 V: q6 F% \为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。   c  f8 T/ H4 ?5 F# d9 g* v  O& j
先说说VB开发一个COM组件。 5 o/ ]# f% n0 t+ I0 M
用VB新建一个ActiveX DLL 工程, . w8 a: e% I' Z5 x- X2 M* B' m
然后修改工程名称为 MyVB 1 H4 T" X- {& i7 ^
再修改默认的类名为 DEMO
- L$ o0 V( E3 i! C* d# u8 a然后再向类中添加一个函数作为测试用,如: Visual Basic Code: ?4 h9 j. E& l* @7 F2 P' H  K; }5 B

5 i/ w$ d" r# I! p7 U% V+ h注意!工程名不能为中文不然在c++中会出现无法识别的字符串7 P$ K$ v: K0 n# i
4 w9 v* v0 L3 V9 C6 J7 ?
6 u7 u; u6 ~. B8 T' j

  Y/ g, a$ b, N9 X  x! G) Z  QDim str(999) As String
8 Y4 I2 f7 M; C, k) K, y* x3 C% p, T0 z! u+ C
Public Sub GetMeiLei0() '无参数传递. x# |# s6 \6 Z# f
MsgBox "梅雷qq1821117007"! R" q0 b! U: a/ A8 T8 K
End Sub  v3 j; q) L5 u' ^- I+ I
2 [( ]0 t' Z7 h

5 h4 E( Q& i' L'带参数传递   Public Function9 J' \8 _" d+ N3 |  ?& u
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String5 W# h; i- r$ |5 X# T# n6 v
str(n) = str1
- w$ A5 n6 j9 }- o( N( i& q, m# A1 ^5 Q0 T9 D% {8 E& U( ?2 L9 d
If n = 5 Then( I" x4 W! Z$ O/ T
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
" O5 F4 O& p/ e! C! ]3 a( n7 |End If
2 o% k8 ^* a3 ?; K  a* d, S3 Y3 \; w$ [* W6 q9 ~. y
GetMeiLei2 = "数组传递0"% I1 u5 A! r. L, x# o7 \

& |; _* N% u5 ?6 @1 ^End Function
$ c" f6 c; l# b6 u+ D* ~
. X$ `. r6 j2 ^1 r$ V7 e
0 H6 n# A& [3 I. L/ Z# i然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
, M, Y+ _) ^/ x/ C4 @% V3 G. j
9 `( A! Y* X" h) n5 v注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
% p( R& C8 o/ ^6 S) t' k% F% X$ t5 q) A
- E" E! p$ j# @: y* ?" h  P
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, : n. e: S0 R3 j
而 VC 里调用可以这样做,如: + j* n9 Q4 P  E' v, C) E
Visual C++ Code
' F+ S9 g- Q  E, a2 y+ N
3 K% v4 N0 v9 P//新建一个 UF程序,输入以下代码
: N4 B7 s3 j1 ^/*****************************************************************************8 e- ]% |. `! t2 T& b" b! f
**9 ?. _$ |7 n; q. `9 p" |$ g
** C++调vb.cpp/ Z( `: n6 i, y3 u  P
**
9 b; W+ C2 z& F" k4 ~* B4 u** Description:
0 ^7 E; u& i4 B9 d  u; B**     Contains Unigraphics entry points for the application.
8 W( P/ j, n& W. V**2 ]- A# X' V) w( q8 W
*****************************************************************************/
' a7 [- L( }. F6 V6 T' J# `) B7 ?$ Q' V# u! M
/* Include files */* z( \' b/ R- q+ |( [
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
% J- m- r" z* w- x#   include <strstream>
8 b% ~4 k. p8 k* p! A#   include <iostream>
8 [" U) D, M' i. a3 I, U. F    using std:strstream;
6 V& O! F1 i/ W4 h* r0 [% Q    using std::endl;    0 L! b. ^' u0 }
    using std::ends;
  Y  i; a, ~$ `- Y4 T' d    using std::cerr;
4 F$ ]* X) o, Y#else
3 \* |" w8 D+ V2 r2 a) ~$ ]8 S#   include <strstream.h>
, h. @' v; g8 ^7 y) y#   include <iostream.h>
, Q9 o+ j& n5 l% _6 S& [#endif
3 h& `* t2 A/ M& [& T7 c4 q) D#include <uf.h>
& p# N) N4 m0 ^9 P1 U7 L#include <uf_ui.h>/ g# k7 z- P# B1 Z/ e* t
#include <uf_exit.h>: r. ?& B' _& P# I) n
#include <Windows.h>
) h& I0 s; j# q! D2 _; u+ i( F8 Y2 C3 e0 J1 l1 q
#include <string>
- |& A% R& h1 z8 `#import "C:\MyVB.dll" no_namespace
  ]. J/ @# R2 t! i5 o% j//using namespace MyVB;    //这里是COM组件名称9 n: y" W5 |6 N& s- ?

2 ~, L/ R8 `/ {) o, `$ e2 x5 ~! Q' D6 [6 k. J
HRESULT ComInit();
2 E* |0 t- B% V+ \8 h6 N9 R% {: Jint mmm(char* str)
. r; O. q' B# b: P9 N0 @{
0 G) o1 _, @( y: a/ _4 ^/ G        ComInit();
: P2 d8 t! K) a. R* {
% e' M5 Q* }  S/ {        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
$ o- O9 ~" Y& @        MyObj.CreateInstance("MyVB.DEMO");, R+ |6 c3 S, D& V) [: N) X$ t
* p) j$ [* c6 ?' o% y
        //MyObj->GetMeiLei0();//无参数调vb函数4 h5 I8 V- \/ V  }

6 r* D; @$ c# Z  \3 W; _1 ?char str1[132]="0.0";
! |, b; f: q3 H8 D, {
8 D" M) ^0 W  [, u4 p& k" uint n=5; 6 \& |2 F4 u$ \- R. d
' d$ X! F, @! J5 \
_bstr_t vRsinfo1;5 p; A- p* B# Q8 z  B9 C

' |7 v4 z/ w+ h5 l' l3 FvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
* f8 O: z  |: e2 j% p: C- V- A) |9 r4 b4 ^8 ^& ]3 o+ y
strcpy(str, vRsinfo1); //字符串赋值
8 t& X2 }  Y' s+ t1 H
! L7 z2 K6 m2 N& f4 BvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
. p' |) W; t, z# [vRsinfo1=MyObj->GetMeiLei2("qq",1);
5 J; C7 x- e" `% LvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
# o- B. U; `  KvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);7 \5 m7 u/ z8 }* v& t' @- K7 a
vRsinfo1=MyObj->GetMeiLei2("手机",4);
$ F! v( K: {4 WvRsinfo1=MyObj->GetMeiLei2("15757753770",5);
5 }, c! f3 a4 O6 D. y! B        return 0;( P5 K6 D$ P' u! T
}
: W7 k2 B1 w. S% F! Z- u0 Q5 e) O, j: N0 C3 K) S7 z( T
HRESULT ComInit()
8 k0 u, I9 t$ z6 x2 [/ K3 j{' L: `5 ^: o1 o' `4 a0 Z) a$ I! o
        HRESULT hr = S_OK;
7 A$ T# d4 R' H; W! K        if FAILED(CoInitialize(NULL))
( P4 K2 U0 U/ h/ Z+ H        {
- j9 n. o: G2 Q- Y1 L" H+ I                CoUninitialize();
! x0 `+ [( }9 A! p) f                hr = E_UNEXPECTED;
) c: i% r: C3 {6 U4 \% _: ^        }
6 m. }* A2 k) \' b        return hr;0 r: E8 j: u' u
}2 n. v* ]0 H' A( s4 m" n
4 [3 f# ~( F, m+ B% s/ e# l0 w

5 O1 ~9 y# }( |. h! {' g#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
+ ]2 `- ^' o8 N2 o: {# ?, U: B5 F% O" r

3 ^3 @1 K: r3 K& V7 y( Y; d4 i! R4 M8 Q1 Z4 H. R1 E; w
static int report_error( char *file, int line, char *call, int irc)
8 C( F0 l. I$ O7 H8 k! i" _& [+ E6 e{
9 c# \/ S* P. B0 [" F0 H    if (irc)- Y. F! K2 k: a0 t/ f4 U9 j
    {
8 k" F" X4 S: e% m        char err[133],
) K; Y  t' Z& c2 b$ ]             msg[133];
* F. x* S/ Q7 q8 K2 H6 j1 g( |. Q- s' P" w) V8 C
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
4 u9 Y% D2 X. s0 n& j8 v9 ^$ Z& z            irc, line, file);, Z$ Y4 b5 |) j: X' f
        UF_get_fail_message(irc, err);
, x' |! I6 d4 C% j4 _
' C9 G' |: I; Q! w# u4 |9 M        UF_print_syslog(msg, FALSE);
4 q  @3 M- G, y  W5 @        UF_print_syslog(err, FALSE);
- z' T4 t* P5 G' [# N2 h        UF_print_syslog("\n", FALSE);8 s! `( h* }5 l/ x: \. A9 u
        UF_print_syslog(call, FALSE);! B; R7 o  x' l3 N
        UF_print_syslog(";\n", FALSE);2 W+ A/ t- R8 a# K5 ]

  A" ^8 i+ y: R" R8 U        if (!UF_UI_open_listing_window())
  O: l. k) b9 N  X! F        {5 _5 c2 F: Q/ c1 v* O8 d: |" T4 L
            UF_UI_write_listing_window(msg);
5 d! O1 P6 A9 \3 T3 {  q            UF_UI_write_listing_window(err);
- B2 D' s9 T( g3 G. X6 i" v            UF_UI_write_listing_window("\n");3 E2 n4 j: i8 K. ~9 b
            UF_UI_write_listing_window(call);/ Z9 k. n- ~1 q: E+ W
            UF_UI_write_listing_window(";\n");
. ?0 _+ |1 f9 o5 U* J6 G        }
( o& L9 Y; T; v1 h$ W1 Q: {    }% j9 y6 R$ V1 a

& u: s" V7 z1 v" w( o) O    return(irc);
# P! ]4 y  A! H7 v+ O6 C, Y}
7 }; ]. w1 K5 A6 h: C; b$ n9 o! b

: o' p7 }" R% p" H3 S5 K/*****************************************************************************
" w' \' D2 w" {: v4 \**  Activation Methods( G/ ~# V0 k' C5 a. w! T4 D" ]: x
*****************************************************************************/1 s4 K4 k9 e4 A8 P0 b; L4 S7 v! c
/*  Unigraphics Startup
$ Y7 A9 Y; z% R**      This entry point activates the application at Unigraphics startup */" W- Y* g4 P; F& L4 M
extern DllExport void ufsta( char *param, int *returnCode, int rlen ); i5 V1 W$ y$ r! N
{* @( {3 C- S$ ^# P! o
    /* Initialize the API environment */
; Y& E) K; o. M! Q. U( a    if( UF_CALL(UF_initialize()) ) " j5 t  r8 s, X* G0 \
    {) @. P5 e3 p. E* j
        /* Failed to initialize */
. i' h* ~2 p0 r9 H        return;; D2 R- O8 \0 q
    }0 M1 w: T$ F" e* B: N- J- l5 a/ P! c+ r
: i4 g, A9 }" b" x7 H* s7 Y! {
    /* TODO: Add your application code here */; S9 i6 G  ^' Z1 |
* X3 x; k0 o; P
# U6 f0 S" ?$ |! s% j' z/ g' }
$ `1 D0 P. e1 w# D" P
        char b[132]="";' U# l2 X' _  `0 ?
        mmm(b);! f6 O. S) t! q" f# W
        uc1601(b, 1);   //在UG弹出显示框7 y+ S7 k8 ^8 |" z6 V

; N$ {3 Q( ^* T+ W* F7 S7 b  A, m3 a* V; |3 b1 C) @) E& K1 k$ m
    /* Terminate the API environment *// D( K" {3 f' @  L8 e
    UF_CALL(UF_terminate());
4 k0 X7 T9 r! Z* r) ^}* I* _6 X7 f6 b) P4 }( v

+ _( u! D$ K; t8 I5 l5 ]/*****************************************************************************
& h6 }/ i& Z' l7 {* @3 D+ y9 p**  Utilities
7 z/ ~% Q1 C+ p- y+ R8 M6 R*****************************************************************************/
6 b$ Q6 u1 n% A: e+ Z: q& X! p
% u& b4 s- v: A3 T' u/* Unload Handler. Q* p4 t& I. Y9 @3 s
**     This function specifies when to unload your application from Unigraphics.. K4 o9 r- f+ z- E% M* @% s
**     If your application registers a callback (from a MenuScript item or a4 L$ m# z4 O( A: c
**     User Defined Object for example), this function MUST return2 ^& W! H; P4 F* H+ x7 ~
**     "UF_UNLOAD_UG_TERMINATE". */
+ G; G% s( S2 [. V4 ]extern int ufusr_ask_unload( void )
  D, R+ l$ [5 W{
, @/ B& s( G. n    return (UF_UNLOAD_IMMEDIATELY);
) [! M0 I! k9 i+ H& \}
8 L, d1 a! f" V3 F' _
! s: n& x+ T6 _4 C" g: }/ W/ E& l$ f) D4 b" h
+ E$ Z$ W8 C1 B, e2 M& u/ h* b
: T) G. p. v, J
" C7 F+ ^8 K+ d5 K) h
& A# o, ~# n/ m$ e$ ?- E
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了