PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件9 m6 q5 s, q6 p# t! H9 W. w
( _+ T# S3 }0 V6 t0 e3 D8 S) {
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
4 z2 X; ?, G: |# M' ]; B
7 l3 {3 C) e5 _vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
6 e4 y! b/ v5 y: L8 C8 f$ O4 r, H! i. U& \4 I" z/ w: t* w
=============================================================================
- {% D) K7 P* B2 B在VC中调用VB编写的COM组件
  F% M% j$ _% o8 O- d( h/ S
8 V- w! Z( n  t$ L5 u/ a梅雷 - QQ1821117007
* I' e/ P% d- r亲测 XP、win7(32/64位)可用
8 X% @0 c1 y/ q% v: F5 ]2 p' j  c; s) |2 s4 p9 Y) h1 @( _
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
7 T- x) ?& p+ J$ }/ i  m' y" ?为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 : m+ n5 f" e* b+ M
先说说VB开发一个COM组件。
# R; v! o/ M5 d9 D用VB新建一个ActiveX DLL 工程, 9 w5 Y$ _! \1 T' f# `# v
然后修改工程名称为 MyVB 5 V! D+ j# K0 n+ v% v: y8 m
再修改默认的类名为 DEMO ) ]1 g% I. m* ~; `/ \
然后再向类中添加一个函数作为测试用,如: Visual Basic Code5 L, b2 f9 f+ e) Y& Y+ I

2 x6 N7 L, |) w' o- c注意!工程名不能为中文不然在c++中会出现无法识别的字符串/ d( ^1 H6 Q" C9 R% v0 K) A0 B  `
+ w! R/ U* k- l, w: ^9 ]) E9 l# L
' l, D. i9 Z! z4 }8 y) T

. a# V/ T% j: y. E5 f/ {& qDim str(999) As String
  a' ]5 F8 j2 Y! A, I+ ]* B- _$ B, \- u+ X
Public Sub GetMeiLei0() '无参数传递! E4 x* y4 d# e  G7 G
MsgBox "梅雷qq1821117007"  T+ X6 g' p. k0 M
End Sub8 [* @) h+ W/ f9 M* d8 K

- q- |$ j3 f9 K0 n3 M% ]" A: ~. I9 c5 d& I+ _9 V$ U
'带参数传递   Public Function
& K9 A) [$ Z- M; A& \Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String4 {. o+ [- P# N5 R9 O
str(n) = str1
5 K/ c( _1 G1 T
5 X0 }, }- x! DIf n = 5 Then1 r& x0 o. ?" {: D0 M
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)$ l3 t0 _- m$ h- t, J2 F1 S: T8 w
End If
3 `, I$ F- i& Z% W6 A8 J
' k% y% k0 a) J; [+ z( v3 bGetMeiLei2 = "数组传递0"- f3 D& h2 r, b$ s* S1 m8 [

/ M: A0 S. G; `6 d+ gEnd Function
* S$ I; C6 V4 V; d; C  S- y8 [0 D( y2 w, S9 r; i
4 z+ p  S# }1 a; H! u
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
9 M! k: u( r$ [  Y
" j9 L$ w8 X: _1 K# b, m; e' G注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
" T, _. G  l, _( p  }* a- K  }
$ R/ ~( \3 d; Y; X% z, \# h  I
& Z) D, ]3 u* p# Z' ?其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
9 F1 f+ a4 w( E/ T; _而 VC 里调用可以这样做,如: 2 G+ n+ x1 v; W5 U: ~
Visual C++ Code 6 F" b8 c" E! d* Z( Z  R7 t
" Y# w$ d. l5 `+ ?0 [. F
//新建一个 UF程序,输入以下代码
4 P8 E: E- a/ P/*****************************************************************************
( a0 D  {1 f* F6 ?' r**
: m2 S- @; j" o  @$ y( [! _** C++调vb.cpp2 m1 @( {1 ]2 q" C3 Q' V7 o
**
+ u- N, d+ A3 C2 _  a** Description:0 x6 }9 ~9 T6 X4 W- _
**     Contains Unigraphics entry points for the application.$ ?7 ]- z4 f6 }  }3 O) G
**) P: L; G" V+ U# U$ }0 s2 j
*****************************************************************************/. `' D0 U3 m8 m" S) v  _) D" j7 ]

, }  U0 @, R" [# G  n/* Include files */7 }! A! U2 t7 F' i8 r2 C
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
8 e, Q' d4 R% T( ^, u% e#   include <strstream>+ n0 M' `" A2 i- o( b& b
#   include <iostream>
6 [- u: C. k* ]7 z    using std:strstream;
+ P  ?  z5 A8 p+ f    using std::endl;    # j7 t# U3 d4 w
    using std::ends;
& n9 K( m- v+ v/ k' E1 T# H  u    using std::cerr;
: l/ N" |. W7 V- S& N2 y#else
- {8 w9 x7 n- J( D; p( P6 k#   include <strstream.h>! F) j( i/ J9 A0 G% H5 r
#   include <iostream.h>
& s+ v; O4 i' Z4 k& R" a, Y#endif
) p& @! h% G6 S+ }#include <uf.h>- \8 m. l: [* A; D) q
#include <uf_ui.h>
2 ?3 P. O- c( G0 s% `2 h#include <uf_exit.h>& o2 T7 u! l: Y8 m6 m* I0 _2 p
#include <Windows.h>" `4 S/ }) q- d$ L6 S# Q
3 T0 c' ~' U# T, Q- r- y
#include <string>
9 {7 ]% U, A$ {0 A( E( @5 _#import "C:\MyVB.dll" no_namespace$ |# c+ t' X1 \9 x/ r
//using namespace MyVB;    //这里是COM组件名称
; W+ r' Y' U. @2 q) N2 T. h7 N! }0 [- |, r6 j  |
# ^9 Z3 \5 s/ Q  Q/ ]8 C
HRESULT ComInit();* F$ |) K5 S9 y9 B; q
int mmm(char* str)( v$ D& k: e, o* Y( s) P$ V" F
{6 B; g) h- V, y8 M8 M  n
        ComInit();# C5 B% a5 o5 c1 \

  v. ?2 o! P$ {/ T/ v7 G4 ?- w( t        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象/ A2 H3 ]8 g0 ]- s' L( \5 R4 y4 b
        MyObj.CreateInstance("MyVB.DEMO");
8 W: v* T6 ?# @" U3 Y1 N0 e2 N* M  ^4 S6 I( o
        //MyObj->GetMeiLei0();//无参数调vb函数
- i/ i8 `7 G+ f6 j0 q3 e% H8 C9 D4 M, l
char str1[132]="0.0";: I6 O" Q' y, \5 f$ R/ o
2 s9 M& g/ D9 a* _' z6 A$ ~
int n=5; " E, g2 k$ ^# Z2 ]# ]4 o/ {& T
$ l8 k  ^) L- m! `) |2 B
_bstr_t vRsinfo1;$ {6 u# e) f' I

. z1 {7 v1 d" U* t. w5 jvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传% r9 G; Y* ?& D+ K  A" [! x

) D; L, l$ Y2 I* ustrcpy(str, vRsinfo1); //字符串赋值
" |* O6 B3 X6 I
5 J7 \- E, m1 x" Z/ w/ B9 q& w0 OvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
# j8 r# X  L% w0 }9 nvRsinfo1=MyObj->GetMeiLei2("qq",1);
, e# v. E# W# K2 ~6 A: AvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
2 O+ @) G3 ^4 f4 rvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
4 v- U& w3 c4 mvRsinfo1=MyObj->GetMeiLei2("手机",4);2 ?6 D1 \* w/ y: Y- K. A: u* Q
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
3 z7 e& d1 N# a5 p- u) N' d3 {        return 0;- t+ A4 O. ~. M* f% x
}2 |& [3 j# E8 b6 B1 `; i

. H6 }4 P  l6 C2 z7 O" U+ pHRESULT ComInit()/ Y0 E4 J8 T6 m5 f, @
{
; n- o* m! `$ k7 ~9 o; i        HRESULT hr = S_OK;
% k. Q( [1 P  Q/ x) u        if FAILED(CoInitialize(NULL))
' g; a# ?. x. v( y  W        {/ Y* P/ o9 I( \! z! Q
                CoUninitialize();
7 s4 x# V8 d9 a6 Y2 {& B                hr = E_UNEXPECTED;
5 {- e" ]/ T6 o+ p( k9 Z$ n$ L        }/ o1 [/ C7 `5 K$ E/ O! U2 Y
        return hr;
- X( u. s: H: u; u3 e}
+ p  ^5 p* i! f! p. @! N3 I2 i: k" D: {" T" h

3 W# G- S/ k! ?7 G- s0 u#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))/ f2 z; J, ~+ M% {  S" l# J

2 Z9 p: `# G" d6 d* l5 ]& ?
4 M: q! ^  J" d
8 @0 ?7 m7 Z- h) J' E: ^* c- `static int report_error( char *file, int line, char *call, int irc)/ ]3 Z& I& ~3 ]7 y- X
{
' c. }( j$ }( u9 a$ a5 G    if (irc)7 M: K4 @3 f2 v+ Y7 J1 c- h5 M- j8 O
    {
( X" W0 t/ v9 o/ b        char err[133],
7 }3 H3 n5 J+ _1 [1 m             msg[133];
2 w1 ?+ i7 `. ~6 E- S' D7 o$ N# t! S9 J0 ~) }( v& r& L0 g7 ?9 i9 Z
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",2 ?+ ?0 y  J3 _9 ~, h
            irc, line, file);
; m$ i  u5 Y( I4 h8 B        UF_get_fail_message(irc, err);
; D) w( w1 z* a1 T$ |+ F+ V
' v. G: ?$ T. _. a( \2 w" J* }        UF_print_syslog(msg, FALSE);
: t' t% w' W0 F) W: f        UF_print_syslog(err, FALSE);
+ j2 N5 i3 C  b! _, L        UF_print_syslog("\n", FALSE);6 Q8 Z9 t  [; Y, K% h  z
        UF_print_syslog(call, FALSE);  Y/ S7 L9 k. m
        UF_print_syslog(";\n", FALSE);
& p. h+ B- b( h
% c# l; n. a6 |5 I& ~        if (!UF_UI_open_listing_window())3 ^/ T4 z2 \3 O& c* J- `5 ^% Q( k
        {6 E1 p8 c- {( L5 `) R6 |9 n
            UF_UI_write_listing_window(msg);
& [( a% j0 K' R2 N; n* E            UF_UI_write_listing_window(err);( ^) `4 {# `: x; z
            UF_UI_write_listing_window("\n");. W2 g& T' w2 O0 |3 H, {! C* R+ t! M
            UF_UI_write_listing_window(call);
: A6 H, C) M1 Q" ?5 e            UF_UI_write_listing_window(";\n");
( f; R$ ?, w) Z% ^3 P1 @  ?        }% M$ S# K! I6 Y7 t1 t
    }% t7 A6 D) \" u+ X
2 j" w8 M+ W7 b+ H
    return(irc);+ z0 f) T7 p3 [& L$ V" ?( L" V
}4 {- n* l# ~& H. \! n2 e) w

# J' ^- H$ u6 e/ P4 Z. X' J" l( O
/*****************************************************************************
; |6 k1 z# o. ?* C* s8 V. R' o**  Activation Methods. b, X6 y/ K* |& p& R
*****************************************************************************/7 y8 G3 ?/ H' v6 X4 u  A
/*  Unigraphics Startup
3 c6 |# B& {9 Z7 ]" l**      This entry point activates the application at Unigraphics startup */3 G5 H7 W$ G( L) h' a( [- ]( f
extern DllExport void ufsta( char *param, int *returnCode, int rlen )- s2 d4 }7 K2 H
{) c. J3 f: I3 z5 L6 {" P7 m: ^" V
    /* Initialize the API environment */
4 t* X: F$ b( e8 H: h; M; j    if( UF_CALL(UF_initialize()) )
( j* R  |% b5 y8 J- o* z, n3 R    {
3 ?7 {# \8 X" w2 D+ y        /* Failed to initialize */; u4 r: C/ V0 b( y- l
        return;  X- p; O& \; F3 t7 I+ G1 \5 j; X0 g7 @
    }
) X9 F) Q' q8 @; I
5 d3 z/ f" f! F' I% J. J" O    /* TODO: Add your application code here */
& r7 Y' a) B8 y
0 Q1 S5 E. B7 Y* w  I2 C4 s' m$ O# r$ C: K

; D- r& Q* v5 B3 N, J' U        char b[132]="";
3 F& R4 N1 ~6 B! g  r$ e* K        mmm(b);/ V" D5 N0 e4 Z2 s5 S! s5 J4 U: k
        uc1601(b, 1);   //在UG弹出显示框8 Q0 [9 d# ]8 i! I$ \

; C* r/ k; Z; y- ~9 E1 ]" [, |" O/ v2 g
    /* Terminate the API environment */0 s6 h7 J# c$ K
    UF_CALL(UF_terminate());
6 ^, x: g1 V5 O4 P}3 K) M4 q, [, p: y3 @: l

, }2 [7 S6 I# c- B/*****************************************************************************1 W& L  P) o* t7 t2 d5 N
**  Utilities
# ~5 }7 V" t5 R- [, G! V*****************************************************************************/
( n0 w0 M4 J( Y$ R8 j3 {+ i7 y% k) `' }+ E0 k5 q9 c
/* Unload Handler
. Z: }4 |4 V  i( X5 A( `0 H" h9 h**     This function specifies when to unload your application from Unigraphics.
% \/ J4 d( _6 J# t- d9 Y* n**     If your application registers a callback (from a MenuScript item or a
+ T- A' U, o# e  g8 G**     User Defined Object for example), this function MUST return
3 n( R9 m) T: W**     "UF_UNLOAD_UG_TERMINATE". */- a- n% a. i7 K; |
extern int ufusr_ask_unload( void )+ R( [) @# Q: \5 j
{; R6 k5 ^9 g) w/ }) F. U% O) w
    return (UF_UNLOAD_IMMEDIATELY);# Z4 q, f0 V( g9 b9 `+ V
}
5 g, X4 H  V0 W3 u: [5 H. q! T* x& q. k( D9 h0 C
- A2 Z; h. V" c! c/ O$ A  {

0 V1 a. Q1 e* D
6 s2 v! q) ^3 g: }( N$ b) Y0 h
& I9 [% [5 O. P7 i% E: j8 r* V
# O0 R" T$ R3 i/ k4 b" z
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了