PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
8 S. c+ ^% N1 C1 ?8 I6 J, T& Z* \7 K; P( R( q
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
; A6 ?( r, L, m6 T% ]# X2 o4 T* u8 l! X6 q: k
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册( ?4 m/ o2 ^$ Q5 E0 W% M

! o+ Y" z  r# ^! S5 d=============================================================================
+ r" o. C% l  @在VC中调用VB编写的COM组件% {1 M$ D: ]0 M; _) L
  h6 i0 l/ x+ V
梅雷 - QQ1821117007
) }5 `; N) e0 {+ ~6 [5 l* n亲测 XP、win7(32/64位)可用% R0 V) r8 T4 _2 W' ]& S) ]# r
+ ]6 i+ L( ~1 ^! v: @  Y( F
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
9 F; B1 a# X. X7 M. P! W为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
4 H& U2 U! s' k) H2 N+ x$ z先说说VB开发一个COM组件。 , a3 `% g2 {% ?+ {2 |
用VB新建一个ActiveX DLL 工程, $ l' {) t1 p( c8 ?- u+ q+ P  ~
然后修改工程名称为 MyVB
0 _7 k! I& G( j7 {再修改默认的类名为 DEMO
" C, a0 ?9 S& n* U0 ^; e然后再向类中添加一个函数作为测试用,如: Visual Basic Code; h4 M, O, r/ y4 G0 h" K- y9 |
3 B- n! r8 k' u- {3 D. e1 o
注意!工程名不能为中文不然在c++中会出现无法识别的字符串+ M) m, g, j3 O; l# Y+ D! G
; l1 a: ^1 @# W* w

( h) z7 M% t8 }$ i: g& }$ }  p! h! l: a1 @; j
Dim str(999) As String
; ?5 R+ T% s0 D8 w
) _* g% s5 |  H/ s# R9 n7 sPublic Sub GetMeiLei0() '无参数传递
$ R* j: r: {9 ]5 d  h7 @  ~( \  Y! cMsgBox "梅雷qq1821117007"
: t, K) k7 g. ~, CEnd Sub
' F9 p( ?! g. z# O/ @# o5 R8 X
0 j' p5 \' e! i+ N/ R
'带参数传递   Public Function
8 f: h  Y- G  R4 V' S" DPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String2 o/ W/ E1 \& x
str(n) = str1: N1 e7 \9 T7 M, m" S8 N# _# e
* S, G1 c% u4 Z' j' R
If n = 5 Then; e8 K5 z/ F) ~& I
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
8 L- v$ s- Y3 V# @; \End If$ E# h0 B( c% P( x/ \
: q0 Y0 Y* i6 i- f
GetMeiLei2 = "数组传递0"
% Y+ x# C3 V/ |( H/ w8 O- ?9 F/ \' U4 W% i4 v+ d9 \# u: h
End Function# I; P. j& e& X+ B. i! ?" ~

% l  g0 P+ d$ n/ h2 `3 K* _- @. B# v3 R# M
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 % l% n" {& B' I

& P' t# i% Z& [注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 3 r, f' ~* g$ R: Y

3 x- g- q9 n) S" r& g4 |  K7 t" Z: y! ^" Q4 D
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, * T4 A7 [2 J+ ]& w" E: z
而 VC 里调用可以这样做,如: 8 m3 U5 C) m5 ~
Visual C++ Code
7 \# e: `6 @9 I
  ]$ Y7 d5 t( h  O+ b//新建一个 UF程序,输入以下代码' {! Q& p: _* [5 Z+ V! q6 H
/*****************************************************************************
  I5 w1 k' R+ K' ~: P**
3 `( s) b2 t+ Z$ \) G; ?) i** C++调vb.cpp
0 F0 m& H' |- C5 O2 n**! H, C8 t. K4 H  p9 a! u
** Description:
# ~0 t  s1 W& v) e( x. E* D**     Contains Unigraphics entry points for the application.
' l3 x6 e8 C$ ^; }8 |**
' D3 d% b/ f( v/ q% {$ |*****************************************************************************/
$ K: M5 ]2 y" h9 y; F$ ]/ W8 M  p$ A/ k* g# o3 B
/* Include files */- b& t7 r' i- H
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
, A8 N$ m! z$ a. a#   include <strstream>
1 Z$ O" _9 i4 L6 T4 g" h: m#   include <iostream>
9 b5 A( b2 S2 F/ P- a    using std:strstream;) Z3 w! f. p7 _; t
    using std::endl;    8 D& C2 j+ l( q% r
    using std::ends;. R% `6 H! ?( H- E
    using std::cerr;
: d) o. o$ J8 g0 D; K. ]; E0 {& v9 b#else
' t9 w/ e$ b8 L" B/ h- z#   include <strstream.h>4 {+ C4 v1 i1 \' {
#   include <iostream.h>+ ^1 Y% {1 |* H( P( b, ?0 y$ n- K
#endif
) c' d! w% d2 T  |' m$ L#include <uf.h>- t6 r) @: }( G& ?9 a
#include <uf_ui.h>
6 ]* _0 }8 j, ~- O$ D. A$ ?#include <uf_exit.h>
% X( }( ?7 f3 f% j" t) n#include <Windows.h># \0 M; Z9 F* ?! V3 T8 R

3 A% Y% F( _, `6 l7 e% d7 F#include <string>
4 q1 t! |; d% d+ c* ]; d+ c' M#import "C:\MyVB.dll" no_namespace
  @4 R) W1 \0 [' T//using namespace MyVB;    //这里是COM组件名称
4 P4 [6 u+ y* ]: o7 h0 g) a$ @1 r3 x. `  e3 K
5 G+ `% g: n& S- s6 C( [# G
HRESULT ComInit();9 \5 Q: z0 Y3 N" Z/ C7 q$ y) R9 q
int mmm(char* str), Y0 o( Z, u' t2 O( ]. D
{, J  M  n2 X0 f" C
        ComInit();
7 v8 }( l# s! ~
5 s" @8 @: N5 c( X; ]# @+ T; i        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象; c3 G1 S* ^2 _& X$ Z! O* D0 R
        MyObj.CreateInstance("MyVB.DEMO");
0 e8 ?+ j2 K* b% t3 W* Z3 ]) U0 L
        //MyObj->GetMeiLei0();//无参数调vb函数$ g0 M1 Y7 U- ?( C6 ], W
4 V- X" _8 u% C* K& A* o
char str1[132]="0.0";; c, T4 `- X* h( M
: i7 Q+ ]& Q; O
int n=5;
& H5 j7 q) t7 ]1 {- n: Z
. a# R& n8 f; E_bstr_t vRsinfo1;
2 O! D/ U! Z3 t2 W6 E6 f5 F7 Y; Z2 D/ |. i
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传9 a: q& A2 v% T, J% O4 H  v. ]6 N
4 u# M: n# b+ @, V; l* U
strcpy(str, vRsinfo1); //字符串赋值/ d7 ], ]9 z( |) f2 a

' Y- K7 U9 y$ K# S2 e! CvRsinfo1=MyObj->GetMeiLei2("梅雷",0);
) V% f3 j3 M6 U4 f- f0 TvRsinfo1=MyObj->GetMeiLei2("qq",1);$ \) K/ L' q! h, y$ T& X% W
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);, x4 M4 T4 ^, Q8 F
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
8 P1 W: ]9 i$ l. X% B/ i) b3 T0 [vRsinfo1=MyObj->GetMeiLei2("手机",4);
/ _' i7 b/ U1 UvRsinfo1=MyObj->GetMeiLei2("15757753770",5);
; N, b/ [- ]+ O9 h6 k1 g        return 0;  V( p$ W8 K5 v% Y' [
}
( A" |3 f# _) l9 x& [9 j7 C; h; h1 h& f7 M" S* ]9 D) z
HRESULT ComInit(), t" J; ]5 N( |4 ]  g& Y9 X
{3 G, |5 W/ s0 l/ }* j. J# V! m
        HRESULT hr = S_OK;" R- J. W' X$ ~5 k! m4 m
        if FAILED(CoInitialize(NULL))
5 O/ p8 |$ _2 {- Q        {3 n0 `9 Q% y5 X  D' u
                CoUninitialize();! O2 O4 y7 o' a  j
                hr = E_UNEXPECTED;* A. Q! m$ E1 D8 m; }, L
        }
& [& ]  T" i& |        return hr;
& n) n! b0 M0 S. m% D# M# k}
+ ?& B$ ?0 z1 F7 K
- A) ]% G! J: L1 v& M9 r# K' c: s- y/ M
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))* R. v3 N8 x! ^3 B6 H* I* R# l
4 l- V5 v# }( ?9 t) `

* ^* v0 T4 r, z: ]. D$ \+ y% A& x# b/ ]& ?+ v
static int report_error( char *file, int line, char *call, int irc)
' H6 N$ Z& n4 o{
9 `2 Y3 b& o- B    if (irc)/ L  G- S. Y- u& j0 B
    {$ i: a! M) d' N6 P- P" b
        char err[133],
0 S3 c+ ?: Z! s4 v" A/ ]             msg[133];
9 ]# y5 V: o, o% q0 f$ w
2 M- a0 k+ g$ ^. n        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
; y* F& ]9 q. I            irc, line, file);
. O! E& r8 {8 B3 f: `! d        UF_get_fail_message(irc, err);  b& h# N3 s3 P1 v; |
. S& C: ]# i" k+ n% E2 D: c
        UF_print_syslog(msg, FALSE);2 g6 E5 u4 o9 l; `- G( s
        UF_print_syslog(err, FALSE);
! F1 h4 r- t5 O, S  v        UF_print_syslog("\n", FALSE);' |% D2 h0 i9 [
        UF_print_syslog(call, FALSE);
3 r" [  x# T3 u$ s8 b3 F- Y& d        UF_print_syslog(";\n", FALSE);
& O- [) z3 N+ o2 M  e5 M
) g, M( z, R+ }7 a! |. W        if (!UF_UI_open_listing_window())' F2 j. ~9 ~2 T7 |; t6 K) p( ^
        {" J6 j6 u" h4 |
            UF_UI_write_listing_window(msg);
% N6 |! w1 D7 j% ~9 t- \) y" i            UF_UI_write_listing_window(err);1 T6 o4 n  ?2 e
            UF_UI_write_listing_window("\n");
$ B! l2 |1 k3 \$ B            UF_UI_write_listing_window(call);
& n6 {4 }+ y# `4 f% n: d  s* Z; ]            UF_UI_write_listing_window(";\n");
+ Z0 ~4 A- i8 [# C        }
% X9 @3 o- I5 c, Z% `0 R    }
2 z5 `- f( K3 \2 G; r6 u( m/ ]: g; c0 p, f$ k7 p
    return(irc);' P) y' @2 W4 u. ]( {7 A+ t
}. B2 f7 n8 h' e  H/ K

) z- W) J3 i/ I& F) K* ~4 v% N% O9 J& R
/*****************************************************************************
2 n$ U+ F6 ]% v  u7 u, |. i**  Activation Methods0 C7 W9 ~. m- s2 f6 V0 w% @
*****************************************************************************/
8 b) ]2 ~' e9 j2 B9 o' t! t/*  Unigraphics Startup
+ w2 `% X) H4 J3 ]. V; U**      This entry point activates the application at Unigraphics startup */- R1 Y2 `4 Y: I
extern DllExport void ufsta( char *param, int *returnCode, int rlen ); g9 C7 d; Y  Z4 Q1 M
{
, F3 d7 A7 M4 _9 @' G    /* Initialize the API environment */
! Y& E" a5 a) b  g0 A6 N    if( UF_CALL(UF_initialize()) ) ' b- U9 e  Q7 b  c2 }0 Z- K$ }
    {8 y( \, T( P* H, [# }
        /* Failed to initialize */
% V& @) w- @- N# \" l% \        return;
) t3 N" U; z3 L: u# O) p    }; I/ ^' X1 M9 _2 P  V

& U2 f! n7 J$ y6 O' F- w$ Y    /* TODO: Add your application code here */
0 X0 I9 T" h9 h7 `4 P! o
+ R' Q2 j& _+ @/ z2 P  e! |9 G2 `1 l
% y6 K- C$ j$ S
% c/ i, w' I. Y  r" G- d1 ~        char b[132]="";
% Q4 a% X0 {/ J3 x' p7 T$ u( N        mmm(b);: d- Y) c+ z2 W1 `- p- e1 @
        uc1601(b, 1);   //在UG弹出显示框8 U  a; _& p9 F# @2 D' M
# \8 S: Q: I: h. ?  [
" W# S; G/ M8 j5 r! m
    /* Terminate the API environment */" ^6 f' t  ]; m. f. f" P
    UF_CALL(UF_terminate());
0 J9 A5 E6 J* ]) C$ `}( z2 A% L% n2 }( k; D& H/ |

7 R2 t4 \, R" n. N& I9 Y/*****************************************************************************% L$ `  s4 h; ~1 B. W
**  Utilities
, J$ c0 i9 y  `6 Y/ G  m+ A# x7 N*****************************************************************************/
0 v1 g) ]7 y5 b$ T4 m' }4 c
3 D* w$ {) w: o, {/ T* p/* Unload Handler# _3 H8 C/ G, u9 q5 h
**     This function specifies when to unload your application from Unigraphics.
7 s9 b. T1 n0 `+ B( M1 N4 w**     If your application registers a callback (from a MenuScript item or a. B6 x1 N0 [9 B  D3 r
**     User Defined Object for example), this function MUST return
$ q9 Q( p2 ~  @**     "UF_UNLOAD_UG_TERMINATE". */
3 H" a3 J3 S8 {4 kextern int ufusr_ask_unload( void )- F" U  h1 R$ n2 e* Y( S9 s
{: y1 R+ d/ S! N, M$ @. L6 \  P
    return (UF_UNLOAD_IMMEDIATELY);
' Z7 H- c. J& T# |}- s+ d9 m# L; @8 l) \( E: Z& {

7 i/ d. Y9 n4 f) [+ r; B8 ^( A" v; Z( M
; X1 J; O1 x5 s8 A* D; s, G
% w3 M: C1 [6 p' u
) y/ m& g& u/ w9 i* V
, Z5 @; c- R$ V1 s0 w
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了