PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件. }# q) K6 }3 g) F0 ^% P

. q2 D  u( O) L" r# y★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
3 T; _7 S- x  _" Z/ U2 V  z. X$ Z& n& {) x8 h! {+ j
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
7 e" W  w6 S8 W1 \" l' q$ V" T( _
4 v) ^1 h. n3 O: {0 M# v. Q=============================================================================' W. C( n: w' `& Y* ]; }
在VC中调用VB编写的COM组件1 }0 r# }/ W0 e0 Y/ D

; y: t: `+ W( M+ y4 d3 V梅雷 - QQ1821117007
0 I' l9 a/ ?/ y% S1 S亲测 XP、win7(32/64位)可用
# N) Z/ B5 H, S% y7 V9 n& `7 H/ s) k9 O6 }
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。6 X. {8 P( Y5 R* v) T
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 % K4 V, j2 j7 A
先说说VB开发一个COM组件。
) b! Z7 M+ W& B) `$ ?( ^. q用VB新建一个ActiveX DLL 工程,
! }2 |& `7 E( G) D9 T然后修改工程名称为 MyVB , r. o  g  C$ B( ^/ w$ Z5 v
再修改默认的类名为 DEMO
) ?  I8 |5 t- |5 f* t& L! j+ F& o& Y$ O然后再向类中添加一个函数作为测试用,如: Visual Basic Code& W5 K1 g+ \. A2 [, f

4 P; \) f9 a5 Q4 X! d注意!工程名不能为中文不然在c++中会出现无法识别的字符串
* A4 q0 m  ~1 s) q* I: _
' ~8 _* w: z4 d6 i! @% E) C; i
$ W. Z3 c- ?) _+ ~( E; X' P; [) ~. R" R, Z7 J0 z
Dim str(999) As String
1 m, y/ r, o8 d5 g( F
4 \) ^; ^& y% K, MPublic Sub GetMeiLei0() '无参数传递( x9 P9 c" c5 {* |
MsgBox "梅雷qq1821117007"" A9 [( V- G3 P9 p2 T
End Sub* z- \6 u( ~$ z+ F/ R9 o& B. O

6 J% d# N( a: \  ]
$ J/ ?! E/ W4 H- s'带参数传递   Public Function
) J) X$ r+ A! R' N* I) W0 lPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
. c3 C- _' p/ C: x3 Pstr(n) = str1
& k* x+ u6 O3 _  @9 k5 h! V! w1 L+ Q) o
If n = 5 Then& E& y  Y( X) F" h5 ]! o( v
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5): G4 W1 t, V8 ^% T' V
End If* m. E4 a4 K* r; Z' y- a
5 W; n2 R% i2 B) _
GetMeiLei2 = "数组传递0"4 r, S* Z; u. \; \( ^; D3 ^

7 }! M/ B; I: O( r' QEnd Function
! s4 \. h+ V0 e: p0 ]$ @6 F) [0 r2 J- o/ E, q
3 y4 T: r! b, a2 I1 w
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ( J+ v: m8 t5 E2 B8 l) ?4 k$ A

) ?; t# I: W, y: `* t5 X. N  i注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
* ^  ]/ d$ z3 q0 f+ R* c
2 C; U! s1 z& `# F6 h8 [6 z
$ P8 f  u; n/ u$ m其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,   O$ I- z' q, P. T; d3 {1 q
而 VC 里调用可以这样做,如:
5 D( v. ?! n2 }% i, vVisual C++ Code # a4 y1 Q* r- j+ V+ U9 r2 Z
9 U9 P# ]% H3 k
//新建一个 UF程序,输入以下代码- }0 w9 v6 l$ |* C1 Y
/*****************************************************************************9 ~  j; Q0 h5 s9 B
**
$ y0 ?- K/ c; |% n8 R' o6 g/ J& @** C++调vb.cpp( F& ]) U3 n1 h( F( k
**
  O) b/ A: |( m/ I3 r8 j+ n5 G** Description:
! W  p- }2 ]! ?* s. t**     Contains Unigraphics entry points for the application.
$ j3 u" `/ l. N**
  m1 U' l( o, u: I) h8 d( r7 G4 h' Y*****************************************************************************/
. x. {" A) `5 I, z* W2 @2 C3 T6 d* q8 t$ z2 \; k8 x9 \
/* Include files */
" `  o& F/ q% Z- W( ]#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
3 r* l4 u- f" f#   include <strstream>1 P8 U* a$ r: v1 r3 V7 a8 o
#   include <iostream>+ E# P1 U# Q1 z
    using std:strstream;# C( R/ g: r4 g6 w7 [! _8 F
    using std::endl;   
, A5 ^" a4 j* O* ~; T. V    using std::ends;0 N2 E) G* _& z
    using std::cerr;8 K& d$ _- T7 \# F- l7 W+ I6 A
#else
) R% \1 }8 K% `0 ]/ g' W3 ]# g& E#   include <strstream.h>& N! m& }4 F8 H3 m# z6 O
#   include <iostream.h>) N4 \- j  x! }% E0 j! M' X
#endif& H8 A7 {" L* z7 C) R9 Y8 _
#include <uf.h>
- d* b2 U( p6 P6 ~, o1 _; G8 r#include <uf_ui.h>
5 a. u0 {- P+ K3 e6 U# W, j: }9 g#include <uf_exit.h>
2 N9 F; Q# m: `#include <Windows.h>/ V9 k4 }8 R/ f! @

9 `9 I* B/ Y$ h+ G  T( N#include <string>
& S7 K; f8 b7 d, \) F3 d7 G: f4 C+ t#import "C:\MyVB.dll" no_namespace; n3 x; Z  ~- I( r! p; X
//using namespace MyVB;    //这里是COM组件名称
2 G0 E. F. K7 s  ?% N1 K1 F
2 n! P0 H# S9 x" i% q8 v3 R& j& L* F
HRESULT ComInit();
7 u) H  x" u) d, B; Z0 _int mmm(char* str)- O# O0 q4 f& W. O  D% C1 |+ h4 b
{9 ^) K* C, l0 O6 ?
        ComInit();& I/ `: R) q* ?4 M6 v2 }- |
+ ]. Y! Z& G6 m0 r$ z  a, h
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象6 z5 V' v3 d% M3 O" w0 }: ]6 L. B
        MyObj.CreateInstance("MyVB.DEMO");
% F4 ^- o7 R5 y. p7 `5 P
  M# J% z4 ]8 |9 P. ]& T" s% a        //MyObj->GetMeiLei0();//无参数调vb函数
* Y: C2 m2 \, f6 v6 R$ V
/ V, a6 k, y9 C( i* `char str1[132]="0.0";
# m! V2 r' J' z0 S& n# O. M: C5 U, A
int n=5;
9 ]( ]# R# O; P# A$ ]7 H8 V0 R3 q( u- l" H6 Z! w
_bstr_t vRsinfo1;
! X. G- R* e9 M: F8 V7 T
4 {3 r+ J% ]6 e( [6 E/ zvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传# O/ V& C# c# D

( w9 A. |8 C) a# }, f- dstrcpy(str, vRsinfo1); //字符串赋值- C. K+ M! W6 d3 [! {
. s# |; c8 S% q& e
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);! r* j  L$ W6 Z* ^! B4 {
vRsinfo1=MyObj->GetMeiLei2("qq",1);
: z' j* c* L% W. qvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
1 C' u. t; a! mvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
5 J; P; P8 K/ A' K/ m6 gvRsinfo1=MyObj->GetMeiLei2("手机",4);
2 |8 i3 `2 V& X7 P6 `6 bvRsinfo1=MyObj->GetMeiLei2("15757753770",5);+ ~: ~! x6 s  H' R
        return 0;+ X, G, r3 {6 j" o* O( J# Y
}
& ]0 @& W, g* D/ n6 I4 a' m
: O  ?3 U6 {6 V1 }' L7 AHRESULT ComInit()3 `9 l" n. S3 m
{
% V, y) K, O( _6 D- v        HRESULT hr = S_OK;
( Z: r( D" T  M9 a7 x# N* q        if FAILED(CoInitialize(NULL))
9 X  E9 R. l9 }! r/ n        {
: C; j+ y9 z8 q; B% a                CoUninitialize();
5 Z! K$ w* ~# K8 [5 _" L                hr = E_UNEXPECTED;
% q3 O0 ]! [4 n        }
1 k3 ]6 s) X3 [  v- I. b, T$ V        return hr;
4 M" I: N: |  B9 U5 w}
; p: W( l1 o8 `; Y) B, m% c: `" U* ?5 a/ j) A
" n/ W" P& |* i3 I; y  I
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
% k0 ?9 G6 C$ B6 z9 H$ t) I6 a* v) a0 z0 ^) V( r

3 H+ [5 U6 Y/ {, b" o$ ]
0 B8 k$ R' B% Cstatic int report_error( char *file, int line, char *call, int irc)
/ c9 u( }2 n! @0 a. ~2 |{
6 c( n. O; ^1 H' f- k4 b    if (irc)( f* Y9 F& B% t& O# O$ V; H
    {
% T3 a! R# t( H        char err[133],( c: O5 ^6 G/ R' T3 M  Q' q, M( U% o
             msg[133];" D, r% l4 m1 W: `: r
; k  F1 \4 ?) }
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",$ h4 [5 b8 d! Q9 S8 O* J6 W
            irc, line, file);" o8 ?2 r# B+ s5 A* `$ v9 c
        UF_get_fail_message(irc, err);: \: \- G0 W# V3 ?4 H5 z# [
% k% B6 e$ P% [; G
        UF_print_syslog(msg, FALSE);) N& t7 U2 X4 J
        UF_print_syslog(err, FALSE);4 w1 Q1 u: D' \
        UF_print_syslog("\n", FALSE);' {- P/ k9 H/ A" R& ]' ^
        UF_print_syslog(call, FALSE);
+ K& W) y% E9 H8 K# g* T4 Y: [        UF_print_syslog(";\n", FALSE);
$ B" A( G# E, x' k' t  H% [
4 f1 r& I1 G& u, W! v+ K        if (!UF_UI_open_listing_window())2 Q+ e1 e' o8 ?% Q3 i4 w- |: J
        {" N' o4 c/ b9 P2 p# e
            UF_UI_write_listing_window(msg);
1 c4 ?8 K* \& ~# q9 [            UF_UI_write_listing_window(err);
% t9 P3 X) O' M; t. `" P/ s            UF_UI_write_listing_window("\n");8 s& @2 E, }3 s( E0 C
            UF_UI_write_listing_window(call);
$ I, ^# F3 p: ~# `: b+ z            UF_UI_write_listing_window(";\n");$ q2 ^+ ?' B) {# w2 S" B
        }
8 O+ z2 o# O  k    }
# F! h3 x( t! l- T- W# E6 S+ A1 W( p. r
    return(irc);3 f0 n, s2 ?2 U* j+ m
}1 l" E" J- i1 J5 L9 V- ^) u

) M+ a: k6 p$ n/ z/ y
) ^$ k) l0 H  G) ?* a% Z' y, M. T/*****************************************************************************
  ~! k( p* m5 t; u. g) m) o**  Activation Methods; D$ x+ F. m; i; P$ E4 e
*****************************************************************************/
5 ]! J% n) M" O/*  Unigraphics Startup
% \# ?5 ^4 J$ |  u**      This entry point activates the application at Unigraphics startup */1 N2 ^% p* I/ S% U, k" ]
extern DllExport void ufsta( char *param, int *returnCode, int rlen )& y- K$ ]  z1 s9 e) d- q' K# w
{5 b, k( t1 k0 ]
    /* Initialize the API environment */
  I9 b5 K0 t9 j: m    if( UF_CALL(UF_initialize()) )
  w, D/ I1 s  S7 ]    {. o0 S* c; j; L9 M0 r7 \) [- }
        /* Failed to initialize */
: \: x/ ]( N2 x: D+ }" P        return;
  R8 S/ S* X9 Y, W- Q    }
( Z9 b8 S' Q0 f& U, W# _! J+ M. e% t! g' \; B5 m0 k1 U4 M
    /* TODO: Add your application code here */
; B' E- O: e& m4 p: J- K+ @: y! F" f- f( Y( B! H. k' K- Z% H: k

7 [" x% w6 ~# m" O! @) H  F. ^( u3 Q% g% L1 j( c6 O
        char b[132]="";5 a* ^7 p5 [. s/ U% U! I
        mmm(b);# o/ g' ^- x; O  i4 L
        uc1601(b, 1);   //在UG弹出显示框
" X; w" i" l0 [5 w1 H& G- h- Z+ b( |  A( R+ {) X* @6 c/ @& X
) ]$ `3 d5 f& }( p( |- v
    /* Terminate the API environment */
6 Z2 N+ r; t; L1 U9 k    UF_CALL(UF_terminate());. Y  {, J4 p7 h! g* ?
}6 H6 f! L$ s4 G6 [  C7 k) ?- J

5 l8 z8 @4 I' o' Q' h& L0 a% Z/*****************************************************************************
/ j3 L; Y& z, e8 Z3 n: J8 c**  Utilities
( e6 ^6 H" L* [  V- D*****************************************************************************/
9 P9 H/ U. G# p! |) t0 p- T0 W) M/ {( w7 ~- W/ E6 a
/* Unload Handler
7 {* m; Z: o% ]% B1 a% U1 V**     This function specifies when to unload your application from Unigraphics.2 p7 a+ U4 i1 I. f# D3 i
**     If your application registers a callback (from a MenuScript item or a! z; N3 @, J  N6 b  Y) M
**     User Defined Object for example), this function MUST return
/ X' `8 _" U9 ?4 ~( Q5 W**     "UF_UNLOAD_UG_TERMINATE". */) Y) U' L* y$ l5 f1 {6 V. M
extern int ufusr_ask_unload( void )0 K- M7 |6 E4 o3 J0 Q1 Q6 T
{% `  {+ Q( l5 c# r: I6 F
    return (UF_UNLOAD_IMMEDIATELY);
  @/ g1 d( u0 G! F# Y+ _. B6 W}8 U5 |1 `2 b# ^

& K% J# E$ f% t% \: u
: j5 H) b* u) w+ m, P6 [5 A
) b2 [! n1 p, z+ B! o( e7 t
( p4 y) k$ q: Y* ^6 K9 F0 p  m' z$ T3 x  @/ \, z* A+ K1 m. D
5 o) t$ x, \2 H0 L
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了