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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件+ k  w& ]4 g4 w* d' F
# U* s7 A& ?" B5 K
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
+ z. X; z7 D4 Y$ O& {
0 H, g2 }. Y4 V: \vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
. K2 c3 W8 y4 Z5 C
+ Y" v  f0 `! |! m' [, }=============================================================================
: q/ D1 ^8 G$ T4 n在VC中调用VB编写的COM组件( x- y& k) n9 ?2 _' ]1 l& r$ i; k! ~' y
7 v) i. f; j# b( _4 m) V/ N
梅雷 - QQ1821117007 2 |" b! W$ a9 l. a- e3 K% q, |
亲测 XP、win7(32/64位)可用
% l; Y# R+ o' A3 c
/ f5 {% h7 i8 k& OVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。+ M. s8 Y! Y7 X3 |+ h0 b* k
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 / \9 l) |% c2 |0 X) d2 a
先说说VB开发一个COM组件。
6 @! I" p% \* B用VB新建一个ActiveX DLL 工程,
- v5 C$ J0 F0 l& w2 _7 C然后修改工程名称为 MyVB % I. N: `6 k# Y! |
再修改默认的类名为 DEMO 8 _: |* V9 l0 j0 @; `# C3 r6 l1 O
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
; {% T5 }% E) y7 C  }2 X; R. k' `
" Y/ A7 `% C7 T' p: [3 `注意!工程名不能为中文不然在c++中会出现无法识别的字符串4 k6 E8 z- y: j6 ?" L5 i4 K% h
% }4 h2 U' _( B4 l2 ?7 F$ s2 j
( s' x, N* Z) t# S& v

6 R- J+ A0 r, n* f' LDim str(999) As String
6 j" e/ v5 [2 i% k. V* `4 I9 g* e" {# C1 \& c
Public Sub GetMeiLei0() '无参数传递9 s& Y2 B' x4 a, A+ I+ }0 i
MsgBox "梅雷qq1821117007"3 w8 U* Y! B' A
End Sub- y% ]; Q# R% _. S
2 g4 {( r( f. I  O/ C8 X6 w

- r1 ~! K" F. y, V& ]'带参数传递   Public Function% w- J' v7 H' ~% q: a
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
6 g0 Z( B. Q4 y& ^+ O0 wstr(n) = str1
+ ~% i* w- A' w# H% |1 l: o. n$ k" u4 a7 ^# J$ {# j( u4 x
If n = 5 Then3 X% V$ W+ H6 u5 |3 Y. n
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
  m3 [7 c' X1 C1 V5 q, ]  {End If/ \# S' h. ?9 _' O7 b3 l% T- z! V
3 |# R; z5 B$ t  G. m
GetMeiLei2 = "数组传递0"" X: w8 o) K  c- Y$ p

8 p/ b( G' e- S8 F+ SEnd Function
- l# z8 S$ R& I+ r! N) |5 b6 K1 n
  e5 P, u$ s5 |  P" p
' _9 K8 M$ s' {& T! Z7 {然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 " }, T4 h6 p1 D2 a
( }6 S0 v3 \) o' V7 `/ ]( Q
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
9 L4 Y' x1 [& K5 T; J$ U- W7 I3 v: s& n
- v$ }0 w' v, n4 n$ |9 f0 Z
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
  y/ l0 `( d& D而 VC 里调用可以这样做,如: ; b# B9 K/ `! E# p( K$ g
Visual C++ Code ; q2 I/ x2 K+ C- }3 \
' F0 a* I) Z1 L+ g9 o: b/ |
//新建一个 UF程序,输入以下代码  k  p+ J# h( O) c2 I* y4 {
/*****************************************************************************3 ]. g- \; s4 G
**% E1 o" M0 e. O9 Z% e% j
** C++调vb.cpp9 j0 f' g1 Y' ]; C5 {9 j
**
. H4 I2 Z0 ?- D/ l** Description:
* `5 a2 y9 ~' t/ j**     Contains Unigraphics entry points for the application.% x4 T. p3 g' r* |; S, h2 H' Z9 y/ z; y( S
**
2 S% R; {6 ~, }) R6 b' Q. Y*****************************************************************************/
% B/ C8 N  B' V: Z5 A; z/ ]8 N: D/ X# ?# `6 }- S
/* Include files */
& q4 H3 B6 L7 o#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )! g5 ?6 R1 M) W. V7 f
#   include <strstream>
& n3 u7 E/ H/ f0 U#   include <iostream>: o2 e" h5 S6 F. u. _1 x9 Z; c
    using std:strstream;/ [. T: f- @& L; z$ @1 q
    using std::endl;    4 A; H; T- ^8 g7 b+ `
    using std::ends;
/ p; ~* _: [6 L$ N2 u0 O    using std::cerr;. Y1 b# d! r# c1 N9 U/ O, l- w2 E' c
#else' Y1 c  @0 s- }+ H
#   include <strstream.h>
4 u  g$ F0 a8 Y: ?#   include <iostream.h>) G9 k- T* c! ^& P5 v% }
#endif; Y1 ], ]% ^. p: e( l& j
#include <uf.h>) M: x, S! V9 j* s# Z5 j- T1 O, |
#include <uf_ui.h>! m  A( l/ p. a7 B
#include <uf_exit.h>
6 X. I# }* {  {#include <Windows.h>
! C" J, T2 e, z- V$ U
- R5 I) m" m# h' g+ H#include <string>
% }- B" @; ?2 v, ]#import "C:\MyVB.dll" no_namespace
# V5 F3 }4 W( h( |9 Y- S//using namespace MyVB;    //这里是COM组件名称
$ I( I, [2 V, I) N+ j5 r" o; L- Z$ t! M5 ?
2 ?/ x( c3 z; {& B
HRESULT ComInit();
) f+ e% b, T3 V( Q  S* ?8 E# wint mmm(char* str)1 z3 o- T6 h, o7 D, `# U
{
7 d  s+ m) O, C3 o2 J0 S; }        ComInit();! c6 Z. o& J+ Y4 v4 N
$ o: S2 b: s4 v! n% x8 b
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
$ ], L8 v$ I  _' X3 I        MyObj.CreateInstance("MyVB.DEMO");
$ C% P5 A/ u" F
0 X: g  W# u- x6 p; U        //MyObj->GetMeiLei0();//无参数调vb函数
! N7 [1 R0 ?0 S; s7 X7 c1 n$ b* }3 e/ }
char str1[132]="0.0";' Z- S2 \9 D4 T+ w% @& W+ @

9 e  i+ P& a7 L/ J( Zint n=5; ! B7 F# a. s$ j6 g
+ f8 g! ?* m- U" T6 t  ~
_bstr_t vRsinfo1;9 S1 J4 ]6 K4 a

! \, c) O6 E/ W4 AvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
9 _- ?! k; G$ _& X! d# W1 b5 q0 F4 c0 O- f! m5 y, t& G
strcpy(str, vRsinfo1); //字符串赋值
7 j1 T! x' i/ C4 x2 e- R. t  c& p( r& [5 u3 A& S
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
4 p, l: e1 \% C6 y7 o( ovRsinfo1=MyObj->GetMeiLei2("qq",1);7 r6 Q6 u7 f# N# H+ b" `( T5 t; m
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);
, R6 t* a# D5 VvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);9 I3 r2 d! B% `5 k$ d# I8 x0 g6 ~
vRsinfo1=MyObj->GetMeiLei2("手机",4);/ E/ S. ]! B  a+ x$ s! l
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);* b" C* B* u! u6 }6 _! T: K
        return 0;, @' _! S( }: x/ ]2 O
}
5 e3 D! d5 f* ]! }( {- d3 a- L( ^  r" `  v& k
HRESULT ComInit()
3 p$ w. R3 d, l/ Z& J0 K{
/ [* K0 Q5 {8 H$ v. M% l        HRESULT hr = S_OK;6 C* w  k( a3 M
        if FAILED(CoInitialize(NULL))
9 b1 `7 ~3 {* H) m+ [        {
  P) \0 K6 S4 e8 B                CoUninitialize();8 ?/ L/ I( R: _' ]) D3 ^3 s
                hr = E_UNEXPECTED;2 p. ?# m  M3 f: Z* i9 M5 H
        }  l8 [3 @# Q4 j7 n" z, A
        return hr;$ O+ H9 c, d/ u" R3 r
}* X; ^+ x" E2 }: Q, I5 V
# y: [, ?8 G& f7 e
6 `1 Y; H7 l- y
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))5 q+ [" Q9 V/ C  \* h

( t: m" _1 @/ y0 j7 Z' b: T4 j. y4 k' z

" b) l1 |; U8 nstatic int report_error( char *file, int line, char *call, int irc)
) o; _0 v+ {4 Q# y3 h, I# ?, S{
8 `- `) g! x9 p- P    if (irc)
  P7 d: k9 h! v1 z6 m3 W    {
* r' j3 z' ?  f. p        char err[133],
, S9 D' h  `3 V             msg[133];+ g% }6 h8 v% E% q
" J0 ^5 B3 O. S( e  S
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
  w- l, `! W+ u( \: u            irc, line, file);
+ s8 A- Q  }! g$ g+ Z        UF_get_fail_message(irc, err);
0 G8 u/ h- T9 N, M3 Y& o2 }
$ S# A: X) R$ u' Y5 {. W: G) B* g        UF_print_syslog(msg, FALSE);
; H, f( G' r& o" i5 i        UF_print_syslog(err, FALSE);4 t) M$ X/ p" v8 L' l
        UF_print_syslog("\n", FALSE);
5 g3 F, T" T$ t) U, O( C        UF_print_syslog(call, FALSE);2 Y  ~$ x1 D9 q  v- t% U3 r' X
        UF_print_syslog(";\n", FALSE);
' N* [- ~+ }9 }( G3 G( D& C9 z7 N, J8 b% Y  H
        if (!UF_UI_open_listing_window())
3 T6 U. L1 [4 q5 y& [        {' j0 I2 D4 M2 N& @
            UF_UI_write_listing_window(msg);
& Z. p! z$ k( I8 J% ?            UF_UI_write_listing_window(err);
0 X' x/ _# K* Q$ N6 P            UF_UI_write_listing_window("\n");
9 C% l1 k& w! K# ~7 f1 r            UF_UI_write_listing_window(call);2 J' u7 Q- [+ R
            UF_UI_write_listing_window(";\n");
4 N4 @2 _; w6 A! u7 m        }
. Q! K9 Z3 N' j' d# ^5 \    }, V- y3 |& l1 C+ V, n* {# j! k
6 f0 F2 O: ]2 a/ @3 L& p
    return(irc);0 f! x0 B/ {/ s0 R
}
! \7 s" v' O6 t0 s& D4 o7 h" W6 V& H, e7 i" y
! p2 C, Q3 g$ V2 m4 o# l  T2 O
/*****************************************************************************2 q) o+ B# @; ?1 r. X, e  A
**  Activation Methods
3 N0 |! a) S* G$ e/ W/ q*****************************************************************************/
8 p' G2 r$ e6 h2 ?. K/*  Unigraphics Startup0 P& n" q9 U5 J% s8 x1 h9 {
**      This entry point activates the application at Unigraphics startup */6 k: W5 ~% ^! {/ [6 c. N+ X8 t
extern DllExport void ufsta( char *param, int *returnCode, int rlen )% x/ E: b4 e; t' _; v/ p; v
{3 ?8 K6 `1 s8 k- P
    /* Initialize the API environment */
  I. m: a7 y) N% F. u; @    if( UF_CALL(UF_initialize()) )
: c! H4 {- P; r! K! V    {
( M5 F' {+ o8 `7 L        /* Failed to initialize */
0 B4 i- o6 T; G' H- l" \( v        return;
- G" t: U) L- L( z0 S6 o5 Z    }& p! {& `1 |% w0 t& X$ @- L. r

' u4 E7 p: g, Q# J9 ~    /* TODO: Add your application code here */
) z6 {* M4 D) g* K
4 X9 K9 E% p$ p
6 ]9 Y% m7 S# d5 L0 A( c9 p7 {4 g: f# z0 {) A. b
        char b[132]="";
% C8 }6 Y. W2 j$ i/ ]        mmm(b);, f. }, @# b0 B. ]" N6 H
        uc1601(b, 1);   //在UG弹出显示框
$ U. n8 {2 S3 `6 v0 s
, m: d. j: _6 G! n$ q+ h/ b; ~0 ^* M+ ]3 D. n! R8 A+ S
    /* Terminate the API environment */* B% x0 ], V! n* b  b
    UF_CALL(UF_terminate());
: K2 n; R# {8 e5 l}
: H4 L+ i; X7 Q1 L  @
5 G& _. O6 ~& z/*****************************************************************************$ E  I: _3 v% o  t
**  Utilities
2 I- L/ }; q. l6 Q+ n8 Y) `+ N*****************************************************************************/
% x8 q* k5 u, ], {
' v" q+ B/ r7 e1 [7 c8 t/ Y/* Unload Handler/ u! H; X  y  d3 |9 a- ^5 b
**     This function specifies when to unload your application from Unigraphics.0 u. b0 Z7 x: x- P
**     If your application registers a callback (from a MenuScript item or a) f- x$ e" R& _+ Z2 u
**     User Defined Object for example), this function MUST return! }3 \% M4 b; v: f  Q5 \+ L$ }
**     "UF_UNLOAD_UG_TERMINATE". */
) K2 K& Y4 b" a- Cextern int ufusr_ask_unload( void )
: m, Q8 U7 ]* B{. m0 T8 O  A8 h* L/ m
    return (UF_UNLOAD_IMMEDIATELY);$ n  P3 R2 B2 k- t
}
* O  \6 m1 o, m, n
4 g1 ~. s5 d$ {$ @. y! d' \6 j. g  M0 i# Z
. V, w. _$ Q+ a& I7 W. u8 C! \
* g4 v9 _7 P3 U8 E0 G
+ Q& v" n2 e& ~2 d0 |2 l, z

+ Y, z& `/ u1 Q& Y- w9 D1 T! k
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了