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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
* T9 ]9 A+ k0 b1 S8 L/ b/ R& R( f
+ G) t% F7 ^" h. a/ D★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
+ Y7 r* B/ }$ B1 Y; E4 z1 p& e% J' E, Q8 Z
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册3 O$ g7 b! s3 s1 s8 @( K
3 s! [  ?; m4 t, O5 h9 f
=============================================================================
( D7 A2 s( w3 Z, i. G' R' H在VC中调用VB编写的COM组件
$ [" C3 l9 @6 r# B' H2 B& W
* R+ p; V+ S. P6 r( C1 U& z梅雷 - QQ1821117007
+ W8 M" q: M& W! l5 D亲测 XP、win7(32/64位)可用- I+ w' _2 j& y
5 G" b/ Y( ^9 s5 c
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。' q: _7 M8 l( L; `) e
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
5 @! w4 a. {- U4 B先说说VB开发一个COM组件。   z1 A1 s9 J1 Y8 }& K* r
用VB新建一个ActiveX DLL 工程, " I4 ?3 h9 F3 `' c: f; I
然后修改工程名称为 MyVB
' N; J  }$ {4 u: `1 ]  b) G再修改默认的类名为 DEMO 8 ~5 j& L" @5 L8 ^1 M
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
' w+ K6 `& D2 C" K$ s% b# ?( k5 H5 ~2 T/ z* R. G1 H
注意!工程名不能为中文不然在c++中会出现无法识别的字符串- c% N9 O& _/ r. m% _* K
6 T4 [! U. |; Y: {

5 x. v' k; J8 h  s0 a- G4 X6 q: ]) A8 |! G, o. h1 C( J+ G
Dim str(999) As String
  P$ B" ]3 ~! d0 G, o9 r- s, P. W
Public Sub GetMeiLei0() '无参数传递. g" b& n1 U/ a, ]
MsgBox "梅雷qq1821117007"3 {& ]3 U' \: b8 `6 z
End Sub( T: O* }4 {5 b* Z

" @. s( f+ Q- w+ d" f8 p7 z
& a; u- ]/ B$ I/ u/ J'带参数传递   Public Function
) Q, V7 [4 L6 B: b4 OPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
- e! [# x7 L7 J* m( |8 Z' Estr(n) = str16 f/ q* X: {$ M# `* l9 c8 Y: c

6 H; d0 P* D5 }' f) kIf n = 5 Then( @9 [) r, K& E
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)1 E" V' I$ F$ x6 J- N
End If! }$ h$ `# G# _: ^+ ^$ ^, `' b: A

3 H. Z1 K9 _7 t! k- u( P8 t; MGetMeiLei2 = "数组传递0"
: o# {3 P, p1 s# T$ e! p5 ~. f6 U# J9 b4 [
End Function& Q- @# s# D; d

5 [- q1 r  {0 h( b- G2 V8 q$ ~2 {* n: v3 [0 Y- d
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
, U1 @2 N- o: u6 J
) ]4 F1 i, M6 J# f. y2 |注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
( b) H+ c0 F' z: w- V/ h, U. i+ {. s- \8 H; s, I% z* d
# o8 k3 S: ~5 C& z
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 5 t; m, V! t. |; G/ F  ?
而 VC 里调用可以这样做,如: ' X9 K8 x; l' ^( o9 B
Visual C++ Code
! N  y) P) x% M" B* A- r$ B5 h4 |, y0 n7 J
//新建一个 UF程序,输入以下代码1 C$ o, r3 s* v& n% W
/*****************************************************************************
) \; a* N; R6 S: J**
7 @7 D, |' a: n6 s' Z$ w1 L** C++调vb.cpp& H% Y9 r+ B7 @- W& X
**
1 m9 X; X  t1 _2 W  k. y** Description:
, |% n" h- n+ j& m; [# @( O) i9 Z# Z**     Contains Unigraphics entry points for the application.; k1 U) {$ a+ M* e' D# x
**- o0 W! T% Y2 B& T
*****************************************************************************/2 V6 U( T' |, W. k0 z5 ^

1 x0 z; \, ]) a9 m& u/* Include files */4 I3 P. U3 x8 w0 n% ^/ h
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )5 Z% w, @" _1 R' b1 }+ p
#   include <strstream>
: i5 w6 Y4 t) {' X9 J#   include <iostream>3 e- V# P9 |. _; U$ X/ C
    using std:strstream;
9 a. U4 a: V+ T2 s8 e" J    using std::endl;   
+ q- g2 |1 R! z5 A$ s+ f1 ]) T    using std::ends;
/ |3 y9 @3 _$ _( z$ p" a: u' H    using std::cerr;
  S1 f1 _; o  x; H#else
% z! F: M2 }$ u. n#   include <strstream.h>" I6 @1 d! K$ v2 x5 X
#   include <iostream.h>9 s4 A2 j/ Q- A; m2 A7 o
#endif
! U# P0 ?0 T1 ^4 {! m% ]0 T#include <uf.h>
; t; w* f( G: a$ m* |  x! o# F2 J#include <uf_ui.h>
7 w! ^3 M* a+ Y" }! t#include <uf_exit.h>2 f, d% q5 L/ H8 R2 s7 I
#include <Windows.h>. h1 d- I3 _2 E

7 g: g/ O% V0 E( A4 d8 z) V# i#include <string>
$ A' F2 N1 {9 x/ X7 m#import "C:\MyVB.dll" no_namespace$ A1 I9 g7 `! e- Q. G
//using namespace MyVB;    //这里是COM组件名称; r0 D5 }3 t# J# ~% H5 r
( Q+ a2 P, z0 A( x5 ]4 k' Y
  Y' M  T) j/ S- c0 E9 S
HRESULT ComInit();. t# Q4 i, `- Q. m- o/ Q
int mmm(char* str)
! l0 G& k- o/ A& [{. ~  e$ y& J, E9 Y) g
        ComInit();5 Q/ ]& A. ]2 b
4 S5 {% d$ ~. q' S. R5 \7 r
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
: u( l) _8 G' G/ ]        MyObj.CreateInstance("MyVB.DEMO");
5 V$ r' H  ~; E# k$ c: x5 d4 q4 K. i1 w+ h, I
        //MyObj->GetMeiLei0();//无参数调vb函数# G- ^9 h' h# L! f; ~
6 t4 c  l) R$ [7 a
char str1[132]="0.0";
' [) i) R1 e# p( j7 e  z4 k. v8 W6 T  m5 [; D4 t0 l
int n=5;
6 l$ ~% L3 y( ]- e
$ }2 `$ y1 d$ B( o. O$ @+ [_bstr_t vRsinfo1;
( e2 t3 g5 v( f) q/ R( h8 c+ S5 D& S
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传# e* _9 _5 G4 u6 q' P1 u/ u
( \+ ^1 T4 S8 a  n' a
strcpy(str, vRsinfo1); //字符串赋值: o1 _$ d, K% z2 A* ^, E& D- [

% b& U& v# N  a' `8 m# vvRsinfo1=MyObj->GetMeiLei2("梅雷",0);+ S) _! d( ^% s% g7 @; N
vRsinfo1=MyObj->GetMeiLei2("qq",1);9 a1 F$ d& F2 m
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
/ k  R8 c5 f3 j1 ovRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
4 W" E# t! _+ E- V6 m0 x2 tvRsinfo1=MyObj->GetMeiLei2("手机",4);
" ^% [! |) [- c# L8 evRsinfo1=MyObj->GetMeiLei2("15757753770",5);
1 o- D7 c5 g4 P, l9 E/ {  D        return 0;  t6 `; X! f/ v( |
}
" e& i; X4 L& l8 ~% G
7 C/ a! S! Y; v/ O  ^HRESULT ComInit()& n7 u/ P1 d. n" X+ ~) I
{/ `2 r% A( O% I4 [, Z' y  f
        HRESULT hr = S_OK;7 I& h5 b( q7 j9 b) N& V# Y
        if FAILED(CoInitialize(NULL))
$ U3 b0 O+ p0 @8 q. b1 O6 i6 C5 V        {1 s+ E; \& C. n; x5 m
                CoUninitialize();" j# ^: M9 p5 C" G
                hr = E_UNEXPECTED;
! `/ f# n" [; @# P- m+ T        }! y& S+ v5 y# }) Y: q( d
        return hr;
# z) _4 N: Z3 m( d) b$ X}
% I- {+ s/ @8 F0 p! p* x, k) G* F  t$ B
# r+ |: V3 x* \5 k6 }
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
2 ^0 d4 N( ~  u0 A# K+ T3 R: K0 N
( z6 d; Y0 ]) f0 x
$ ]1 v3 R# W/ z+ G' R3 H; t+ a2 w( ?6 i1 D7 i$ C
static int report_error( char *file, int line, char *call, int irc): L! T. i4 Z- H; Z( B" H; ?! I" U4 z* u
{
4 J" `0 m9 V! A, F# J    if (irc)
5 W& Z) T( D- g7 w4 P3 m. w3 j    {
0 |7 E8 g. V2 x* N5 D4 R0 B: D        char err[133],) r2 b* F" d: _3 P
             msg[133];$ S" z0 n' Y' _. \; Q% L

+ z4 h0 I7 Y2 |. B8 I  p5 l        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",- o' a$ k* u/ x8 ?+ R
            irc, line, file);6 r2 |/ g& W4 }" l6 k
        UF_get_fail_message(irc, err);1 b) C# p  U9 Z8 |; z
7 S+ ]1 C- M4 A( f  w
        UF_print_syslog(msg, FALSE);
$ K" x# g2 o  M' u3 A+ P8 _        UF_print_syslog(err, FALSE);
9 i. A3 u8 Q* [        UF_print_syslog("\n", FALSE);
% F; O% t! x$ c2 ^% \        UF_print_syslog(call, FALSE);
  j& M! w! B" s1 l% ?6 A) V- K        UF_print_syslog(";\n", FALSE);; c- M! Y9 b6 m* K

. Q. H  O" T7 @9 P% k        if (!UF_UI_open_listing_window())( ?( }& O# U8 l! I) a+ ]0 l7 t" Z
        {
* z9 X2 a! b& R7 Y' t; x            UF_UI_write_listing_window(msg);, S% u& B8 N+ ]% }+ O. {/ f
            UF_UI_write_listing_window(err);
; u0 X8 n7 u, _            UF_UI_write_listing_window("\n");: w5 I8 ^2 a* Y9 G) n3 H& C+ A
            UF_UI_write_listing_window(call);
' h  ~" M' O! v8 I" {, @! |            UF_UI_write_listing_window(";\n");
8 O% I( }0 r. ], s; I- G        }# [& a/ I) D/ X  L, |; _+ A
    }6 s/ ~! N0 e/ v* v; ~
( ^  a. @! d7 O
    return(irc);( q9 d' P4 b9 O+ Z8 S- A: N+ L  a+ ^
}
. O2 b6 n6 R: q( O8 ~7 A# o' K
/ D3 `# z0 f  V0 |* ]* Y7 x" g
3 c4 M7 M" P! o& ~7 e4 P0 E4 Y! M/*****************************************************************************/ p8 {; e9 M# M& w: R
**  Activation Methods
9 _" ]; v5 C8 F. C4 ]/ }*****************************************************************************/$ Q( k7 J: i8 H4 I; H
/*  Unigraphics Startup: i) M7 I' @' S( [7 R
**      This entry point activates the application at Unigraphics startup */$ w; K% `1 T# [3 t, Z7 l# v) p
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
& V4 C& }  Z* }$ F! \. r{* b/ L- b6 Z+ B
    /* Initialize the API environment */: `/ \+ L$ C; G2 j4 D
    if( UF_CALL(UF_initialize()) ) ( J; W) W* {" @
    {
. B& L; M$ @& u2 o5 c* O        /* Failed to initialize */
7 x$ z! v! R) e, b5 K        return;
) |/ M# [: @% l0 \- ]; O    }
% o9 B$ s& W9 C  T
! u. M, W: q0 _' ~' B* }    /* TODO: Add your application code here */
2 k6 E6 m7 i. z7 {8 i0 _' P. j! [& P# x. B) X

% n; f) F/ K9 h2 Q9 k9 S5 m7 M* n$ i  h3 O) x: E
        char b[132]="";& Q7 k7 F$ x, q
        mmm(b);- [+ r# y5 `2 i9 K4 T
        uc1601(b, 1);   //在UG弹出显示框  m5 @( F7 F2 d- j7 \! v
4 h4 l+ t( m) V- G  \

6 L* Y( x0 Z9 |( o( E* B    /* Terminate the API environment */
/ U$ u% d3 a5 R) G/ a, g    UF_CALL(UF_terminate());& E: {  c! @3 i! Z
}
( Q$ P( _' ~6 j
6 G& X$ D) x! L+ w# E1 D% l$ s/*****************************************************************************
, g5 N5 d: S$ f7 ?**  Utilities
2 }2 b- o( @: c# }2 m. v' C( C*****************************************************************************/' ~. p) ]5 L) a% {
: H& C6 b1 |: z$ U- E/ `; Q
/* Unload Handler
0 k* g5 K( z5 c' L" \5 Z**     This function specifies when to unload your application from Unigraphics.* C: k! N2 M2 C# |) i! y# M$ K
**     If your application registers a callback (from a MenuScript item or a8 T- E, M+ e8 g) g7 \8 k
**     User Defined Object for example), this function MUST return1 E- y; a% ?& I
**     "UF_UNLOAD_UG_TERMINATE". */- c! r) x3 ?  H) p6 ]6 V4 t
extern int ufusr_ask_unload( void )8 I" N% q  k/ `# r4 y- ~
{
' N3 f: H7 U4 i8 |2 X2 i) q$ r    return (UF_UNLOAD_IMMEDIATELY);
, L! g6 }* V- r  f+ ?}# R) ]- _; m" D. b7 Q
3 k& S/ D6 t; H$ b, o: X' q
8 b/ A# W6 Y, Z+ ~  ~" U# ~1 P

5 j- f0 K0 d- K
( [) c9 E! V% e+ t! P3 u; L
  o) Y" T2 [2 k( M  S
( x7 _( L2 S2 q' N( W( G4 S* @" [
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了