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

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

[复制链接]

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

8

主题

10

回帖

146

积分

注册会员

积分
146
QQ
发表于 2016-12-11 15:05:21 | 显示全部楼层 |阅读模式

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

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

x
在VC中调用VB编写的COM组件
! l, P* B+ o, A6 h
; v- T% j( b2 ^$ \3 |8 j# u7 H( z/ `★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用* j$ b+ n1 w) ]! w  }( T; R
( T% U. q3 k& W+ |" T  K* M
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
3 q3 b" A1 d+ V. j6 H: s
; d' ^9 z) B8 W! H" T% o; a=============================================================================' {" L( |4 M% y7 ]2 h* V
在VC中调用VB编写的COM组件
7 ]0 e4 [1 i- L8 o
- R, s9 \% D# z: U, Q梅雷 - QQ1821117007
% t! m& o2 ?  M  b# o' a: S亲测 XP、win7(32/64位)可用
9 A; G, e* w: @2 p; p1 `8 W8 O$ |, l
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
9 U9 b% w- x3 }为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 9 k( \  F1 _" r3 I. f3 Z, L7 z
先说说VB开发一个COM组件。 ) B5 @  q* k- [; z& H$ w
用VB新建一个ActiveX DLL 工程,
5 U" u0 R$ x, i然后修改工程名称为 MyVB
- M7 ^1 g# D! [% a/ \# _再修改默认的类名为 DEMO 9 |8 d5 e* `& H! |* V  s
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
6 b0 m2 u" W7 }& f; g7 i
* ~3 ^' L6 N) E  q注意!工程名不能为中文不然在c++中会出现无法识别的字符串
6 p% c+ i5 \. I3 z+ c" i! |( x, w2 L

+ e( L2 g, {/ t4 n! K2 s
$ R1 ]- t8 n% Z9 a2 E3 _8 yDim str(999) As String2 L: X" ~* S, t! X8 ~
* x- V6 H. n/ f1 S, A
Public Sub GetMeiLei0() '无参数传递0 o7 A& ?* ~' L3 G+ x
MsgBox "梅雷qq1821117007"
# C5 i8 t! L/ n2 J+ p% ~5 k2 SEnd Sub
* g# D$ K$ t. Y% X1 ^/ }8 o7 b  I$ I
% ?7 K4 p! i2 r# S2 Y
'带参数传递   Public Function
8 Z* ~1 e, y4 H9 S% LPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String/ i4 X+ T4 O$ x) Z* q
str(n) = str11 ^/ P; @& C. h8 b: [4 x% B3 N" l; J
: b$ r; {3 i0 z* M+ X! F
If n = 5 Then
& t7 n$ C7 k( f  eMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)1 f" V5 B1 o7 V9 c* h! G& I
End If. p, B" y. ]; A. [' G& N9 G
% J4 v: Y/ `# f* H; y
GetMeiLei2 = "数组传递0"
5 W8 w. O) m% P+ y  d4 q/ \
- N7 e7 D( z1 Y- }$ k! nEnd Function! ^5 s- l9 T. j/ P  s8 J

2 a5 `% p0 I7 E' w  t5 o6 q$ `! J7 w1 f: Z5 q" `
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ( ?8 Y( j! p$ l
% a  y0 v3 h0 f
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
# @, D" }; _1 L  L& b6 o0 i1 ~

. ~' p/ e9 |. f& I3 }9 G& o" B其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, " k9 K* d$ q/ g$ t
而 VC 里调用可以这样做,如:
- j5 Z& t2 c" C- C% O' NVisual C++ Code ; S& A# _) g( e* V) @* M: _

% [5 V: v% q! c//新建一个 UF程序,输入以下代码; o5 ]7 a6 j. q& O8 f) `5 P
/*****************************************************************************% V$ f3 k, i4 m) j) {' x1 n
**
, j( [7 ?) Z# b6 s' a** C++调vb.cpp/ Q7 f  S4 p" i
**
+ Q6 f2 P  a; k% b0 r+ ]8 M( x** Description:
+ t9 o' X* b7 {8 K6 X0 ~/ f: H**     Contains Unigraphics entry points for the application.6 s0 z: u! R# \6 L  b, {, f" f5 I3 [
**
: H( W! u- O7 m6 Y6 o*****************************************************************************/
; e9 x& Q% l( \- t6 e/ M& y0 j* P, m$ D5 }( a: |: e0 p
/* Include files */; g$ q8 Y; S) R" a9 U( G1 p% V+ C
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )! U3 i1 ^" v0 n; {) ^* O, H" d
#   include <strstream>7 H. o* k, |; g: A/ {0 o2 ?6 M4 ]
#   include <iostream>& D1 W2 [6 ]# }1 ]% _
    using std:strstream;
$ D9 A- R) v! u; F3 ^3 ?1 s8 N    using std::endl;   
6 Y/ N/ q$ k) f6 d5 A) f4 ~    using std::ends;& c% f: p" d* Q
    using std::cerr;
0 V# f6 c. y2 r, t, {#else& O1 f/ \; r, A" ~
#   include <strstream.h>- ^5 I2 V  ^' c6 S  A
#   include <iostream.h>: m9 J* ]4 T( z5 `2 H2 I) [
#endif9 o8 n2 f7 S* J4 y) }) f
#include <uf.h>
4 V3 o7 n$ T+ f$ a9 U& e( Q#include <uf_ui.h>
1 n# @: m. L3 K- b2 ]7 O8 P, O# C7 V#include <uf_exit.h>' n* @4 N4 n% F3 v) o- F
#include <Windows.h>  L/ }. a" M* M# z: `% ]+ j' }( {
. D6 ~/ r4 R" \5 g7 K8 @
#include <string>
$ R% z$ ~; X$ k+ K0 ]6 u8 ~# e# {#import "C:\MyVB.dll" no_namespace
! y( h, R% I& [: P/ G9 [* L, B0 S//using namespace MyVB;    //这里是COM组件名称
- |( ?/ {( F; q8 Y
0 J, u2 q8 {  v/ S  \" t9 F6 g( S+ j( X5 i- k
HRESULT ComInit();
, t6 D" l% s2 Fint mmm(char* str)
: w3 |$ Q+ I; k+ l: h{' U) y+ c: U6 F9 k% a
        ComInit();% `2 D7 V) [- b$ N

5 o; j- p( m( B6 `- ]' w        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象( f; w" a) O" {5 k' b+ x
        MyObj.CreateInstance("MyVB.DEMO");
% T+ R* D, ]! r2 A# m" H. O& c+ t/ W" |5 {& \$ \* G9 y
        //MyObj->GetMeiLei0();//无参数调vb函数; ~  z+ p8 w8 a. n  v

9 {3 ^6 [2 Y2 N: N& b$ n! L! C0 Nchar str1[132]="0.0";( g$ y- N3 x# V8 @1 ~5 ?/ E
# M4 b( R1 s# s
int n=5;
0 A- z; p0 K3 G3 E0 W3 X
& u  @- B/ j+ e" G' i_bstr_t vRsinfo1;
; |) Y/ ~  w0 Z) M6 h8 a
9 O2 b# V9 {2 K- \: G9 svRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传; [- U9 X% t* E% c( G7 q1 \

' I, W6 X; e/ tstrcpy(str, vRsinfo1); //字符串赋值1 ~) Z: V' |: N8 T5 k3 m4 V

9 S' F9 o3 V1 U) B! V) O, fvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
3 ]5 i6 V- s- t8 {) zvRsinfo1=MyObj->GetMeiLei2("qq",1);
1 l; H. t4 O, d0 mvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
, y! j8 r8 r+ c7 x" V% ?" w# VvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);: v5 ^, v& z1 j9 Z4 [- q
vRsinfo1=MyObj->GetMeiLei2("手机",4);
, d5 i. y3 f5 HvRsinfo1=MyObj->GetMeiLei2("15757753770",5);) C6 s% Y* G3 H4 h% T' `1 q( M8 T
        return 0;
8 z" V8 ]$ c- P& N& r2 Z5 a}
  l; f" W; K! T
& c% Z5 N# O7 A7 m  C; L$ hHRESULT ComInit()
) M* D5 l/ K# Q' d& \{
* i6 f0 z5 n* e        HRESULT hr = S_OK;
  X% j* X2 W) d6 o1 ?; y1 A* f        if FAILED(CoInitialize(NULL))
8 V! d+ S8 i( r+ k1 O4 ?        {
: m: G2 A+ f: l9 w                CoUninitialize();- ]/ @; E0 B+ s: W2 ~9 l3 D
                hr = E_UNEXPECTED;
5 b2 {) D" r7 Q: S* ]        }
& N% ~  M) u! D; Y  s8 y# o        return hr;" y2 u; k3 a! H+ P2 q1 ?  ?: E
}, [; \+ ^# `/ A- b0 I8 X* V' \

3 ^, @+ E4 f7 `# n0 |' T6 x! R
! A/ b1 U) Z! l& U. j/ Q#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))- y# k* [: k& ]5 a

/ D! R" M: [' [  B% U0 W5 W9 _/ C5 e& O8 f

" A: D8 K# n5 c; p! u4 O: ostatic int report_error( char *file, int line, char *call, int irc)- d# @3 G  e2 \0 I5 ]% `2 I
{
8 m8 c2 X7 {& o. b! O+ H    if (irc)! C( Q! ]( a1 W1 h7 @' Y
    {0 Y4 _4 S& {8 }" @. g. F- o3 d
        char err[133],1 Z# \2 }9 x# m: b& }
             msg[133];
8 r5 o, I9 d+ V7 o: G7 |
  R  I. p7 ~& k4 {        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
9 e9 @1 {) q8 l* @  y6 k( L            irc, line, file);; o2 X) j9 \2 e  v$ R# q) Z
        UF_get_fail_message(irc, err);- |* t4 U; u3 e& i

* a( [* ~' m" s: w; @  h5 Z        UF_print_syslog(msg, FALSE);
! i2 W, T* I% m3 e! T- X( Y        UF_print_syslog(err, FALSE);( O: N& p" c' T' N4 v
        UF_print_syslog("\n", FALSE);
* z: k4 `% f2 T; J% O& d' D        UF_print_syslog(call, FALSE);, {# B! T' \! k: n1 X4 h' w* k4 u
        UF_print_syslog(";\n", FALSE);
$ u, A+ ^; u! F
  _2 k- `9 P2 C1 c        if (!UF_UI_open_listing_window())
8 B1 x6 J1 I2 V3 z        {. m8 t  n& B$ b5 T$ [% w9 i2 I, G: k
            UF_UI_write_listing_window(msg);
) B0 ~0 ^% {: p1 }; l7 {. n            UF_UI_write_listing_window(err);
2 q! i- |9 x8 S3 v            UF_UI_write_listing_window("\n");( i5 O" g- k) Z4 c, @
            UF_UI_write_listing_window(call);7 u8 I' g0 B; T/ M, o! [
            UF_UI_write_listing_window(";\n");
9 N3 e: p2 T0 c' e( n5 k( O3 V        }
  `- B  ]9 C( }) c7 k    }3 |- w4 V& F/ E8 F3 B  b
" L2 y3 `* q5 x2 [
    return(irc);4 z: G2 b6 M1 {6 a9 x
}
0 L* ?2 c3 c' i7 D+ K( x% T
) ^, A" x: S& ?; R, o
. p+ X' D1 p1 G! w/*****************************************************************************9 D2 J3 b, d2 g
**  Activation Methods9 u: U6 t# B$ W$ g: i2 d' L- D2 X' S& o
*****************************************************************************/
/ ^7 P- i; l3 ?* P& Y6 s3 h/*  Unigraphics Startup
7 p9 Y: O9 l+ n  C; m3 B2 r' X, ^% W**      This entry point activates the application at Unigraphics startup */+ Y+ W- \9 n) S# W
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
) w: U; d* s6 j- I9 }{5 Y# ?3 E  t- r  k$ M
    /* Initialize the API environment */
! l  R/ ?/ s4 s/ F, _9 o    if( UF_CALL(UF_initialize()) )
5 z1 y) ?5 x/ i$ f    {8 [- P* n7 @/ a& t
        /* Failed to initialize */
3 I  L+ B- b) i" P7 Y' q        return;5 o7 U1 f! m" [% O) d7 |, b
    }
, @9 Z4 ?$ K4 b0 X5 ]
8 u& a: L; \" T( W3 G3 I    /* TODO: Add your application code here */
% O! ^, Q  k. I3 K  }8 A- t" }) |& r% I2 B

% z" [! M! L  b+ F7 J+ [& e% e+ ]( E
        char b[132]="";& b, K2 F0 U- o- n3 z& S& {5 r* o
        mmm(b);
" i, v' s. {7 s        uc1601(b, 1);   //在UG弹出显示框
: J8 w; _4 e) E7 v& \" t# F7 ]: k
' o7 D. u* d+ c& A( Y
- t6 O1 T  g, [3 C    /* Terminate the API environment */
6 H; P3 S% b1 [4 Y! O5 m    UF_CALL(UF_terminate());
, f; [0 {( K& y: J9 c( G$ f" |; @9 C: [}
9 Z% w0 [. ?* h0 w
% F/ M2 d# S% F/*****************************************************************************
& y! d" Z% X0 v8 i) Q: X" \0 I( ~$ e- ?**  Utilities
# s7 P7 \7 i2 G) K' b- b*****************************************************************************/5 \9 @/ @' I8 I' a8 \$ }9 k% W

; @# B  V; u* b5 `/* Unload Handler+ Q" q% I. R' ]) X" s! y9 L
**     This function specifies when to unload your application from Unigraphics.% [3 J9 n& U4 ~4 z  w
**     If your application registers a callback (from a MenuScript item or a
6 o8 P* `/ i5 E' k; R**     User Defined Object for example), this function MUST return. V! ?6 r, S) R
**     "UF_UNLOAD_UG_TERMINATE". */
" u3 t4 @4 Q1 R' V6 I0 M# t6 h7 ?- Bextern int ufusr_ask_unload( void )
- @$ Y8 {3 U# m4 V9 [{
2 L& {! q( G8 |  @    return (UF_UNLOAD_IMMEDIATELY);
2 p' x/ A( i% O. S}- D; g- t+ j* q' @
3 e7 q3 S$ S- R8 W* Z7 u: R

3 ^6 V0 {2 G4 j
4 ]0 d5 k6 h+ I) n- c: O5 S4 i$ c, h6 f% P. O, }6 D
/ z0 |% P) M" T# c( L* r2 D/ P
/ c# h, l' p  Y( v. B
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了