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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件% j, }6 |( G  X+ F: ~& h6 s6 i5 |

# G+ H1 q8 \6 j9 s+ @9 {: r$ {★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
  n! K2 o; i3 D2 m9 R" A0 I2 [" t4 |$ V  m$ B* @
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
) F+ \+ B# K& B! g  E- v! c" {( }8 |/ m% U
=============================================================================7 ~( G1 I- V4 W! j4 O  R
在VC中调用VB编写的COM组件9 o- P6 _4 l( `0 J: y( V0 H

" O! u- `- I" W( z0 \# r梅雷 - QQ1821117007
+ V) M( a, P, T8 d9 h& o% ]5 ^亲测 XP、win7(32/64位)可用0 p! y7 B" n+ c# b) }4 Z
/ G6 \: f5 T4 `5 e6 ?1 M% ?6 ?5 l
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。! n: k) Y' U! \9 @5 i9 {
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 + P  T' `& x) }, |& E
先说说VB开发一个COM组件。 ! n, {" P  a, l- R2 ~
用VB新建一个ActiveX DLL 工程, * \2 j9 N- Q) k; t; b' j
然后修改工程名称为 MyVB 3 w! U* `8 J0 G4 L  B
再修改默认的类名为 DEMO . U, F' U4 h! x; t' i. s
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
" x$ G  ~" l2 J: E4 d1 E7 ?: Q" n7 o5 w, K
注意!工程名不能为中文不然在c++中会出现无法识别的字符串( h; F8 f, f' r4 h6 A* ~- C

6 z" E; F: u/ M! V4 I  U' `1 L/ z4 ?/ c* ]- e

( N% w% z3 C9 @$ mDim str(999) As String9 k# P7 a6 L7 j# g( j9 `  n

7 A0 v+ i9 u+ U! cPublic Sub GetMeiLei0() '无参数传递
3 c2 x& v5 h8 W( CMsgBox "梅雷qq1821117007"1 f0 D$ Z# Q% i5 u/ [4 K
End Sub" Q; ?# L! Z9 Y6 q5 r2 @5 Z! s
; X7 x- y) ~! o8 P- `3 x6 ?, O9 o

, N. S# K$ ?! H! D; D& q'带参数传递   Public Function5 c( C. Z. h/ j9 k$ b' ]1 g
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String- \: ]" O4 r/ r! A) f: O" O5 L! p
str(n) = str11 F6 c% u3 W2 c8 b6 X+ A/ D" p

; s: m: g4 D" s# ?7 dIf n = 5 Then- ]+ e) T- ]- i) [9 F$ {# t
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)! E$ Q; U% _$ G7 V1 d
End If
3 F, F  W; b+ o) y, z  T
+ d5 h5 M4 R& S5 a: ~GetMeiLei2 = "数组传递0"( |5 P+ K: K6 _0 z: F2 g
+ E2 @8 R5 t$ i( `+ ^$ |& m0 e
End Function% ^# @: A( w: y3 c1 y. _1 H3 r1 F

  s8 g7 B" G8 F/ t0 [/ x3 R& K% T3 v* d5 s3 }+ [- y" V: n
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
, ?5 }0 A: K4 I% U& o# n. U
4 [+ o4 L- h; j2 h4 Q2 Z/ @注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
, s( ?  c5 @! k) _/ O5 Y" p. _+ l
+ q( M+ r) f" m# s1 j' Q" E  N+ r4 n2 H, z# ~" R! E3 Y
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
  T2 i' A  d4 z1 [而 VC 里调用可以这样做,如:
+ ]3 D1 |; H$ r! L/ {. @Visual C++ Code
$ h/ Q7 I+ `* L, h) D. y$ u# u; }; ~1 F3 M$ P
//新建一个 UF程序,输入以下代码
3 D# o) \' D# h6 X/*****************************************************************************9 ~0 Z% B6 R4 K% I4 h3 S
**- y" j1 Z& ~0 Q- G) L: N/ w+ e* }$ B
** C++调vb.cpp
2 n' @; q( G0 m+ J$ z**
. K. r4 P% k' w, K** Description:, y8 N- A$ h' H- [3 W. B
**     Contains Unigraphics entry points for the application.- Z/ Q2 E" ~% L, H0 p9 N
**' V$ g: w5 G6 V$ \& _( |7 [8 k: W1 A
*****************************************************************************/
0 t5 r* M+ k1 m
+ U5 b0 M( ]# l/* Include files */
  O' F3 Y& c7 |#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
: r4 U" m4 ?& O' J#   include <strstream>
7 U- p% G9 D+ Y( S( }#   include <iostream>
6 ~9 ?8 N6 s6 D+ P* y9 u    using std:strstream;8 ~9 N% t4 w/ j  F4 R, X. i1 f
    using std::endl;   
) f; @# h8 W5 o2 n7 j    using std::ends;
8 I3 b+ N; I$ x" p. j2 M; p    using std::cerr;2 G4 b  w+ ~+ F# J) z
#else/ d1 t% w, ~  J. v
#   include <strstream.h>
( D  S- X  T8 I: x#   include <iostream.h>) A8 h+ ^2 W- U& @1 C3 i% n
#endif
. Y4 u' t: ]* `* A/ e#include <uf.h>
* A, t$ }" Q7 c- O, V' t#include <uf_ui.h>+ {; K5 T" m6 K& n) P
#include <uf_exit.h>0 X  _' j, ^* u
#include <Windows.h>' P& k8 u) p! ^& R* w  p4 e9 k  s9 S
. Q. Y3 V- u0 @' f6 C
#include <string>
6 u/ s0 i& y& q0 D1 f* i: d#import "C:\MyVB.dll" no_namespace$ ~3 v4 _1 O9 A( Y* B
//using namespace MyVB;    //这里是COM组件名称, p" d' M; B7 {! \8 y3 d, M5 _# M
; Z" g1 T+ E0 m, j5 J
, H* R! I( @: D' B) n: ~. F
HRESULT ComInit();3 J; @, e8 r& ]" U/ k
int mmm(char* str)
# P2 g0 K5 O" r0 Q, C" A' S) W. o{' z  R) b% y/ Y5 w
        ComInit();
; s  \* G3 `- j# r9 X" v. F% j- |
6 |% G3 O% L  G& k        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
8 `! z& h# p; L4 Y$ T& @7 U        MyObj.CreateInstance("MyVB.DEMO");8 j; }: F1 m0 i5 F' H' ]
* Q) n0 n/ ?; }4 x  u- j) t& u
        //MyObj->GetMeiLei0();//无参数调vb函数' f4 s( U0 K- N" R
6 v* L/ I" R7 ^' a
char str1[132]="0.0";
0 s2 @$ R3 o, I. B- P4 Q6 ]/ P! M+ y+ [" K
int n=5; 5 W' n; b9 x2 L- [3 ^

; k! i! S7 x3 Z1 Q: Z_bstr_t vRsinfo1;! C  q" G8 F9 T7 X

6 B: S/ d, n& Y! {  m2 [) Q9 q  t! {vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
5 x! t' {# j- W* Q
9 X  g% w6 _" g+ H9 J9 n5 _/ Pstrcpy(str, vRsinfo1); //字符串赋值
- }( I0 z/ T1 R" x% G* N, V  ~! l
" v( N6 t0 F3 ^6 j$ k7 u8 D3 SvRsinfo1=MyObj->GetMeiLei2("梅雷",0);$ ?4 v' g" {6 x4 ]
vRsinfo1=MyObj->GetMeiLei2("qq",1);
/ K& {4 e1 G+ Z$ D' g! CvRsinfo1=MyObj->GetMeiLei2("1821117007",2);) p  L* n$ T0 B9 O' T, C
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
7 o4 O. ?9 Z1 d9 p7 p& Q+ jvRsinfo1=MyObj->GetMeiLei2("手机",4);4 h; F, T, `% @5 H
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
/ }3 V9 z. H# J, n, Q; Z        return 0;
  K+ b- [; n- I2 X/ R$ r}
7 M) A; E9 a1 J# S6 ]( s2 l: _) U! T* k2 M; G
HRESULT ComInit()
3 b& B+ e6 t' C& }) F{) H9 w! _8 J" F$ h6 s5 B- S
        HRESULT hr = S_OK;6 M( R3 Z+ v+ I0 V7 ?3 s. y
        if FAILED(CoInitialize(NULL))' h9 j! s9 T+ M' d7 ~* ]9 x
        {; C& u8 S; l5 c$ t2 o* c- `$ g( r; F
                CoUninitialize();
) j$ K5 y9 d+ O5 B) x' I( c                hr = E_UNEXPECTED;5 ]9 z% j. C# o2 s: o
        }% s( [3 O+ o/ a1 s8 v3 ~
        return hr;( E4 A: p7 b. Z$ F' j  C+ ^6 J
}
. i8 D  O! ~8 P% M/ J
- J# L! ~& u( e9 U8 p" N+ H+ y& }4 U+ C& r1 A6 _/ v# O
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
1 H; M. w9 k' O: T* _, b9 M1 E" H7 k, T6 [
1 S# Z& T, v9 ^+ F( T" V$ T" a& w
& [& B2 K8 g2 h
static int report_error( char *file, int line, char *call, int irc)0 l( n0 Y* \8 j5 T8 b" N* o" G, y* o5 q, L
{% M/ L. D6 F; d
    if (irc)
' z. ?2 I' A! x8 M    {5 N* O  @8 }0 T, i9 {! h2 W9 V
        char err[133],9 M/ q% Z0 b) a1 Z; P% T/ b9 k
             msg[133];
3 O1 D  U5 V3 v8 Z3 P+ H
1 f1 }1 L1 ~% k7 m! \0 \& l        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",  {. l3 g7 S0 _; W! P
            irc, line, file);2 ^, E1 d% Y5 ~2 H% d
        UF_get_fail_message(irc, err);
/ B( }" O  ^8 S9 h0 r. o, ~( D) t* o
        UF_print_syslog(msg, FALSE);
4 }7 D: B9 E1 V) f; X( {, `: v0 K        UF_print_syslog(err, FALSE);
9 j% E8 t# Q% j        UF_print_syslog("\n", FALSE);
' T6 u; j% i$ N% J% [        UF_print_syslog(call, FALSE);
$ k8 v: P; K( U' W# c        UF_print_syslog(";\n", FALSE);8 Q9 g6 L3 N( p, _" U

; e9 P$ D, x9 g6 O/ C8 ?9 _        if (!UF_UI_open_listing_window())  g/ @( F# I+ Q, ]3 I! V
        {) n5 f$ n/ r3 k$ o4 M8 U7 B# p6 |
            UF_UI_write_listing_window(msg);5 R1 ~) ~& f$ s6 ?
            UF_UI_write_listing_window(err);, b7 {5 q& P: C" L( L$ |! K9 o* x
            UF_UI_write_listing_window("\n");" z/ ^1 Q& C7 q! |# O  q
            UF_UI_write_listing_window(call);
; X3 P! c% ]0 m$ W4 r: e0 l: C            UF_UI_write_listing_window(";\n");+ A! }: C# K  h6 Q
        }
% N: T. q" m1 }2 @' c    }
1 M: T7 d( x/ w/ V" o$ X$ R3 r1 C2 U% _" c% E5 Q# C2 E5 S
    return(irc);
' m% [6 [8 m6 ^# p0 r. \" Z" e}
8 J% e  Z& f  V2 O
: n/ A, h0 H0 C4 u7 s2 n4 J1 U$ t$ X# n/ x* Z# k  t- ]' e) {3 [
/*****************************************************************************  s& Q) Z# M) |8 T! s" `
**  Activation Methods/ l) `4 _' _1 ]
*****************************************************************************/9 g, F* O* b* O4 G/ b) g
/*  Unigraphics Startup
- s( F* F$ h4 y+ E* [**      This entry point activates the application at Unigraphics startup */  E/ ]0 ~9 Y0 a- n; ]- h: @# ^2 P
extern DllExport void ufsta( char *param, int *returnCode, int rlen )) D& z, _4 f5 ?9 t. k& v6 l
{) @6 v% ?( B9 n6 T- o
    /* Initialize the API environment */
8 c! Y4 Z# |' p    if( UF_CALL(UF_initialize()) )
# Z# S" L& {; Z+ G    {
5 r+ ^2 d& L0 Q+ M! n# r        /* Failed to initialize */
  A1 G# q$ {7 e        return;5 S$ e1 m' }0 \: S' w/ s
    }
/ `1 x! w/ ?, x( {
3 I# {- I7 Y- T) {  e    /* TODO: Add your application code here */
& q- U3 P8 q: K
/ O2 S& r$ X- b& x8 m* Q* @! v( s/ b
3 Y9 a6 V# {. O: \8 l$ s4 N
( U! _8 a9 \& r        char b[132]="";
" o& ]8 y, I( ^! u: a        mmm(b);
1 D( c2 a7 T3 N3 ?+ ?) G        uc1601(b, 1);   //在UG弹出显示框1 r+ _( e- M5 k" f

2 w0 X7 v- B; @9 @. \0 l/ G! M+ W* B8 o( ?2 s1 T: q+ o
    /* Terminate the API environment */
, x/ U5 W, X( I! I3 Q# H$ l    UF_CALL(UF_terminate());
3 q4 T' c: e1 o- ~  `# m}" k% ?2 S' J" z* D- P

, v. v9 s, v, J/ {/*****************************************************************************3 Z, E5 X4 T: R$ v6 u
**  Utilities, F: p1 {# o6 ]
*****************************************************************************/
7 f& p* w4 Z) l# z; N$ [( V. n5 k& C7 f: e( N9 ?8 E
/* Unload Handler
$ F& B' l2 H' J7 Y, H& T2 J! _**     This function specifies when to unload your application from Unigraphics.
# q! t6 J3 h$ T0 S& z* L7 }% ^; C**     If your application registers a callback (from a MenuScript item or a
1 J9 A' c  |* m1 ^7 v! m**     User Defined Object for example), this function MUST return3 l( p, Z1 U+ g4 ^1 W1 M1 U9 M
**     "UF_UNLOAD_UG_TERMINATE". */3 N" ]: s7 ?: \0 E  J0 T' l
extern int ufusr_ask_unload( void )9 O' J% r& i3 o$ {
{
2 p6 p* D8 x1 i, f; ]7 l    return (UF_UNLOAD_IMMEDIATELY);
' {9 f% n1 s; K}) h6 u* I7 [& w  p+ [. [
1 W6 E) r3 f% T3 Q
5 F2 o2 a  T4 p0 G

) D: u. b8 s# M2 L; F* G+ r# }+ C% r3 e. m
6 `" ?0 A0 E3 n1 Y/ ^
. _& b7 H, l1 d5 f! Q0 j
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了