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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件% O8 G) r: Y0 O+ K! C
+ }- Z5 u% r; H: q7 R/ n7 |
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用! ^. Y/ s; o9 j2 a
4 x0 s) z2 @( O6 F! T) e9 H
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
1 n1 U  h5 {/ o. m3 r) N0 H# t" @; C1 H2 M3 F8 D0 G
=============================================================================# [$ g2 ~  X& g: q/ y- W# x6 d6 o
在VC中调用VB编写的COM组件
) `- p9 W' {4 `) ?, X" K" ]* ]" ^0 q7 G$ ]" c( I' Y
梅雷 - QQ1821117007
4 Z& l( B/ F+ k, o亲测 XP、win7(32/64位)可用
( b4 g2 W% P$ R& b) q* [4 Q9 g' `
1 y( P$ \* M. v8 Y4 F, F( D( XVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
5 ]+ y4 u- l& x( \, D为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
3 F/ E/ Y/ a. x' L& o) V先说说VB开发一个COM组件。
# e- ^4 i0 X; _+ L用VB新建一个ActiveX DLL 工程, ; n  z/ S0 L$ ~8 E. ]
然后修改工程名称为 MyVB
4 q4 r  G. H5 l) _7 n再修改默认的类名为 DEMO
' _8 [9 r* w0 g* B1 ]然后再向类中添加一个函数作为测试用,如: Visual Basic Code: @9 G, R( S3 w  O4 C0 s
$ T( i2 U: M8 Z9 b, @% X4 S& @' ~
注意!工程名不能为中文不然在c++中会出现无法识别的字符串0 Y4 K- _: Z; t0 N

* _( q; J" k$ _9 I2 X  v) w. O
3 ?: _% T1 Z4 m2 ?7 _
. t3 m! g& i6 f9 a& }& sDim str(999) As String" I6 ~! z! r5 D
0 c6 g* l7 k! g# q0 |% h( l
Public Sub GetMeiLei0() '无参数传递! B$ h8 @/ w! x2 l
MsgBox "梅雷qq1821117007"
4 x, N8 ^4 q- d6 Y  _$ c8 M. e4 zEnd Sub8 W% d3 Q) Z" {9 s; ?8 v6 T; R

2 _0 q4 `" E  f3 `/ u  Q! E  n
! e1 {4 ~5 N# T3 R' \5 G'带参数传递   Public Function, _3 R: T( i5 x. A3 O
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
4 \- r* B& J: E: l5 u( vstr(n) = str1/ E" T  b, P1 Z: B- Y
( W3 N! [% W( \
If n = 5 Then3 I: H4 X2 E" o& ]1 ?4 Y
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
% ?4 a" h$ e" ]& `End If
2 ]& Z) z2 }: T; `4 O: R6 F1 H. t* z5 X2 v$ |2 X' [3 l4 D8 w2 `
GetMeiLei2 = "数组传递0"  e9 j# r0 M. f6 d5 J" F

0 c* R5 E1 D) bEnd Function+ v! b0 p, W# \4 K, z
9 O- {. t& q3 a) h

3 Q2 a2 x% f1 h8 G然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ! H8 R% M/ `7 Z/ g
( V9 K: o+ m' k2 G
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 6 q- a8 ^% U# {* ]0 S
& O/ }- [/ J3 O! k! D9 C
$ H+ l3 g1 }/ P2 p" ~! ~" o. C: F
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, % X2 g4 A+ l5 h' g
而 VC 里调用可以这样做,如: 7 ~6 h4 u8 y! G7 o0 d* ^* e; T
Visual C++ Code
" e( N, ?# c" e0 j7 Z) }5 d& N! Y$ |1 Z7 ]
//新建一个 UF程序,输入以下代码
+ c6 |( L3 D# l2 I6 H/*****************************************************************************0 Z& Z( l) [+ C5 A
**3 k7 `/ |0 {8 ~$ X$ ?. B- \
** C++调vb.cpp/ v7 w! E" c* w0 J
**
; s) C# r4 f. B+ j$ B, |& `** Description:& f" f5 K/ G' E
**     Contains Unigraphics entry points for the application.4 g7 d  z; _9 [6 k8 O$ z, G8 e; m6 \$ N
**
3 P  J; F) r3 n& r" d; ?*****************************************************************************/. O5 J" g' w+ ^! U9 F: g

! Z- ^5 z1 f" L, q/* Include files */
+ g2 P: I; r! [#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )$ Y: B$ ?6 ~9 o# ?5 K8 H
#   include <strstream>
  P/ o! s' G4 P7 ^#   include <iostream>& P, x% t: U- q
    using std:strstream;
: C# B$ R- b: {& }8 o( K    using std::endl;    . U' j+ V) N  y9 ]7 N; {
    using std::ends;, X0 ?# a8 b' q" z5 @
    using std::cerr;
, h" U: W" N5 k#else
' {6 q/ q. p! |/ |/ u0 R) Y#   include <strstream.h>
& {# e, U( C. I6 h, A#   include <iostream.h>9 w: L8 {0 l6 E. F9 b
#endif/ K7 F6 \/ J3 O) j
#include <uf.h>
, i6 s& [! m3 v/ V#include <uf_ui.h>* `7 B2 l$ B& T9 t
#include <uf_exit.h>+ X( c+ P2 |( a# K7 M! K* y& T  M
#include <Windows.h>
" U4 m* k# l( E9 K) j8 E) |
& `# S+ S7 w* W2 B& s( L! D& {- T#include <string>
7 x( B# M. B% T2 V' g#import "C:\MyVB.dll" no_namespace
: H3 A2 Y) g. h& x0 I( L//using namespace MyVB;    //这里是COM组件名称3 e( p2 O9 {7 {3 c2 h
; v' [& G, Q6 C. P( {. o% R2 ?3 f
4 l7 C8 s/ L6 N- I
HRESULT ComInit();
+ o3 ]# [0 ?4 U, o, ~  Nint mmm(char* str)
& `3 M1 g% f) w{
" U# \+ Z9 D, e8 |0 e) _$ h        ComInit();
/ w: ~8 w& v; L5 I2 p2 ?) E( Q) D. V  X; V9 ?2 c  x0 V5 `& b
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
. O8 F3 m1 U9 ]+ W4 R9 Q! E2 t        MyObj.CreateInstance("MyVB.DEMO");
& l5 r6 C+ Z4 X; n& U% [* j8 k) w# k% Q. D
        //MyObj->GetMeiLei0();//无参数调vb函数
, C% _) r: x5 b8 W5 Z( U- ^8 P. x  c
; e8 }8 _& }- Y% K5 }' ^, e5 l: Gchar str1[132]="0.0";
( j% ?8 q9 G0 E# L7 l% j5 w9 L3 m9 X" ^
int n=5;
+ O: z8 G' a8 Z( M" J+ x$ ?5 @
  ]  V4 c  `! F5 c8 I_bstr_t vRsinfo1;
* t( d; d% r6 D1 L! u3 ^0 ]+ Q, O. y) \; g8 s4 @
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传! M4 w- t5 M4 K" A+ o: p

& k, u+ R  V% m* D' |& astrcpy(str, vRsinfo1); //字符串赋值
7 G' n. k' w4 z% B. E
" M2 D  c% y2 e( Z+ RvRsinfo1=MyObj->GetMeiLei2("梅雷",0);" ~, w% N. Z0 {. U
vRsinfo1=MyObj->GetMeiLei2("qq",1);
: S' Q; f5 m6 R. P  S" dvRsinfo1=MyObj->GetMeiLei2("1821117007",2);" e7 g6 p0 c; M+ }( K
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);- t/ b! r1 M# ]% D7 ?  J# }
vRsinfo1=MyObj->GetMeiLei2("手机",4);
6 |9 V* E) z& |, h" E; K& c( HvRsinfo1=MyObj->GetMeiLei2("15757753770",5);
2 }8 Z& f' e( z2 j- I8 Q        return 0;
: Z. v( V" M1 E/ H}
/ V- q5 @% [! v( _" H+ `  `# K. g! S1 @3 E" y2 f
HRESULT ComInit()1 L6 d7 r  V3 ^8 \# T
{
2 P2 X& g% @  G# g0 b, ]        HRESULT hr = S_OK;3 C0 E; m* `0 A! K
        if FAILED(CoInitialize(NULL)), b6 @5 ^& D" h* N
        {
, m0 R3 l- `! W* }$ {                CoUninitialize();
* J  {3 s# l& w% n+ t3 B% H                hr = E_UNEXPECTED;$ W9 q# q, |9 D/ u- v
        }) S1 \: v8 M9 v0 M! B) ^/ B2 _, ]# \$ W
        return hr;8 Y# t* J' A7 I1 z
}
% Y% c  ?3 j% o5 l4 d4 k
8 z2 s! \% P4 k/ X9 C% N9 n) k  X6 r+ o
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
! H0 N8 w, K! [9 F& u
- S# \- X3 ^2 P9 N0 i  v8 k4 x# \2 s3 H6 u( d

, Z* h$ Q; j; ostatic int report_error( char *file, int line, char *call, int irc)
7 N" Z7 Z6 _; q: S( r3 X# |{
' }, n3 l2 n# t# z    if (irc)
& [5 u" E8 o% H" O9 j    {7 h, t2 C0 U$ [  m
        char err[133],! \; U2 G* T+ t) o* t) l  e7 s$ X
             msg[133];
4 [) I  D6 F  V: b+ b# O) `5 P4 J5 R
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",* e; u! q2 u5 s% B/ F- E. ~- B4 k
            irc, line, file);: G8 D  ?; t+ P( D  W
        UF_get_fail_message(irc, err);; Z$ K- u, a# k
7 I6 N: ?5 A* O5 r: k3 H
        UF_print_syslog(msg, FALSE);
- Z, f1 z% k) ~9 }, Z        UF_print_syslog(err, FALSE);) R, C' T) y# g5 u5 [4 T
        UF_print_syslog("\n", FALSE);! U! l' K, V: W+ i
        UF_print_syslog(call, FALSE);
' Y/ A/ o# k3 N        UF_print_syslog(";\n", FALSE);- V" D9 }. J! K& B- V# P9 G

; l5 I/ l* D: \- a; g        if (!UF_UI_open_listing_window())
8 ^1 R/ q# D/ Y8 g9 D; {        {0 @! B+ ^" }$ W' Q, r; B- n) E
            UF_UI_write_listing_window(msg);
, B- N$ ~3 D) \6 u* I) a9 x            UF_UI_write_listing_window(err);
: b2 K6 z: q6 ~" w' A# p            UF_UI_write_listing_window("\n");
2 D9 T" m6 @3 l9 d7 ]; I            UF_UI_write_listing_window(call);& m7 j& O6 `' D9 I( N9 u
            UF_UI_write_listing_window(";\n");9 r1 e" E1 E3 m9 W. D' d6 ]7 M- |
        }
( O1 V& f; X* G1 E& y; Y9 O    }, K: J0 ^$ ?% J; h
% `/ ]( W+ q8 w
    return(irc);
2 z8 A4 g) a( {- R+ H}# C; m- r; p) W1 @' x9 x; W, n8 L

: G6 {5 x0 \) F! S, z: V% ~0 _
- h5 F1 @4 e) I) Q6 s3 Z/*****************************************************************************- A$ V! C1 O8 Q) h8 `  ^
**  Activation Methods0 `2 P5 E% j5 r$ u! [9 S
*****************************************************************************/% e, u! d, R: ?7 l' S
/*  Unigraphics Startup2 m% v- @: x4 y8 h2 W2 p- J
**      This entry point activates the application at Unigraphics startup */
4 Y3 ?) G% ?6 T- }6 W# a. E7 Fextern DllExport void ufsta( char *param, int *returnCode, int rlen )3 d* x8 p0 X# H' @# j
{* y; u+ l$ Y) g$ L' ^7 C
    /* Initialize the API environment */+ Z. z* t8 Z& ?% o' \
    if( UF_CALL(UF_initialize()) ) 1 c9 \( M* {# h( M
    {
7 i/ `# `% S: j. k0 I        /* Failed to initialize *// Q2 G- L8 \& V/ k! C
        return;
2 M1 @) w# U7 Z0 N. G2 r" P3 W3 V    }' W9 e' K8 p+ S5 R" M; Q

) I: j& s* l3 a    /* TODO: Add your application code here */
* O* q* ~; Y6 i" Q! X' B) W6 s& m; A5 s2 p& ~( m

( J- j6 H$ m8 {2 g* A$ c$ n) B# x
        char b[132]="";
4 Y5 t& k" n/ J  S% n8 _! Z        mmm(b);+ A2 q5 Z7 F8 A; i* g
        uc1601(b, 1);   //在UG弹出显示框' b8 Z* H6 b1 M0 F& F* `! w
6 X' A/ j* e' i1 d" b0 a/ e; s

& R9 G! f8 b3 b4 K    /* Terminate the API environment */
6 W. R  }' \% U/ Z0 y$ J& G3 N- b    UF_CALL(UF_terminate());. L! i/ P* C8 v6 u) N! Q' s
}8 d# U; R' V2 b# g! O3 F# R

' n" H3 H) J5 H0 h/*****************************************************************************
2 `9 V$ G7 u; Q( x+ [) o**  Utilities% N: R/ u$ P8 P1 K
*****************************************************************************/3 W# B/ y- s8 R

' ~; t3 Z9 C4 X3 [0 T/* Unload Handler  u- b0 M$ Y% Z: M  {6 T
**     This function specifies when to unload your application from Unigraphics.
7 R* P- I& r& V2 `1 m$ s$ R7 t3 W; ^**     If your application registers a callback (from a MenuScript item or a+ D% `# L  G* m- O. }" y( U6 N
**     User Defined Object for example), this function MUST return
2 Z- d3 S7 R! p4 I* Z- ~**     "UF_UNLOAD_UG_TERMINATE". */
9 d4 Y# N, }. M. o& R6 U! fextern int ufusr_ask_unload( void )# h3 `6 ?- X7 x# P4 l8 W2 H1 {( ^' Q
{
2 i9 r6 `# }2 d! p/ T( H( Z# j: Z0 i8 [# k    return (UF_UNLOAD_IMMEDIATELY);
- [+ j/ s& r$ e( v' f}1 A& K' _: E: V% C

+ h' d' K+ F& q5 H
5 g# N1 j# M3 O# Q  {# A1 Y5 }: [

! F0 ]* F0 n% f. _5 T2 ?% o
5 s6 Z, N+ @1 k' h: }  l: Y7 F; x$ E! u$ R; a
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了