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 2508 0

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件( {. \5 h# V; W

- h2 O7 a2 L9 L% [. R7 O. g. E% A★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用# W" ^% x/ u7 A% }" o4 ^- q

5 r7 Q4 C( }: Kvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
, A/ H  [, H0 M: W' i) Z
* Y+ T; |8 |8 |6 \" f2 E=============================================================================; w/ q' Q# M5 F1 H9 s( X7 Z
在VC中调用VB编写的COM组件
, z* ?0 d+ s7 ]8 D
! Q  E( @* R& I9 |  T梅雷 - QQ1821117007
6 L1 _$ }" m0 E( c亲测 XP、win7(32/64位)可用& M( s3 k* W6 i; w9 L+ U

1 I, ?" v7 ~$ `4 A! n! `$ j# R  v7 iVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
! A- g* Y  f# w为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
/ ~; s% h# P5 i. I& [4 }8 D; k先说说VB开发一个COM组件。 ) a$ V! C; X2 R$ F8 o- N
用VB新建一个ActiveX DLL 工程, 1 o! p2 Z6 ^( J/ x9 r4 A  I0 P: t. {* ^
然后修改工程名称为 MyVB , s5 ~& a5 }1 k& }" J  Z
再修改默认的类名为 DEMO * B* A$ w8 Q3 E2 }$ K1 o
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
+ v/ X/ m5 h$ A7 }0 v1 g$ ]1 S+ N) D1 r- @9 ~7 l4 G, E2 A
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
1 K: `+ L2 s2 t( I2 j1 H% J+ i7 X
5 B' W8 z9 [/ C% ^  i6 W% c& @, o5 \6 T- B4 A4 c3 w
2 r/ v' o$ H/ [# {# m
Dim str(999) As String
9 D+ m* o  f, F/ d
& ]7 F  W+ ~! k; t) o6 IPublic Sub GetMeiLei0() '无参数传递
: L+ O- y6 N6 cMsgBox "梅雷qq1821117007"
2 r; `; `8 k8 NEnd Sub  ~$ K* G% j- _' \3 }- A

+ I, h3 v5 o. l+ B3 m3 V. T5 K: X1 n( G9 I% I$ i3 [9 M; S. P
'带参数传递   Public Function
$ t% O& F7 g; s! x0 R: s; O7 }Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String) n. ^* q4 M6 ^. m  I6 a# T. ~
str(n) = str1
2 i3 v2 s9 r) e: T; w+ ~( r& l& O8 \$ n! E  o7 r6 m
If n = 5 Then
' g" @) V6 Z# i* GMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)2 V0 K* C1 O/ F! U% w
End If
& Y! v/ O. x$ u0 R( G0 S
8 Q% u! T- o/ v, w: r2 t& kGetMeiLei2 = "数组传递0"8 H6 x, W9 u8 p; D: h# A: g9 t
& W9 E, `( c* g* ]
End Function  t2 u  s- t! k) D  y
( u2 e+ S$ b& q5 ~4 e# U' H. c2 j% m
# G6 ?# S+ y/ ~- s+ r
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 & R+ ]* Z! j3 |$ {, J) n' m

7 w2 [# W1 j* J" K" r6 d1 }注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
1 _2 M1 Q2 ^" Y/ w+ e* ?, x  Q, J5 B" f8 T7 v. H6 }# K- X( a
7 v; r1 D* _8 K' A2 w
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, . O. q6 q. r1 [) h  q
而 VC 里调用可以这样做,如: 4 e, }: F. h, @7 r# `& A2 r4 X
Visual C++ Code
& _# }, z# C' c& V" t' }! j" W3 ?# g* ?% C! E( X
//新建一个 UF程序,输入以下代码& J$ F1 N- T( S3 b
/****************************************************************************** {7 g; \9 }6 L, p8 M0 |
**8 ?' D: l( L7 C, z% Z& O+ ]
** C++调vb.cpp$ Y2 U7 E9 V6 a
**. O" i0 S! Y+ O# i& f5 @2 g/ y9 j
** Description:5 L2 m7 O# r# f- ~( \" N
**     Contains Unigraphics entry points for the application.
+ T. a; t2 i$ ?+ C**
) R" w' p0 V& g: |/ Y, t6 A*****************************************************************************/- l8 z3 i  A. J1 E

! P4 V4 ?% _6 a. I/ J4 J# @' l/* Include files */+ ]3 x6 p3 H/ H) c# l% E; _
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )" u. \/ v2 U9 v, K0 H8 e7 g! h
#   include <strstream>: o# Q& p6 o( X" m0 L9 O
#   include <iostream>) ]: d' `/ I7 j9 I! S
    using std:strstream;
4 g# F# q# u) Q; y    using std::endl;   
' \- M7 \% I. }( @/ ?    using std::ends;
: Y/ H" j: z# [, I  d4 X/ X( C    using std::cerr;* Y' _, V* |9 j- E
#else
( e5 z. n7 V% Z% I* f: Z( Q8 y#   include <strstream.h>
. W; F5 u" A) D+ A#   include <iostream.h>: p; `: H1 @6 {$ T0 T% g  c
#endif; _' X  q+ l  Z
#include <uf.h>. T  K2 ]$ W5 s5 `
#include <uf_ui.h>
% J( m1 C5 s; t; {#include <uf_exit.h>
. F; h5 R! p3 _/ A#include <Windows.h>2 ^0 g# D# c2 v# b+ C8 M5 S
4 h$ n! I! J8 r9 N/ u  V
#include <string>
3 J% {2 P! k; U9 U4 \( V#import "C:\MyVB.dll" no_namespace1 ^: f' `7 O( h- B0 B5 p0 g
//using namespace MyVB;    //这里是COM组件名称
: i9 y+ @  A( k. A$ N
- @9 ^5 H# }+ N' X+ R8 @- m, P- b4 z0 b6 j- v+ m" _) J  T
HRESULT ComInit();0 g0 g5 w/ ~) d1 ^
int mmm(char* str)
0 b5 q/ |2 Z; j{( ?+ W! g; V5 x8 U4 Y; E2 p
        ComInit();
  ]3 W2 q6 }  V7 H3 J& Z2 {. ^/ W" S& F  {7 A
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象; d+ R8 w! S3 b0 Q1 ?
        MyObj.CreateInstance("MyVB.DEMO");6 e  [4 s# E* I4 Q& k5 H1 o% I- {
& w, y" k1 l2 ^) ^; ~# Q/ `' x3 C2 g
        //MyObj->GetMeiLei0();//无参数调vb函数
- u' P* p, o# u0 j' v, s$ K2 H6 C2 e# D  `5 }% N) b/ I
char str1[132]="0.0";1 ]' V; [" ?1 X# c6 w0 \; K. _

" V2 s2 N" Z6 T- K3 `int n=5; ! j) ]0 B; P: f+ R( i2 U( q
+ `3 l0 [3 g. N8 B
_bstr_t vRsinfo1;
4 n: u' l5 M$ ]0 i8 i( ^8 e5 N+ e7 C2 x' H- V% {/ y4 L9 N
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
3 x% v" k  o5 |: p
# z: _; O" ?; |0 A4 [strcpy(str, vRsinfo1); //字符串赋值
, `# T% c! V4 U9 v" W/ Q7 y: j; S
# S) P3 f% n: [3 NvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
8 r: k, K9 C. m- Q7 ]/ dvRsinfo1=MyObj->GetMeiLei2("qq",1);1 L8 Z; j7 Q0 [5 |
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);5 x9 P; m  Y+ K
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);1 T+ N( X0 P8 y
vRsinfo1=MyObj->GetMeiLei2("手机",4);
# I8 o: \1 s9 [vRsinfo1=MyObj->GetMeiLei2("15757753770",5);6 ?' j" J' F- R+ d
        return 0;
4 b, T8 r2 T( a4 p8 ^: L}' X+ e8 a6 |9 m4 \
- d( h2 [) S" Y
HRESULT ComInit()/ [( D; r( {6 E! o
{& C% ?+ m1 a3 |. L* V- A' ]7 f
        HRESULT hr = S_OK;
- j' l* c# g- d2 I6 d, z. S5 B2 i        if FAILED(CoInitialize(NULL))
9 {: f- ~. H8 c9 w        {
- L2 _1 g4 b) @  U2 a% Y/ \( K                CoUninitialize();
3 S* b, W3 w2 j                hr = E_UNEXPECTED;* Q2 ~, A8 a" N$ C
        }
& O% x- N7 S) E        return hr;3 [- B& x: N# b7 p& K2 V7 H1 e
}
1 n/ e' ?! O& U" N8 K+ y& c0 V8 M% M. `! T8 k
, ~* D) H. @* @1 x+ k5 x
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))& E. F) q8 ]! x. u% n5 ~/ q8 q
. C; {5 _! H2 \" O
# r6 Z- b4 ~4 }0 e* e# b

0 V1 z( t: j% L* E8 i" tstatic int report_error( char *file, int line, char *call, int irc)
. t% V! t8 C1 o4 L{/ y5 z6 b+ g1 f4 O1 W9 I: ?+ A
    if (irc). N. s- D7 a/ {  Z
    {
& }9 ^7 g! s: Q# x$ J/ ]        char err[133],
' F  Z8 M8 x2 \# w6 q             msg[133];
: w. g5 y- [/ s7 _% b* M' {0 X5 u, T, O" t; O0 m& `* g% k$ `
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
! h5 l5 T$ Z  H2 x4 W            irc, line, file);
: Z( {, {9 W+ n. R% V! w1 b/ W* L        UF_get_fail_message(irc, err);* `8 ^% I, ]# n7 g9 J

) E7 }6 B6 d" G# G2 c+ _: f" N" x! k        UF_print_syslog(msg, FALSE);& r! ]3 S- k& O+ [+ K) q  c
        UF_print_syslog(err, FALSE);
# R9 C, F9 G/ h& U; ?        UF_print_syslog("\n", FALSE);; v' b5 [% j4 L" V( W. P( Y' f( i
        UF_print_syslog(call, FALSE);
; ^8 o* E7 f% h8 N9 H        UF_print_syslog(";\n", FALSE);; Q. O- j6 _- @7 [. M
! f  M' ]* b$ \* r; [- q: O1 S1 f
        if (!UF_UI_open_listing_window())
' v9 @8 X- N  B        {
0 _+ P( V  k1 `) v# e            UF_UI_write_listing_window(msg);9 G8 N/ B3 z' r5 C, F
            UF_UI_write_listing_window(err);/ y. s9 X. g7 V. P" _1 s
            UF_UI_write_listing_window("\n");
9 M3 R6 J8 s  G, w            UF_UI_write_listing_window(call);
) }1 n# {6 `' m% [" Z0 K2 l: s( A            UF_UI_write_listing_window(";\n");& p5 e5 [  f( V
        }$ t" l8 P2 C/ W: T
    }$ `' d1 H5 L. T4 n
) P" ~6 G! ^' V: w4 l; A7 X5 o7 v
    return(irc);
+ W4 u1 X# B$ e) W}" r7 ^+ y% i5 W" Y! J
- @. M" D! C% Y2 ~
- h0 K  U/ u8 A; s3 |
/*****************************************************************************
+ q; _. Y- S! F; I" |**  Activation Methods& [$ A' i) r$ O0 u; O( Q" U# ^
*****************************************************************************/
) j7 P: w! E% i7 I5 Y+ P; s/*  Unigraphics Startup
9 f4 }6 t6 _/ r4 P**      This entry point activates the application at Unigraphics startup */
  r1 W9 R- v. Gextern DllExport void ufsta( char *param, int *returnCode, int rlen )
9 A' u1 ]* q% \{
  w9 |; o' u  ~% P6 L( w- V# x, C    /* Initialize the API environment */
; k8 T& m) W8 r& S0 {    if( UF_CALL(UF_initialize()) ) ) w5 a9 h1 d/ [. O4 @. Z0 h+ I
    {; C" r+ j7 |8 P
        /* Failed to initialize */, ?/ D+ x, D: F6 _
        return;3 j# ?+ i! {0 R' ~4 X1 m
    }- D7 ?, o7 i& F' }5 [" p

/ g& ^, @& `* g) I8 Q    /* TODO: Add your application code here */; @* a/ S6 U1 i3 i
$ a9 z  s2 ^/ \/ I' i; E+ U+ s
, R" f! k# p# @4 b, K" Q6 X

  I) T* y- L0 I        char b[132]="";- c# D- y" W0 W# k2 a
        mmm(b);2 K2 A9 O2 w& Q# a
        uc1601(b, 1);   //在UG弹出显示框* l. w7 Y  B6 d7 \7 F! d

7 I' A, F& e$ B4 Z0 G- m9 q; q; y- ]* ]* w$ T: p
    /* Terminate the API environment */6 y4 o4 A$ I: g* q
    UF_CALL(UF_terminate());
+ K: `5 y) `4 r+ B3 O% ]7 X* N}
7 q. B$ c; t) f. D0 [/ W
6 E7 s! X1 O7 c# H# g. a% h/*****************************************************************************7 j: d: K! e4 ~. F) |
**  Utilities- M, z, M% B0 v2 f. h0 e- O
*****************************************************************************/' d; s+ e% U/ m/ `2 L' j( P. T" y

/ |$ m7 h9 n! E7 Z$ E6 q/* Unload Handler' j; ^) d  U9 _! |/ Q9 C* d
**     This function specifies when to unload your application from Unigraphics.  |1 K( H, t$ t, ]5 N& W
**     If your application registers a callback (from a MenuScript item or a
; \& Z6 ~7 C* I# r# U**     User Defined Object for example), this function MUST return
! M8 N  c. b3 p4 B**     "UF_UNLOAD_UG_TERMINATE". */
1 [" A  u+ A* Bextern int ufusr_ask_unload( void )  \6 d; f9 O+ t+ ^) c
{/ ^7 V0 H; |. K( Z
    return (UF_UNLOAD_IMMEDIATELY);
. p- B& ?3 e7 V, l, u}
* U7 X4 `/ y" I& |' k3 f6 m- S" j" w1 ^2 W3 T0 B" _. }
. |9 I$ t9 \4 D: \" ?7 t" E

& ~8 h# m+ y6 R* e% m( u1 _+ N1 i6 U. A
6 p! ~7 e# I2 z9 v
& F4 t2 X: }" O, y0 w" G
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了