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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件2 Y2 b; R5 @$ \9 C5 m, P3 g

( [8 ]9 X! S! o6 }/ H4 {0 P! C★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
% D$ u( j! C" J8 I9 S; B- p  W: ~9 t1 I+ l
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
* {' t, F3 l5 N6 N  e+ Z/ `
8 n; @' u) }& ~=============================================================================
. k& B% p7 L5 A5 S* ]% A% ?在VC中调用VB编写的COM组件
: v1 v% q/ F4 A: {+ y* P! \; f: q  G) M* [4 k0 E7 j* \% X9 ^
梅雷 - QQ1821117007
$ l) y' e- A, v+ _% q亲测 XP、win7(32/64位)可用4 j3 |6 v" n9 c6 h1 C

' I& H3 R; z, o* g1 T1 ?& BVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。8 ^& w) T) G' u, d0 E- s8 ~7 G
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 7 x# [. w% X/ {& t
先说说VB开发一个COM组件。 6 b$ n3 W% P5 P
用VB新建一个ActiveX DLL 工程, 5 E. x& }: G* M+ |% S- c
然后修改工程名称为 MyVB
2 w9 F! q5 n" ?0 r) F$ \再修改默认的类名为 DEMO
# q/ R( h' I5 @/ I' L* u然后再向类中添加一个函数作为测试用,如: Visual Basic Code
: V7 t0 y& w! k+ X0 E# `7 h4 Z! U% q. E' [) t# ^0 W3 A( o
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
$ l- n" f. `. @" z, O/ n- T8 I3 Q9 F/ E( P) a+ X2 g
4 a: c7 D. {0 u8 F; \0 u
5 M1 H% w, l1 V# {
Dim str(999) As String
4 w- ?/ j& k6 o9 P& R
- R  O, \- v" r! C- R' i5 oPublic Sub GetMeiLei0() '无参数传递
' `5 a: S: V# P$ o. Y0 k- JMsgBox "梅雷qq1821117007"8 Q3 [( S$ b3 l* k& A
End Sub5 e/ v) O7 ~1 z3 H9 _6 c3 y
; v! a4 J) T0 ]% D- \

, i, E) _7 h5 z'带参数传递   Public Function) h# c+ t; a# s8 y9 W
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
% G! R( e4 {6 O% ostr(n) = str14 ]% z4 v/ y  O& n5 N, {. v, Y  ]
9 b! {  L9 x8 c0 L
If n = 5 Then
  [& F* ?4 U; H% FMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)! w+ [& u# x/ i; A9 @0 e
End If
5 @* y+ y0 U" l: h
1 Y7 A. j4 ~* B" s  o- h+ S2 C& H% ~GetMeiLei2 = "数组传递0". m4 g0 B3 b! }4 Z/ ?8 X) ^% }, }
8 _, K& W3 U, e9 d. U9 Q
End Function" v. S& B" c0 I5 e' `

( J% L1 |/ L# n4 m$ b1 |# v/ L; s; A, H
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 , A) b6 z7 P: v3 ~  P

! Z9 w- v2 o$ {. w! I3 c' v注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 8 L% M; L2 J8 I# O8 V6 K
, \# A  f+ T7 Y* N& Q
& a1 ]# {: ?: U$ s& N1 [6 n0 W2 P
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
' z( b! v, Q; R* H! i% |* e而 VC 里调用可以这样做,如:
+ i* j7 v* T+ t8 r1 l, B2 I. ?Visual C++ Code
4 C" S+ A& N! t% E7 @, T& m- K2 i$ ^/ p4 K7 l* v
//新建一个 UF程序,输入以下代码
4 T2 C* V2 K8 M/*****************************************************************************
7 R% f, c1 W0 s**& [, P6 h2 [2 h; X
** C++调vb.cpp
0 e7 l4 O( Z: F/ I7 P8 ]8 }2 a; ^**
+ H3 N! P3 [2 ]/ S' J" m** Description:/ R  q# W4 f+ f0 W
**     Contains Unigraphics entry points for the application.3 i+ ]8 e9 S4 E% w2 E
**) j% ^$ ~( B' q0 ]6 {: A$ Y
*****************************************************************************/; {0 U3 I* _; v; }0 c& Z6 J! p
) B4 v, N8 d5 v7 T
/* Include files */8 S  Y( Q  U1 V* N* O
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )9 V$ b7 Y4 Z1 C: f0 Y
#   include <strstream>
9 w% s+ c7 s" ^* j+ w#   include <iostream>
" ~8 v1 v6 b) _/ Q: }8 c    using std:strstream;
& a1 }$ Y3 ?, b9 \* b& m    using std::endl;   
$ r, }; o$ p0 g    using std::ends;- e% J/ I% T- b0 z( b& m
    using std::cerr;6 q) \9 @6 }# d/ |1 p( D
#else' t4 V+ z. Q* Z! W+ ^9 P' p) K5 R: R, v
#   include <strstream.h>
7 r: r; k% P* k# Z#   include <iostream.h>
6 c0 n: Q. m5 w, S#endif3 i, K& S: n! C1 I& i1 q  y
#include <uf.h>
: C3 U1 |8 c* @: G2 G#include <uf_ui.h>
7 v* s7 B$ W5 H) o#include <uf_exit.h>
$ s4 ?* p! q: _#include <Windows.h>
+ ~4 |& p- ]! D3 P1 N$ Z& }5 G3 @+ D3 |. A$ X
#include <string>. S% ^: G0 q) ]: r+ B
#import "C:\MyVB.dll" no_namespace" I+ r  V5 b7 F' z8 N7 E
//using namespace MyVB;    //这里是COM组件名称
3 l, P2 l/ j' r( H+ q4 P6 k
  P% h# _' x7 J0 p4 S$ m0 A1 m9 R# A) c
HRESULT ComInit();; R1 o) d; H+ V
int mmm(char* str)
+ J2 F& y  z5 Y4 s( z. h' E{0 b' ~: s  u, Q$ w
        ComInit();
* d# ?$ `) `( n0 L# c# j! C2 n' ]: F: e6 X' U: \7 c. @
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
, x+ I# ~8 |9 M: T        MyObj.CreateInstance("MyVB.DEMO");
$ f0 ]; R& G% R7 R  d( _7 M  G7 ^/ M5 Q! F
        //MyObj->GetMeiLei0();//无参数调vb函数! Y5 i! Q- B3 m
! C7 D" i/ w  t5 O
char str1[132]="0.0";
8 u9 V5 }1 P+ T$ N1 c7 Z# j3 _8 v& S5 w" G. f( q
int n=5; ; E$ i  F; Z) }* p: v7 T
# z3 F. h" a5 ~% c4 e) b" ]( [
_bstr_t vRsinfo1;
, |1 ]$ h! y8 p7 p; q
% b2 Q2 X7 N3 y, t$ t* W* R3 P- hvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传5 e( O9 l6 E$ e+ A8 T$ V- g+ g
' N+ D" ]4 l3 w- b6 R
strcpy(str, vRsinfo1); //字符串赋值
2 S" z: F. a  {  d& l6 ^8 |$ D+ m: |
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);( Q; C5 U1 d; E+ j! o7 W
vRsinfo1=MyObj->GetMeiLei2("qq",1);; }/ v9 F3 j6 n/ q/ l
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
/ o4 y9 W; A3 `$ QvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);6 `9 k. A! b$ S9 Y
vRsinfo1=MyObj->GetMeiLei2("手机",4);% R2 U0 D9 [7 E
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
% D9 ]! u; z0 ^. q        return 0;! X- ~+ {0 w! t& J* t1 `
}
: \2 U. y- E6 F3 ?; h* |
( h5 n7 Y2 U& c+ t5 C& K3 NHRESULT ComInit()# Q0 l# {+ W, w' Z! P. T: j
{
7 Z1 O+ g9 T+ A; U$ ~. A+ B        HRESULT hr = S_OK;
5 o; I. q$ @7 [" m: w        if FAILED(CoInitialize(NULL))
% _6 W: d9 N% R( N5 P        {
% S+ F# N; o' h$ ^* e: G                CoUninitialize();
& e8 i( ?" y7 l1 ~                hr = E_UNEXPECTED;; B9 k/ ?. S' h2 U7 _9 H, q' O
        }. \+ [( e+ v' J
        return hr;3 Z1 \" ~% n3 {
}+ \4 w' b6 _7 O5 [$ I: y
' i. Z* n& u( l, a  q- l+ L

; @9 O0 B; O! f4 O#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))( n  k  L; I% e$ @: ], t
# ?& R" L  d, M$ R1 ]

; c! l( G" U9 `, i9 F- \$ t# t- f- _( X! D7 z1 r2 Q" \: L3 c
static int report_error( char *file, int line, char *call, int irc)8 K, E4 d( s' a+ ^7 p; i! c
{
. a7 K* W, i0 @' C# {- y$ @    if (irc)6 s& E  w, M1 j, ^% ~
    {
) j8 a# |4 E$ P: e0 ?7 [( w        char err[133],* A3 u. A2 p, ]3 ?
             msg[133];
/ J& g7 M! Z7 p8 H' Q0 w: F5 j
; ^+ R, N  x; s1 l8 H        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",; x: \! I: H! \2 X- J5 W
            irc, line, file);
. D2 ^- j, B7 J0 B4 e        UF_get_fail_message(irc, err);2 G0 j, @, q; p7 l
/ p( l8 X  r4 w# g% X4 R) \
        UF_print_syslog(msg, FALSE);
$ ]/ Y4 o- h" e8 G9 b2 Z        UF_print_syslog(err, FALSE);" s0 C" `. y$ C/ o$ _) z  L! ^3 r
        UF_print_syslog("\n", FALSE);7 d& P% q% ]  z- `& v. i+ D/ j
        UF_print_syslog(call, FALSE);
0 C$ i1 L/ E2 p/ a1 i. e        UF_print_syslog(";\n", FALSE);8 C' i6 e3 ?3 e" j( u- r
' d1 E3 E) T/ B. f
        if (!UF_UI_open_listing_window()); I7 D; M; g  s1 D$ n- S
        {
7 i, a) z  e/ ^            UF_UI_write_listing_window(msg);' y4 @* t5 S) t  I+ _8 F+ m
            UF_UI_write_listing_window(err);
4 E* ?% _; ]% K. j+ y            UF_UI_write_listing_window("\n");
" i; `/ I8 y8 v# w            UF_UI_write_listing_window(call);! ?* p7 H( [4 B/ q1 w/ r; I
            UF_UI_write_listing_window(";\n");
2 S: y: x+ w1 X- _        }1 q7 Q/ u2 n3 W+ N
    }3 \+ l# N2 p) y& }. W6 f! w8 L

1 ]. w- ^& R: L  ]0 B6 E8 V# L    return(irc);
8 `$ Z. Y! m& ?1 f" F; s# A}
5 W- \. u3 |5 a* S4 [
( d: ?$ n0 U' f8 k( Q' e8 n
, `, w9 w: t0 h7 v' n/*****************************************************************************
# m% ]2 J" M* m' M**  Activation Methods4 @$ k5 n' ~# _3 G
*****************************************************************************/: k$ O& k- o' h7 a
/*  Unigraphics Startup
( o# e7 d# b& I8 R: v+ j1 @**      This entry point activates the application at Unigraphics startup */% j! j- m( e) g1 M0 D
extern DllExport void ufsta( char *param, int *returnCode, int rlen )8 R/ W; n/ q) B) o  V  |
{
& d0 r/ C; u9 x9 K# v* s3 W  g8 N# I    /* Initialize the API environment */+ D) s2 `& k; R# X; O5 u" y' h, \
    if( UF_CALL(UF_initialize()) )
8 Y) F4 \1 D7 x4 x! \2 u+ w3 e    {
. [: v0 \& C1 `7 v( N: q        /* Failed to initialize */+ c1 [8 d$ D& o8 i
        return;0 S4 j, j  u' p; x; A
    }7 f, F6 B- Q( N/ D+ L$ ~

4 J) c( i& t1 q( H6 I6 [; }/ \, A4 R    /* TODO: Add your application code here */4 V2 ~# w6 g7 d4 A0 _

  X: ~, j8 l5 R( e/ @7 g6 g
9 V8 ]. C# m  X3 {3 \8 f- ]7 ~" E
* Z- u+ v4 i# I" U6 p7 {' A        char b[132]="";
) w3 v1 y: Y+ \& u2 c  M* q        mmm(b);
1 E1 f# ~6 U+ k        uc1601(b, 1);   //在UG弹出显示框) b+ y3 Z) [" @  L1 ~
" M% m$ J) w% D( H1 J
, F% ^. ?3 U* q. e+ B3 V" G9 z% t
    /* Terminate the API environment */- [2 o( c; `5 ^' n+ ?8 T, z
    UF_CALL(UF_terminate());
, p7 X7 j1 y- r, n# f# n! n. O- L}. z, d! X- ~/ k# N! J" m
$ h, d2 ~4 j7 s6 i: H( S
/*****************************************************************************
- j, s, L& x$ X! }! \9 ~* w, g**  Utilities+ k' Z( b% H# W: E% h& J
*****************************************************************************/
8 @1 ]* ~6 l2 k' B. |" s: H' u( w  p7 \4 c+ Q" J
/* Unload Handler
( W% h9 p+ i% P5 f: C**     This function specifies when to unload your application from Unigraphics.) p( c4 D& H/ q9 P  U. g
**     If your application registers a callback (from a MenuScript item or a3 k3 A: g  S; U* H
**     User Defined Object for example), this function MUST return8 U) p' x2 J+ k# \( A3 f
**     "UF_UNLOAD_UG_TERMINATE". */) i; P# K: e0 P7 b" \
extern int ufusr_ask_unload( void )' w+ Q$ D0 ~/ Y
{
9 J2 y. O0 b. c& g. U3 v" @    return (UF_UNLOAD_IMMEDIATELY);
. Z; W  e. o: G2 g" z  S- _* E' V}
, N! X* b2 M* f7 @- }- |
) A$ n5 y* Z( Z6 k; c
: Z  Y$ P; m' Z* W, P$ E/ e8 v8 L) s

3 ]6 i% O# ~& y1 I8 E: b
( z$ [. t8 G9 z5 _, q" V* K# ]/ `" H) W, ^. _  K  `  f: h+ Q; A7 ?% j
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了