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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件. f3 k- d' D0 o
: h, u! |# w- [. t5 Z
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用3 E) h7 O, U$ S% i$ b! m
) ?5 c) W( }% ?4 `6 R6 C
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
# Y# S! A& {; N1 L% X0 i
2 X: [* M! a/ w" h% X. t3 L' R=============================================================================
6 b5 s, H! ~2 j* |* ~9 ~7 V& N在VC中调用VB编写的COM组件# S) x# k8 L: H0 `
& W" u2 o. V+ _" V9 ~8 U& B
梅雷 - QQ1821117007 ! o! ~4 G% Q, M2 K
亲测 XP、win7(32/64位)可用/ L! N, `, `. d: r; f& F

& I( ~9 e1 x+ w4 I, P  mVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。8 \8 t- V- V7 J6 T$ s( t( S
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 9 E& [' e" K9 ?( z$ _0 _, y2 J
先说说VB开发一个COM组件。
/ y6 e' G2 m# ]  h* O用VB新建一个ActiveX DLL 工程,
) q' F- G# W7 Y, r然后修改工程名称为 MyVB
8 C! y" K9 C6 \$ A8 V1 {9 L再修改默认的类名为 DEMO * c2 h5 D6 R: v3 @
然后再向类中添加一个函数作为测试用,如: Visual Basic Code8 s' g  j- W  D6 j; B

1 p( \: t$ @5 X- ]8 N8 \; P注意!工程名不能为中文不然在c++中会出现无法识别的字符串
9 M/ J, c( b- z) K! Q) O- ~# e9 V8 R* y

' T. O: ~+ T% w0 \
1 v+ |. B0 b2 w8 i. j' uDim str(999) As String
4 E# b) x. t( k" g& |
' E' e. ~) ^% W: k$ TPublic Sub GetMeiLei0() '无参数传递
+ Z# [" H8 |7 R/ W) FMsgBox "梅雷qq1821117007"" [) R" B' j, b1 }
End Sub
0 H2 h( m! b# ~# _; _$ o6 X
' p, e' S! A- t6 F7 U. b4 \
3 W0 \+ \' v7 A) U/ r: p2 Y! B2 t'带参数传递   Public Function
/ @+ \  k, O% Y& z; GPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
+ x) @' F+ J! h* ~- sstr(n) = str1
) _  b+ N/ r' T( o! _
, G9 R3 \$ _- }' XIf n = 5 Then
/ K3 s" x7 C1 g" s* J; h  \MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
$ `; x. ]) _3 @6 BEnd If2 p; H- x. W' Z4 i7 [- W

0 c* S* s7 V! KGetMeiLei2 = "数组传递0"7 T$ y" ^% H) \! B
, ^. ], [/ z2 [8 D8 ?1 i5 d
End Function
) A5 E8 w! }- D  ?$ W7 c: _" o8 j5 h4 a* W- @3 j! d. E. B+ K

' |6 _' b: W+ }$ O然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ) a2 a# d; [# w+ ^$ t) R
) ~6 h; [9 o' B& c( \: D# p
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
( A3 [5 [! l, x" h8 I' }' I9 N# O
! m$ j( d1 I% `: r5 u  c* P) E' x7 B* Q  b# S! Q5 M& M- Z' u
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
( c$ Y1 u  D4 r, j) `而 VC 里调用可以这样做,如: : f2 E/ e+ O( K1 l; q  \9 w- i2 J
Visual C++ Code
2 F; T2 m* I2 |" p. ?7 A- Z( e$ d+ U0 U7 x2 w: a+ Z
//新建一个 UF程序,输入以下代码. B0 r2 O& v, B$ `& x
/*****************************************************************************
1 ^7 s5 d2 U! A% W**
- W$ M5 t% j8 Q$ F, v! R* Z** C++调vb.cpp( U- a5 L* d% h& a3 ?
**
; }3 l! J" g% W. \5 Z** Description:/ T3 o. P4 y4 B! D
**     Contains Unigraphics entry points for the application.
: d. b4 E/ `7 R6 i**
! ?' L3 `  Q' ]*****************************************************************************/1 F8 @3 M. z. W, X- O

" `9 S" C  ]1 w/* Include files */
# }0 M8 u* h+ m) V0 ?3 A#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )  c# r3 r3 c. k7 ]. S- E
#   include <strstream>
, W$ v8 h  ?. e- B#   include <iostream>9 V# C2 c: x. z5 Q; o9 A8 E/ h
    using std:strstream;. l, `; c3 y; S2 S& S
    using std::endl;    ; F% a5 x: ?6 s8 d, `
    using std::ends;+ l. g8 y) y" D0 b  v& C/ Z
    using std::cerr;: `, B! }, G. l8 `3 a7 `' }) d, [
#else; H  g& r# b9 n
#   include <strstream.h>
* ?4 b" g5 Z6 Q. G1 [4 C#   include <iostream.h>8 b1 ]1 M5 |+ r2 w- x, O* \* [
#endif  u/ d2 M8 [9 y
#include <uf.h>, k2 h' @! k1 k6 h
#include <uf_ui.h>
' @2 c1 t. I: ^1 }#include <uf_exit.h>: e+ a* P* Z2 [' |4 T# S
#include <Windows.h>5 q& H/ C2 B9 z* b" J

' O6 l, Y; ^$ b1 q#include <string>
, o9 |, V6 l9 [- d) M; _# \  W#import "C:\MyVB.dll" no_namespace0 I, U0 Z) @9 ?3 E  U9 b+ ?
//using namespace MyVB;    //这里是COM组件名称
3 Z% L, E6 a7 o. s4 d+ Q8 n7 p; i8 \! I0 t# Q. V
, }/ |" |+ V# l5 w( B) T% g
HRESULT ComInit();: e! V$ O# g# N4 z7 s: D; n4 S
int mmm(char* str). c9 {; }- V; c
{
* R; m% {* O: y( }: \7 ~7 `- l        ComInit();  `/ k7 g- a4 N/ R* J% _

3 K/ ~9 {& C' \: |        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
; @" l) c3 r; R( b1 n1 v3 p        MyObj.CreateInstance("MyVB.DEMO");
( T/ b+ e9 W' P& `4 y$ n0 V
! T. y. v4 d; x. |9 E9 y6 L4 U+ l$ p- n        //MyObj->GetMeiLei0();//无参数调vb函数
4 S2 E8 m! o5 `  Y0 L, e
8 h0 I7 b7 S! A: ichar str1[132]="0.0";
% x! }; J# n" E; u2 k2 z* T* G: v3 N- o% g
int n=5; / l7 }" T& @0 g1 \! g0 ?6 J
7 q! s- p5 K* V9 U2 P# b
_bstr_t vRsinfo1;  O  |  G# `- [) q# J) ^! q+ J
" O  {7 i" h2 s% N
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
( ^9 u2 Z6 g7 G; P+ ]7 g. n5 \1 Y( ^- p
strcpy(str, vRsinfo1); //字符串赋值  O0 Q+ r  V9 A# b; ~

6 y: \! B$ Z3 j* O7 s1 k  f2 z6 OvRsinfo1=MyObj->GetMeiLei2("梅雷",0);7 F1 o* V0 N2 @
vRsinfo1=MyObj->GetMeiLei2("qq",1);7 \4 O  ^. Y7 D  l
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);) t( E& _5 s& X; T% K. c
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
; x1 ^! w2 L' w" l, q* YvRsinfo1=MyObj->GetMeiLei2("手机",4);4 r7 V/ G9 K* `3 V2 C/ `6 J. j
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
5 v! i5 c# ^" v* X3 y        return 0;
7 u" p8 X- @7 T. t* K( v/ B; |/ v8 R}
4 K3 E" [9 H6 l7 I6 T8 u9 m
8 O; v! w) a/ a) j$ l+ aHRESULT ComInit()8 Y& y5 [1 C  H& ~6 U9 o
{6 ^, r: o; T, L# Q$ j3 w& W
        HRESULT hr = S_OK;
2 S& A; c9 k6 i8 J+ X* s        if FAILED(CoInitialize(NULL))1 v0 u3 X5 N6 S6 W/ a
        {2 P2 c/ f# ^  }3 K1 N  f9 u; ]( s
                CoUninitialize();0 h' n+ O- w9 u/ [# D
                hr = E_UNEXPECTED;
# K' e& d5 w) O* Y        }
+ i& \! p6 Q" t$ A9 I0 x1 m        return hr;: V, ?4 |5 M5 \. k8 O7 i
}
1 z' ^& i* @' N
- P* j' h9 d6 p, k; u' C+ M+ Z# O# c" j! i3 J
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
% w3 n5 c4 b  q5 T: \: R/ `. _
/ }6 s- D# ^  V
( i8 ^. ?0 ?7 d2 M7 V( W4 q- [( p( o' Y( k" i. u% M
static int report_error( char *file, int line, char *call, int irc)
+ o5 o$ P+ G/ x* f{
: j) f( L3 K- i: N3 w    if (irc)  J' C* B0 A1 N: ]9 z9 i8 _! L
    {
& g# x" p3 l) U' J: f# j  I        char err[133],, V9 ~; A- y: V4 @6 X# Q
             msg[133];
  a5 s& h0 r; @0 \; p' f# R) ~& @! x  e# h, a  X4 j1 T+ ?- z3 k
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
0 n4 |. n$ ?/ D: r& \, ]$ F% J7 p            irc, line, file);
) I: U/ n, k: P/ C- j8 N6 V        UF_get_fail_message(irc, err);
6 D. \* k8 R! U9 f  J, O: ?  U# ~. j; [+ q! c! F  h
        UF_print_syslog(msg, FALSE);
" ^0 Z, X/ i* H# S; N        UF_print_syslog(err, FALSE);' o* @+ |# Q0 |  g- X
        UF_print_syslog("\n", FALSE);) h7 v( B# l* Z( |) p
        UF_print_syslog(call, FALSE);
; s+ ^1 y. Q2 ~  R* |        UF_print_syslog(";\n", FALSE);. j2 z9 {- p+ u; t" d+ k

- I1 L* p$ @% y        if (!UF_UI_open_listing_window())
; t' z' I0 d) D6 }        {
/ V! {( R! g# ~! o% U" k            UF_UI_write_listing_window(msg);/ i. I( z4 _- K3 e# f5 i) k
            UF_UI_write_listing_window(err);
) b4 Z% |8 ~* }* f            UF_UI_write_listing_window("\n");
1 G, e2 }- r2 ~: ?  b  r/ R( ^            UF_UI_write_listing_window(call);- d8 X# A* r2 F. S
            UF_UI_write_listing_window(";\n");
: i  v3 W5 E3 j8 n        }! ?: e# [/ A/ {  z3 v+ \
    }0 j' g3 P9 p+ H  j/ ?
9 Z0 v2 C7 L; a0 k2 e
    return(irc);
$ O. }  k2 Q7 @! v}
- `' s" j/ B( S& p
; s8 f2 K7 E) W' a: y# Z8 V- K# f! H/ f/ y  ~% H5 q: h
/*****************************************************************************
8 h/ V6 `) ^, r5 p( z**  Activation Methods- J9 c' x/ X* }5 L( m
*****************************************************************************/
% ~8 j$ K3 ^6 t7 R! _2 \/ i/*  Unigraphics Startup/ ?0 T+ @; R- g9 _
**      This entry point activates the application at Unigraphics startup */, z3 y6 d& ?9 i
extern DllExport void ufsta( char *param, int *returnCode, int rlen ); }: k; L# K+ I( i' }
{7 v# K. K' V& C: I
    /* Initialize the API environment */
  Z( \- D1 b' I2 [$ k    if( UF_CALL(UF_initialize()) ) ; K& y' u9 E% I4 l
    {
3 o# p0 w9 J0 S# Q$ T( R+ E        /* Failed to initialize */2 u! G* E" X6 {2 W
        return;) U/ y; F: Q5 B
    }
: e. D4 {" @8 S5 f4 X# n) S' y' T. Z3 g2 {% A/ ~. C
    /* TODO: Add your application code here */" ]2 v( w0 T1 m: ?# C# N. X
. B" N3 r$ {$ h
+ X4 K  N: J+ Z7 o' v

) x+ _  X+ L9 P/ h# g! }        char b[132]="";
3 g$ n2 \( W- r" E" r        mmm(b);6 Q* U7 c0 T0 {1 M7 C
        uc1601(b, 1);   //在UG弹出显示框
3 A, o7 ?! P& m, d4 z6 d! x
9 v6 U0 P( o  [; K* q8 `* \+ W8 k  O7 y' w& K
    /* Terminate the API environment */. Q  y# z5 l: T( Q- l  t
    UF_CALL(UF_terminate());# ?% z5 Q, {4 I+ m0 `: A
}  c& l& Q' r4 Q* T# d" o4 [- o

, n8 O; ]! D) z- W/*****************************************************************************+ I( [, N9 h% w9 ^
**  Utilities( l5 }" k& \2 {! w& C
*****************************************************************************/' C, z% F% J* Y; [) _
& M3 |, S# ?" Y6 r9 l' n
/* Unload Handler4 M. S" O- n' `* X+ V$ B
**     This function specifies when to unload your application from Unigraphics.
1 d6 W' u/ Z; A8 u**     If your application registers a callback (from a MenuScript item or a# C2 R4 ]/ W  i6 c( b1 E
**     User Defined Object for example), this function MUST return
& P% F- c. I  H* g. B. q1 n**     "UF_UNLOAD_UG_TERMINATE". */
. A1 p2 x/ u1 S  p9 Y7 D0 Eextern int ufusr_ask_unload( void )# ~5 L! c# Z7 B$ P: m1 e  B
{
% A" }6 ^' Z6 U# j- g) o    return (UF_UNLOAD_IMMEDIATELY);# \7 }' [& w& n* b' Z3 }
}6 E* ]) ^" K6 J, ?2 K

3 }6 h) B5 ?8 D1 G: U
" V' N2 F+ i6 O. T2 y9 I, X  H) V5 q
( R: |. l9 x* m9 {! U2 G; D' m2 h9 n3 h- A3 R2 m& C
6 q2 G! A  Y) N5 G# d1 a/ k
* d. \, b. X3 t* k1 v) y- p
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了