PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
/ q1 @, E. R0 |/ S, K; T: C
5 Y/ E) L7 o$ P  V★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
! `, X$ x) o; B; y6 i( A! @4 f- K( ]* H$ J( |' e
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
- _! S/ s  ?+ X  p: f  i! z/ a) l# v/ L2 ~$ q: m" Y
=============================================================================
# Z& J% ]/ H$ f& R在VC中调用VB编写的COM组件1 [2 w! F5 \* p+ n

; L( d) y  f0 ]# e9 p& F6 H" g梅雷 - QQ1821117007 + I& E) v. C4 @" r
亲测 XP、win7(32/64位)可用- {  c! N' Z# I1 f- f! J( I, t- d

) W, D$ e* |( R& aVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
7 M7 a  R% w# K5 b$ k' Q" L为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 9 w6 _% `+ ^, W+ `
先说说VB开发一个COM组件。
( C  y& R( q9 d. Z, o( l' o/ |用VB新建一个ActiveX DLL 工程, 1 p2 N( F5 s$ S5 y
然后修改工程名称为 MyVB 8 P% y' w% i( p% G, l
再修改默认的类名为 DEMO
' ]5 F* l2 [; d- X& [. W& S6 d# I然后再向类中添加一个函数作为测试用,如: Visual Basic Code
. S' G) L4 j+ v  c/ O9 T% Y
2 O5 v( n: O  l7 C; ?8 c7 F注意!工程名不能为中文不然在c++中会出现无法识别的字符串$ f7 [8 H9 R# G7 x
( \; C  k% q; o
! G6 H" _! k$ o4 k% N4 l& x, ?5 J
$ o  [6 c. c% z6 f5 R& }2 [; f3 P
Dim str(999) As String
  g% k! {9 c' n8 U0 N( b7 X& K9 c! B* Y5 b$ n$ U
Public Sub GetMeiLei0() '无参数传递; |# P: K2 O4 k) S1 h* `
MsgBox "梅雷qq1821117007"
# ]+ j8 m3 Q0 HEnd Sub
4 D# @3 W4 [. @4 R" O+ c+ H9 S
0 g; f0 Q# F. k3 u$ _# D: p
/ D  T) v* [( ~8 b, t'带参数传递   Public Function
$ ]; K3 R" j. v4 q4 u# W0 h$ y  B; MPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String% [- n" }# K0 k! K' m$ d2 R; A
str(n) = str18 ^& p$ F/ W7 a: h/ W

1 \6 N( q: a7 r& uIf n = 5 Then4 G+ y: m" }5 r% S+ k/ Q/ v
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)  O, j0 G/ c2 e  p. i& j0 v- s
End If7 q+ j: P$ V+ o1 M& T) j

  b6 E: C. ]3 i1 V8 tGetMeiLei2 = "数组传递0"- h3 i" I& x" C+ \  L/ I3 H

- M# V. P6 s1 h" @6 lEnd Function# ?& J( N% U( M
, T4 v, {) D* Q9 X' T' R8 ~% `$ _
7 |/ S+ J) B  i) H1 H7 Y5 T
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
& x9 A/ |# A/ [+ s" w
" m. u) `0 w, ?/ {注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
7 P  j" x" R. k$ ]/ B- H% w, D% l3 s  b6 G- N1 `3 ~

' i1 i  f+ y& L7 L- p2 P其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
! U7 S7 w* w; O+ L+ b. ^而 VC 里调用可以这样做,如:
2 r7 }6 k' U9 r: XVisual C++ Code 3 X# O* s; F& \1 O
9 m4 e. v1 l; v8 r( W& h, _
//新建一个 UF程序,输入以下代码
$ z6 K+ f/ W) o/*****************************************************************************: p/ A4 O/ |( j' x
**% R' n9 W1 h/ ]$ z  ?7 F
** C++调vb.cpp
) @$ F, Y. U/ Y2 B! x**3 k. y3 p4 Y: u7 S0 f$ Q3 Q
** Description:
8 U* J% ^! X4 {8 P# I9 J**     Contains Unigraphics entry points for the application.3 A' j' z$ N2 c8 c
**# u. J. e9 a7 ~
*****************************************************************************/
: y2 T9 [; Q  b* ]
& _" h- y7 Y) t2 _/* Include files */
" j) J# z/ t8 G: p: q. O7 @$ N. }#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun ): @% b' E) ?  W& q' `
#   include <strstream>/ y" a5 h: S8 o* t4 y+ z0 U5 O
#   include <iostream>7 m0 @4 Z  \* V' B
    using std:strstream;
8 O& [1 H: Y* J& T    using std::endl;   
* @# J4 @' ]& K2 u: _9 i    using std::ends;% f! P& I" ]5 ^* t8 z4 e
    using std::cerr;
' _" r& N# }/ b& m! e( x, U#else" I  C1 L/ q4 }9 n4 j/ g4 P: f
#   include <strstream.h>, B+ }4 U3 A: i+ {
#   include <iostream.h>/ u& T& ?/ H& h0 ~( x
#endif
# I8 Y" _  y( V" P#include <uf.h>
+ `4 |: ^/ ~4 W#include <uf_ui.h>% Z9 y& ^" j; j; ~! e
#include <uf_exit.h>
& O9 T& s# D$ v* t4 p9 V" l* o  i5 i. k#include <Windows.h>' U1 S/ r. j% R+ Z' _

, o4 @9 T1 t" p, z#include <string>! v3 v* f0 ?. ]* X: L
#import "C:\MyVB.dll" no_namespace1 a: p$ o3 Y& V) l1 Q4 ]" B. i: H! K
//using namespace MyVB;    //这里是COM组件名称
0 k* U  E* \  t3 @  Q  t8 M8 X: l( V; j5 i; ~! Z9 X8 c
; C, t, {# h3 j) R( r% U
HRESULT ComInit();
3 ]3 }6 `4 p+ r/ d# q1 z  G9 Aint mmm(char* str)
+ K2 f2 ]" }6 i2 X6 z: A7 P& ]{2 x- E" T+ x4 F& O
        ComInit();
  h, c' M! F8 O* i7 w
5 O/ F$ ^2 r) B) Z7 H        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
4 k! b$ }0 @0 w( h- G1 }        MyObj.CreateInstance("MyVB.DEMO");
2 S# L5 [  u  z& H6 j& m
6 K4 c" ?$ h3 s$ \/ K        //MyObj->GetMeiLei0();//无参数调vb函数
2 q* L. ]+ N2 v; Q* w: d
1 T* p+ t2 ]7 U, \  r5 n7 y8 a5 _char str1[132]="0.0";
) b. @8 U. Q/ m0 w# j
7 q  N* j$ u; l* S# l9 e2 k$ Gint n=5;
+ K5 }4 X0 G, v- E( N5 R4 r% q' d- M" _: v
_bstr_t vRsinfo1;+ d( x  Q8 A* ]$ m2 W

) J9 p: A  Q! t2 @) T. |# UvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传7 ]1 u3 \# q" s2 g

$ M# D3 f; I( K) m4 Wstrcpy(str, vRsinfo1); //字符串赋值
) F9 f& s, }3 `$ V& E
" y4 a* p3 F: Q; _6 X8 l; F+ ^! GvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
- J: T1 q6 d4 W# q2 I( uvRsinfo1=MyObj->GetMeiLei2("qq",1);* c$ u9 c) j$ `# t# W3 T
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);- z( L4 Z% n0 k; x* v
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);) `$ S, i; J) M& K" v
vRsinfo1=MyObj->GetMeiLei2("手机",4);0 m0 t( S  X! A
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);4 w% {2 W6 O& i7 s  x9 m1 g* m
        return 0;
# c3 _6 v; s) v) O  b. D}2 }3 n4 t) k7 v9 A" B1 n9 J2 e8 u" C
# d! i+ M2 N# H5 d0 R4 k
HRESULT ComInit()
4 L0 j1 W3 u2 m  T{
6 }5 h. K( w) E$ ^+ }/ o4 B        HRESULT hr = S_OK;( @8 k, i4 F$ x
        if FAILED(CoInitialize(NULL))4 D  v! n2 B3 \- T1 q* o; i
        {
7 a2 `/ S% O% J( h3 ]                CoUninitialize();7 s1 o" i  v  c. a3 g1 L: z8 n
                hr = E_UNEXPECTED;
* f; B7 d" m; {3 H! {1 [0 E        }  ~4 U  n% i% @% e
        return hr;( m3 F1 }7 y) d2 S0 ^. Q0 X
}) }# R& c9 m0 t. L  T: n, e

6 E# x/ y  y) G5 ]& d4 e. X# P1 I9 y$ y8 s4 y
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
1 ]3 K( Q0 q& k: n: Q/ e1 q- M# C* F( P; K! _' ~/ y
& z4 B" U! p7 J! g* u) L
6 l+ Y; q6 v# ?/ q# J
static int report_error( char *file, int line, char *call, int irc)% H  N  M' S0 ~# Q# A6 \3 t. `8 }
{
1 y" g4 l& u' u8 Y    if (irc)
+ n: ~/ s: B! T$ s. u! A& F    {
7 p2 u9 h0 Z! F1 E/ F        char err[133],+ s% I3 t3 D" v; E* N8 E" `
             msg[133];6 v5 \0 |: e( }# S2 e# I

( I6 {7 V3 |0 R, n, Z  s6 p        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
, ^% i+ i) o: Y$ D3 Y) w$ b% m            irc, line, file);/ ]5 b% \6 r# o
        UF_get_fail_message(irc, err);
; @/ W4 e; b5 o/ A/ F: c
" P+ j1 Y: A: u8 h        UF_print_syslog(msg, FALSE);
! t! k/ [& J6 @+ e( u  Q* y$ h; |        UF_print_syslog(err, FALSE);
' |8 h9 [4 w1 f5 T7 `8 G4 o        UF_print_syslog("\n", FALSE);
+ z( ]5 n2 o& D) n. S0 i& n3 ?" c* g        UF_print_syslog(call, FALSE);6 t* H- K- Y4 \+ x3 a; O7 ?
        UF_print_syslog(";\n", FALSE);
# n  K# N+ ~* v' Z" g% D' y9 G) g2 M
        if (!UF_UI_open_listing_window())  D: b7 Q# q$ {1 b8 i2 E( D
        {, U( M( r0 M  c7 r' y+ G
            UF_UI_write_listing_window(msg);# J2 U% P& W  O3 Q4 i# Z3 t
            UF_UI_write_listing_window(err);
1 s4 L% W* p2 h, P5 @8 I            UF_UI_write_listing_window("\n");6 @6 M7 V( c+ K' k0 S
            UF_UI_write_listing_window(call);; c% [+ {) k6 L1 f! `
            UF_UI_write_listing_window(";\n");
8 M% \5 N! h# g" i/ |, h$ Q        }/ Y# ^0 e; g! l8 h8 M- C
    }1 b1 u0 y" ~9 S6 A
( `/ i, i! U7 s) i) p5 }: n/ g
    return(irc);' e6 _2 g& h" c( o: I9 F
}
1 B5 W) O" m. ~
: g, ]. Q7 F2 t6 o
1 t; ]9 U3 r8 U2 g3 X2 N/*****************************************************************************
+ |8 H# w+ B. @6 e) m, g6 K**  Activation Methods6 C0 d/ m' L, |$ k
*****************************************************************************/* {/ f# x+ Y- Z0 v: |0 h
/*  Unigraphics Startup( @% q" c# ?+ {1 M7 `
**      This entry point activates the application at Unigraphics startup */
) P8 ]3 ^$ q3 j: m, Q2 f5 Fextern DllExport void ufsta( char *param, int *returnCode, int rlen )
% _! m9 {- {8 J4 }& g{6 ?5 {; ~% ?- x4 ~
    /* Initialize the API environment */
& g0 n% \; Z% g, U) l" {. X! @    if( UF_CALL(UF_initialize()) ) / ?" v4 W* A( ]; q
    {
. |7 \# b/ ^( m. I; {& |4 r6 Y        /* Failed to initialize */
9 F, r8 h! B. r( E4 b        return;
0 V5 ^; U/ {8 [5 I+ L& D    }) u, g/ Y; H+ q, H; X$ C, O
  O5 a( M. q$ J$ {( I4 x' Y% R4 u
    /* TODO: Add your application code here */
+ ~3 P1 E) `% W6 K2 I5 O4 n/ q- _' Z6 ?* G+ ^5 }+ E  R! Y$ v
. z  [. \5 O6 d" k
, P2 w" Z) z" r
        char b[132]="";! `9 G$ h1 @8 E! j# x
        mmm(b);
! Z* w; m+ |, t$ O9 P: c; P        uc1601(b, 1);   //在UG弹出显示框
  ^2 p7 U) Y3 E( I0 k6 U* s2 v! K7 i( q- e* Q6 o  z# I3 `, Y2 r
2 v+ \( b7 A# L
    /* Terminate the API environment */
5 D" ~4 R/ W; Y- F  @+ S6 C    UF_CALL(UF_terminate());3 g1 ?6 n$ a! l. x
}$ l! H+ W' d. N% h2 b9 \& h
. a( c7 r5 p; [% g
/*****************************************************************************3 `( n7 ^! m' _( Q, R2 s
**  Utilities. Z5 j$ r$ z2 W1 m0 s
*****************************************************************************/
- I, r% A! U. i" q7 J* n3 H  p& O6 n! v7 `3 t
/* Unload Handler
1 P! p% |% }  p2 y7 `9 ]. T! Q**     This function specifies when to unload your application from Unigraphics.0 u; z' k% i5 c0 e2 M
**     If your application registers a callback (from a MenuScript item or a
7 S0 l" ]' P4 `/ X/ ^/ P**     User Defined Object for example), this function MUST return# E0 Z- w. ^3 g  ]4 G0 z+ `
**     "UF_UNLOAD_UG_TERMINATE". */1 U) A0 j- q6 F3 Q
extern int ufusr_ask_unload( void ): F; U4 x0 K* s" Q) r1 X! k
{9 _8 e  k  U" C& m& O
    return (UF_UNLOAD_IMMEDIATELY);) T+ j0 |3 i# K7 o  `4 w4 n
}
' ?3 @8 K8 Q# l/ \$ S  r% [6 p$ {( r  Y* [5 O
( v2 M+ T% M9 b% q+ K3 z% K

9 b1 ]8 c! m8 l  u4 b
' b. n  a/ ~- i! H" u+ `; R+ h' n1 s7 K! y- R0 M0 G6 m& |

$ K9 K: C; w6 V
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了