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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
  @' s) N7 a5 q7 {) [8 }
2 j+ @8 [, O7 ?) d★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用7 e3 p7 r& K1 T9 i8 Y
: k. F' U+ X& X6 J  m
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
: |% {6 z& F- g( v7 l% G/ N
. W, y# b  e  j  J$ F=============================================================================8 A6 A' i& \0 E+ k* J0 N- k
在VC中调用VB编写的COM组件
3 g& m" P5 n( j4 V9 s$ z" _0 ^1 G/ s- V4 d% U& l8 V
梅雷 - QQ1821117007 2 ~- F. M' q; E; X
亲测 XP、win7(32/64位)可用3 S6 A2 I. }% s, `

  [# Z+ i, Y6 o2 Q2 Y0 a& s9 WVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。1 Z$ Y% P7 A; _$ n
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
8 L$ i! y3 J9 B) g先说说VB开发一个COM组件。 " I( o5 u. [/ k1 y$ m7 y6 {
用VB新建一个ActiveX DLL 工程,
( O8 d: O. a8 J$ B4 e然后修改工程名称为 MyVB
; j  E9 ]7 l* z2 O2 V3 l1 [再修改默认的类名为 DEMO 9 J1 \9 ]" {6 \# A/ G
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
1 V( v; @* n, ?, ~' y9 H% N! n# w/ }+ o, x1 V  I$ q% y
注意!工程名不能为中文不然在c++中会出现无法识别的字符串4 [1 y3 g! G$ h, j) F: F

; n$ X) W# K( }$ `8 z% z) C
! K* z; W. U7 x5 }. B0 _- E5 c7 ]9 J0 t1 c' w
Dim str(999) As String
& A2 j; s  k& |, y
6 I! q$ Q# M, ePublic Sub GetMeiLei0() '无参数传递
3 K, D- C8 B+ DMsgBox "梅雷qq1821117007"
) t4 P( B9 W" c7 tEnd Sub! I# _& s! N+ Y9 c' D

; [- p5 T3 A0 |" N7 A1 {7 S) f
'带参数传递   Public Function
. V5 J/ P, q, n1 ]3 [' _Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String" g  n* j+ T) p/ n  d; p
str(n) = str1
3 I2 p  M! l  ]9 X+ |9 p- k- ]
If n = 5 Then2 h- \1 x) h) ]9 A9 d' _! t' l
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
! j5 \+ b: l$ i7 j1 X2 @3 IEnd If- r4 h8 `) B- D( `* q$ J
- G3 M% c! e2 l7 F9 n4 @
GetMeiLei2 = "数组传递0"8 R$ P# _% V; @, Z5 G' m
0 p  I5 c6 ^9 {8 X; J8 Z
End Function, H5 F+ ]6 c; \* I& r  C. d

" P/ n7 d- B9 u
( J1 e) Z( }4 R2 k3 x8 j: Z然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 % V8 q9 x. t0 U' E+ f) c3 n
1 [  n  _& @" F2 [2 l+ o
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 1 g) X6 O! W! ^! F/ S9 r$ z
8 y7 F/ A2 @4 z: ?3 v. m
# f% e5 {3 N+ B9 G- ~  Q# f
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
. D+ D3 D! S( `3 [( I8 }. _) ~+ l而 VC 里调用可以这样做,如: $ h6 w; M: e, v  Q: l
Visual C++ Code
& }2 Y) o9 G' A6 q# u
7 v; K: z, T$ \% w0 ~( e//新建一个 UF程序,输入以下代码
1 L/ p& F0 G; |4 c" z/*****************************************************************************
' I0 z3 O7 l3 J, ^) {0 ?' D**$ ~( ^) d$ ?# p/ E% [: v
** C++调vb.cpp
" x1 ^& R$ |, p' Q: u5 |**0 F! Q5 J. T: F
** Description:
; _0 K+ t  \7 R7 ]# d**     Contains Unigraphics entry points for the application.
1 |/ @' g& p2 @& X3 x! _**! c; h0 l3 q6 W
*****************************************************************************/
$ ?" j+ v1 S/ y
# R+ P" u" r9 S" k/* Include files */
  F$ ~/ w4 ~! V#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
3 _+ V9 \' Q8 Q* T! G#   include <strstream>
% u, V" Q7 h5 M/ K#   include <iostream>
( j. w/ Y3 w0 A( u  c9 ^    using std:strstream;% o1 h# r' r" b: b
    using std::endl;   
  o' T8 R& S' F1 Y0 H    using std::ends;
" A4 a* @. w" q; m4 U* c2 |$ L  ]) S    using std::cerr;( K- c9 `4 t- |/ D4 g" H* }
#else
' T' J/ F& k' z/ i7 _#   include <strstream.h>  W: U& f: j, |# x5 q! _4 j6 i4 b( S
#   include <iostream.h>4 ?' e) N7 i+ u) _( H, N. D
#endif  T  G) n6 z) {0 V
#include <uf.h>) S! K( h( {$ E  a
#include <uf_ui.h>
4 ^- k7 _# Z  Y; I/ w! G; D#include <uf_exit.h>1 d. Y& q5 r& O3 o: v) J# C
#include <Windows.h>8 J/ i0 N& H) p5 m% K7 J
& l% I  f- U( v. {* u
#include <string>
( F' q: M& @, I#import "C:\MyVB.dll" no_namespace+ E/ @6 o# y8 R9 g6 Y% L
//using namespace MyVB;    //这里是COM组件名称7 O+ j5 [9 g! `: K) W
. B' Q  k' }6 N/ H1 R1 H
) [( Z7 l) M% j8 ?$ Q
HRESULT ComInit();
7 D9 h$ o7 k% m3 t& eint mmm(char* str). J7 ?+ u! K3 L2 l
{% s+ i+ g- m2 ]2 T$ d* b
        ComInit();
; y1 R; x; s0 h4 a. E
$ m+ V4 z) B. M0 U- J+ U# _/ O  f! z        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
: F7 `. ?5 z- w( U$ [% \        MyObj.CreateInstance("MyVB.DEMO");1 J$ p: V6 V) I, L& ^/ P5 A2 K
6 }* g/ S$ q2 U' P
        //MyObj->GetMeiLei0();//无参数调vb函数7 y5 O7 C3 z: e' P- W5 V" O
$ i/ Y2 [$ l" H0 [! J( l
char str1[132]="0.0";+ w3 A$ A2 R4 Y, ]8 G+ t% v

( L" p3 r% d7 q" _+ Lint n=5;
( r) Y& G* R2 h8 x) g7 Y8 y+ S7 ~- d
_bstr_t vRsinfo1;& r) |7 I' v2 I. \9 f- {
/ o3 R. Q: |; U  j" B
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传- `# T* O- H* [' n* h3 q

$ g# C% N- j3 W3 Pstrcpy(str, vRsinfo1); //字符串赋值) O; ^% d  w; v* `! e- V
( ]/ _7 K4 t+ O. y1 l
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
1 k  _' t4 f0 [2 j) _6 e8 hvRsinfo1=MyObj->GetMeiLei2("qq",1);3 v$ c+ w. g; O
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
5 r# d* S, x9 z9 U" k' P4 AvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);5 z: C6 M- |0 X
vRsinfo1=MyObj->GetMeiLei2("手机",4);. s8 H6 ]( U. I9 m( ?3 H
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
/ z* ]7 }4 V- k        return 0;
  {; R' k) q6 r. z- Z. K9 g}
8 L. N" R3 a+ [; t- H# p, s1 c8 `* X* B% P8 i- C5 ]* `
HRESULT ComInit()
, U8 l+ N, C) K$ L& P{
7 ]% y  b* b' H- t5 \4 R        HRESULT hr = S_OK;  A3 ~) c, \# d
        if FAILED(CoInitialize(NULL))8 U9 }; _' J- l. g
        {+ J7 R# u, Q  {8 M( W" I
                CoUninitialize();3 K) H8 g/ ?, ?8 S
                hr = E_UNEXPECTED;
; l- h# ]4 K! _: Z* d7 F* G* p        }, }3 K$ g6 H9 q$ G# n
        return hr;2 S! f6 I) |) |# q  h; O% B
}
9 ^4 b* D4 _# F
' [. ?+ z, U# l. G+ T& m7 F$ ]# t9 A
" o9 E$ b( U3 s0 O7 R#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))/ e& f& E5 k1 E/ c5 ^; Y& T$ I
! C, n' B0 O3 _+ e' \; C/ ?5 {

: o: z4 a% _4 e. b6 l0 V1 R
6 V7 B8 P' u* c1 S, Y" ^. Wstatic int report_error( char *file, int line, char *call, int irc)( x+ v5 @+ i5 z* i9 J
{3 y& l) @; y+ U! Y, I, ?
    if (irc)
: ]) }5 |3 x/ F" ~( U" v0 `& p$ s    {
1 G% \6 u+ {; Q; R) `6 P/ F" P        char err[133],
- g% M$ g& p# m             msg[133];- y8 r2 J3 K( P+ `7 y1 z

* Q. d3 u3 ]  Y3 w  ]2 y        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",$ \2 I. E( h! S
            irc, line, file);
7 x/ ^1 h# r1 O, t7 P! n        UF_get_fail_message(irc, err);
; K5 X9 W. F( v* X  T8 e& v- |5 i( h- F( w
        UF_print_syslog(msg, FALSE);
. w5 s: e9 I1 J* t        UF_print_syslog(err, FALSE);% Z9 A5 T4 w- ~# o  c5 o
        UF_print_syslog("\n", FALSE);/ [- ^* j; P  S# D# Q, j8 t! ^
        UF_print_syslog(call, FALSE);/ L8 u  w. c& S! R& \; T4 L9 I" {8 x
        UF_print_syslog(";\n", FALSE);6 }; K7 M2 s  c- ]8 ]* Z5 `

5 |& g/ |5 c1 a4 W+ I8 N        if (!UF_UI_open_listing_window())1 r/ r( ~$ y, K& g$ T; ?/ O
        {
3 T. _3 d- U4 H$ S            UF_UI_write_listing_window(msg);
7 K( G% H5 i/ @1 q            UF_UI_write_listing_window(err);3 E7 l3 f- Q& h: z" Z
            UF_UI_write_listing_window("\n");/ y/ t) _% [1 e* a, Q1 z. f& W6 N
            UF_UI_write_listing_window(call);3 H  w* r" a9 ]
            UF_UI_write_listing_window(";\n");
2 Q# V& }7 z7 m: d        }
/ w; f' Z- r1 I" a- F    }
+ K  o' h- T2 O( p$ C- y1 O+ |- S7 H) a
* L& U$ o3 Q8 Y    return(irc);
+ A. `% M3 `  I& u! Y, x1 v}
! @2 V$ W, c. }' Y. ^  O, H/ b* `
$ J( H' T6 ^9 ^0 G4 |' r7 M; S
' i! e$ r& S7 T8 X- A$ \. g* l/*****************************************************************************
2 k/ m# o7 f$ k" U0 W$ O. B" a**  Activation Methods
' C6 g9 f% k0 h* |*****************************************************************************/5 o0 Q/ s; M$ d. Q8 Y' Y% O! T
/*  Unigraphics Startup
* a+ B. n* d. o( i: }**      This entry point activates the application at Unigraphics startup */
) ~  ~4 C- T; Y7 n: h5 j* {extern DllExport void ufsta( char *param, int *returnCode, int rlen )$ B- @, Z9 {" j3 t! M. x5 P
{
  f! S4 z3 P% ^; B. w# ^1 y    /* Initialize the API environment */
; Q0 D  b8 P3 v3 G5 r: U    if( UF_CALL(UF_initialize()) ) + x; g6 p: Q, |% o" \; a( {
    {
- A, s0 f: i! g  G        /* Failed to initialize */
1 T# v' `5 N6 o% _8 K1 z! j        return;
' w1 w' C- ^2 u4 |! }8 j) b    }
& u' O+ Y+ l5 D, v/ {' I% ?% m9 B- B; @, ]/ }
    /* TODO: Add your application code here */  M$ K+ K; G4 w& D& F
" W% W- U8 B+ [% u* S' e/ X3 g
4 @* y! F( D# a  n
* h4 a( n+ P% r* a
        char b[132]="";
3 w: S" T9 [" o( E3 @        mmm(b);: W3 A* Q% C! ~+ l% u# H+ h$ \
        uc1601(b, 1);   //在UG弹出显示框
; N; _: M' k( ?( n
: x8 s& C+ m3 r7 h1 \/ p0 K
% X; Z( F0 R0 e% a    /* Terminate the API environment */6 a+ V- T4 F& S
    UF_CALL(UF_terminate());. K' w9 Y0 M) Z$ U
}
3 V( c. L4 M1 R9 x7 [
( [2 \% ^  `/ l7 @  u/*****************************************************************************
) R0 g( p1 q0 y3 w& |**  Utilities
! {! ~' q7 S6 q( M: o*****************************************************************************/4 Y- _7 K6 A7 f4 l# h1 F0 C, p  g& q
/ T0 R; O6 S' E) I& f) f
/* Unload Handler
1 x; t3 s" Y+ C, q**     This function specifies when to unload your application from Unigraphics.
/ r9 \9 z4 C3 I0 K- I**     If your application registers a callback (from a MenuScript item or a: E+ ^# P8 t9 u1 N
**     User Defined Object for example), this function MUST return
" w+ y0 l% o% ~$ P+ a1 R, R8 ^**     "UF_UNLOAD_UG_TERMINATE". */* D- @9 A1 [0 d
extern int ufusr_ask_unload( void )' x* T* n$ L" |1 S9 z) i
{5 n3 I# i  x7 q2 I  E( z
    return (UF_UNLOAD_IMMEDIATELY);
$ N6 G- x: e  M0 n# P% L}. y8 Z1 e, H% m

& {% a, e$ S- x, K9 T8 u7 Y8 m; `, x$ D( ?! j6 g7 |

# s  ]& P6 j) _
( B  _' E+ i+ j. n
0 y9 m# Y& A; B0 B, e' D* ^- N2 }: t9 P) l( ~" D1 E3 c( Q$ F# {& z- e! 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二次开发专题模块培训报名开始啦

    我知道了