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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件' g/ V2 G2 `" h8 C$ z+ `: \
8 _3 o# x1 h& F% f: T5 C
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用! O' Q4 k* n) D2 S+ ~

' k0 ]8 r  }, q5 r- h3 \5 ?9 Jvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
5 e! `% z$ S9 W. Y
& O0 b$ ?$ C/ ~4 {3 T; Y1 y/ g=============================================================================. ^2 O# u7 t; C4 X2 t* X
在VC中调用VB编写的COM组件/ g8 i6 k+ G* v+ `
2 m( K4 W9 j) G6 S. [# |5 I' S
梅雷 - QQ1821117007
! K; x: }7 Q) I. d" V5 Z1 E亲测 XP、win7(32/64位)可用. m: D: Y9 v0 U" A5 i/ s

- F# S( u: N3 i( h  e* s: ]/ lVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。) d1 E! d3 t: h
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 0 x/ A! I4 Q( h: _& k0 K7 m
先说说VB开发一个COM组件。
" A- }( w) G  O# b( j用VB新建一个ActiveX DLL 工程, & c& i) P8 C1 D* h; Z9 `' V
然后修改工程名称为 MyVB
  v) U, _! h5 E9 G7 o: W9 L! U% m再修改默认的类名为 DEMO
+ Z- T$ k$ u9 I然后再向类中添加一个函数作为测试用,如: Visual Basic Code
5 b& u/ T( s: m& \+ D5 t+ v  o
! w! b$ {0 y) `0 X注意!工程名不能为中文不然在c++中会出现无法识别的字符串
- Z! T( g% L$ \
; Q9 i- k7 H. H0 _" D, o
2 C+ d. G8 j( ?. Z7 C" Q1 A4 u1 Y
* k/ X4 r, R- V) k% @  ^, nDim str(999) As String
$ m5 R5 @/ C6 c. A" F% i$ H
4 Q3 f4 S3 ^  WPublic Sub GetMeiLei0() '无参数传递* o/ A! N) y! n6 X( g0 m+ P
MsgBox "梅雷qq1821117007"
+ O+ X1 z/ x% v- `8 XEnd Sub8 B8 O5 {; O0 m$ R. f/ A
$ {* \0 D7 E/ e& p* v$ f

. w, s' n7 i% q; ?% J. c'带参数传递   Public Function! X; R- E/ z( [) E3 b2 t
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
- e) i  L  B8 r8 E6 rstr(n) = str1  K# w5 b. P( n9 z7 |- k2 _* x
* m$ M+ e( q. ~2 S& L
If n = 5 Then/ b3 ^( a& K( d' I8 `: Y* J
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)( i7 ~0 C5 y. g3 D! d
End If
0 S' t9 l: [5 o0 }- p  f0 O7 T) J0 C: b1 a! C* K; V
GetMeiLei2 = "数组传递0"2 `# V% T' S2 ~% z5 X/ a: c

8 q/ ?- o* c( n9 h4 ?8 u% ^3 Z/ NEnd Function
1 Y# p4 u4 Q  b- L* R. [# Q: z2 f5 k5 Y8 A$ i
; z7 z- p, u( D0 e
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 7 @8 l6 D: z6 r, g

+ a+ J* e: z' G: r, Y; A注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
8 c2 h$ ^0 l; S  N/ J: A: S" E$ U8 g! Z% f, K
1 ~1 m+ I$ c" k% h2 `8 P' S0 C1 e# p2 g
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, # h2 ~" `6 q9 Q- r; ^# _. `) \  W
而 VC 里调用可以这样做,如: 1 A1 m2 ~9 L. E( y- Q  w2 v, d
Visual C++ Code
7 B  }2 Q  z/ m2 |2 d- z. |
- D* Z  o" V1 n2 O//新建一个 UF程序,输入以下代码/ w) J, U' t: l$ ^. ?7 l& E' E2 a7 P
/*****************************************************************************# j4 W" Q8 Q0 B" ~
**
' c6 [+ ^9 {9 p** C++调vb.cpp" G+ Z. L( _6 D) U  `' y5 C4 |1 o* u
**9 U7 X, a+ b% z' _  t
** Description:
* b" _) L9 k2 m8 l9 A0 g**     Contains Unigraphics entry points for the application.6 Y0 i* J, N4 Z' X
**
; R2 z4 @1 x; E*****************************************************************************/+ z& z6 @: s, \* o
3 H+ R! F# ?/ k# O8 k" k3 R
/* Include files */
. \+ D# X9 ?8 t  T( E/ `#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )0 d. E+ S$ H- v- E/ q3 v2 w7 [
#   include <strstream>
0 x$ @) Y6 m3 v9 S#   include <iostream>
7 \3 f1 J1 w. i& t! h    using std:strstream;  O# q3 r3 `( z8 A, Q' U
    using std::endl;   
! o. R, ]% m; W2 M# l    using std::ends;
/ ]; Z, N% b$ z4 a- y* `    using std::cerr;- D) Z+ |7 J+ F2 A3 U. Z4 F
#else" M* p6 V2 U3 Y: ^
#   include <strstream.h>, \6 T! J! w  l/ o% d
#   include <iostream.h>
; f4 n$ [% [# s' D+ H#endif
- n! @5 a3 w  j9 t: H#include <uf.h>
# b% k- H9 c$ q+ L( g; ?#include <uf_ui.h>/ {4 F* P. }' p  D' \) R  r
#include <uf_exit.h>
2 D8 Z' k+ q0 a2 r. y#include <Windows.h>
% G/ \2 o3 c" J9 C: }- M/ z
0 F$ {2 z' H5 n0 |6 _, c#include <string>0 ], C5 ?: m/ `" B/ ~! Q2 O
#import "C:\MyVB.dll" no_namespace
2 o" g* W; Y! {: Y//using namespace MyVB;    //这里是COM组件名称
$ k" _9 r9 z$ C7 N3 \8 _
' ]# N& R5 G2 B4 M$ S2 p
3 K' H5 B6 M3 n; |HRESULT ComInit();
8 G" s' _) f7 Q1 Vint mmm(char* str): @& Z9 e5 o: ]& U: Z, m4 X  P
{
1 R- F& Z8 v1 i. U2 h- r% a& I; M        ComInit();
9 t" q$ t% Z& T  Q5 a; b0 K; b- @: r% t1 A3 J" }) T! I
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象# O" `. L7 c9 F
        MyObj.CreateInstance("MyVB.DEMO");
3 i) E. A+ ]! n7 Y0 S  y
" W  g( O6 {  g        //MyObj->GetMeiLei0();//无参数调vb函数. p2 [) |! P3 a& n0 B5 q3 G
2 `8 x+ f) W% i
char str1[132]="0.0";7 t5 `4 _; I6 o4 v/ b

/ m7 L. }5 ~. c7 X1 vint n=5; . k4 [& [# H: X! c
8 y) b" l* n) v1 q
_bstr_t vRsinfo1;
! ^) L, [6 @# M+ y" a# r. D; t% h* l+ u
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
% k9 w) Y3 w7 U& [: P
. m- W+ B  ~0 g2 c  y; Rstrcpy(str, vRsinfo1); //字符串赋值% a0 ~& M! P# E

- e+ `3 [/ z5 g, IvRsinfo1=MyObj->GetMeiLei2("梅雷",0);$ V" c4 V; u  x
vRsinfo1=MyObj->GetMeiLei2("qq",1);
! C. }  w3 o, F* `vRsinfo1=MyObj->GetMeiLei2("1821117007",2);! h1 C+ A5 q/ F3 I( q
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);; A. v  P* A& E
vRsinfo1=MyObj->GetMeiLei2("手机",4);, y% f9 U5 ?- @) w: P
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
" p5 ^* Z8 ^, w  y3 Z( R        return 0;4 E% y% j/ Y3 }* U
}
' x& ]! ]. N$ ~( ]+ m5 h& e
/ Z7 I) r: y/ iHRESULT ComInit()
6 A& ~0 d+ a. E8 W7 O{7 m% c" Z# h0 }
        HRESULT hr = S_OK;3 E' M8 ]% p( _2 F
        if FAILED(CoInitialize(NULL))/ J) l" V2 x6 C$ @  L- v
        {
& e2 A% [6 J) d& M" v; y9 U                CoUninitialize();
2 H9 q3 N+ \  G. O- o2 z/ v* K                hr = E_UNEXPECTED;
' [& x* P) F7 K9 k2 `2 \1 u        }7 y" D- m  v1 w1 b8 Q
        return hr;
: b8 q/ V1 I; ?: w}; p+ f; {& E5 m" d& o
/ ?4 f& ]( r' }1 T: m4 |

- t  E3 i% R! E3 z9 V# ^. h- M#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
* n0 ~& F. d7 S5 ?3 c. f& x: ?% I  h5 q  r" b& }; T

* e7 [7 H/ c' y9 A5 Z  R8 p
9 i! [; m( K9 E+ P" R( e5 Lstatic int report_error( char *file, int line, char *call, int irc)' N0 m9 Q9 Y& ^( L: e% ^8 f  v
{
# h. B, J% b8 a4 Y    if (irc)
" x1 C- j* Z$ Z" S    {. I- }% p  o8 v& j" c6 i1 F
        char err[133],
, s2 I2 B: x8 A! V7 X8 V             msg[133];
: f0 Q( q' y8 K) Y. g# C
4 s- {! [) U) V7 I4 `        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ "," A) F4 y0 p; L6 w- \$ r7 l
            irc, line, file);
3 x: t# O  |* |5 i, E        UF_get_fail_message(irc, err);
! h$ A/ ~7 ~& ^! k* j
8 i4 u0 r! {$ k5 G        UF_print_syslog(msg, FALSE);  a! G* H8 q+ C, y9 _! E
        UF_print_syslog(err, FALSE);
! o% S9 V- l: ^1 u        UF_print_syslog("\n", FALSE);9 \$ s5 C0 h( h0 @3 s
        UF_print_syslog(call, FALSE);
/ ~; t3 Z3 Y. m( m  h) M        UF_print_syslog(";\n", FALSE);
' R) h- O. d8 _' d3 R$ M( _! N1 c  ~! V, f( r5 ?% J* y* z
        if (!UF_UI_open_listing_window())/ O, x8 t' N! S) t6 x9 [$ y
        {
/ E4 _2 L% l; ?9 ?+ [- J$ J  k            UF_UI_write_listing_window(msg);) l% Q" ^9 R5 a2 I2 W
            UF_UI_write_listing_window(err);
, @3 W3 n8 g/ M' a# ]" }  O            UF_UI_write_listing_window("\n");
3 {+ U" X& C# L9 c: Z            UF_UI_write_listing_window(call);- J6 k5 P+ q' P5 G: h
            UF_UI_write_listing_window(";\n");
" M' }! u. q" U/ g2 [$ U        }0 P) ]/ n1 L+ C2 A( j2 G
    }8 D- c8 ]& y! L! O- r( M0 j0 t+ F

+ x+ E: t  q' x& F( C    return(irc);
. W0 c8 ?& e/ }; Q8 @/ f# z  \}
3 w7 s  \& y% a1 {
9 L2 G! b) `7 ~. ?; N' F2 _2 \+ R) ^& d
/*****************************************************************************% d7 x9 u" T8 ?- C8 X* D
**  Activation Methods' G1 a4 l$ Z8 X6 A
*****************************************************************************/
. _, B1 Y* M" J2 T: d" L' M/*  Unigraphics Startup+ h& u0 W* \  w% U5 r1 Y
**      This entry point activates the application at Unigraphics startup */) ?  P6 P: v5 a5 @  I
extern DllExport void ufsta( char *param, int *returnCode, int rlen )9 U+ H9 Z% r/ v2 c
{
+ u9 p) i9 V% F- H! w1 j$ G* I    /* Initialize the API environment */
* r0 t; G$ J1 o! _" K    if( UF_CALL(UF_initialize()) ) # q) |% h6 p, @
    {
- t/ y2 z- E, W        /* Failed to initialize */
4 A  s4 q1 G( n3 V" C" Z  I: V7 j$ o        return;: M8 l- k2 G4 \
    }5 J) x+ o0 X5 v: o

) W: I% [% z2 p3 O    /* TODO: Add your application code here */
' r# w6 j6 Z& c! o( s% A/ @9 |- [7 O% E
4 E6 s/ w1 u9 ~" @& W% ^

. F: @% ^' \& k7 o5 X        char b[132]="";
1 t& K) o) w3 x9 d* @, b' c        mmm(b);0 ?2 K* N  f+ v8 Q
        uc1601(b, 1);   //在UG弹出显示框
$ R2 v  F8 `8 K* {" [) M- q4 z- e* v: @& z/ }0 B. }: d  v
. P: s' \# z' _5 ?6 f! E! ~
    /* Terminate the API environment */: l3 Z0 a. o& i/ u
    UF_CALL(UF_terminate());5 @+ T+ k' o% p3 k& W2 i
}
5 I9 X' s9 P, z* N! G/ j7 W( K, e
* ~4 O  k! y" x* i, G/*****************************************************************************
9 e: U" W) j& @& r: c) k**  Utilities
+ ~/ ]% \" q+ q6 g/ x*****************************************************************************/* V$ u4 V4 }& H% h2 F: K

7 ]& I$ Z- Z! B) y2 l/* Unload Handler
0 M7 G" O( ?" x**     This function specifies when to unload your application from Unigraphics.
9 Z1 H. a- V2 ~**     If your application registers a callback (from a MenuScript item or a" [( }* R/ ^3 y8 T) q& r  n
**     User Defined Object for example), this function MUST return
. G) r1 ?. @( U9 N4 \**     "UF_UNLOAD_UG_TERMINATE". */
6 T: a" n$ A! g( D2 jextern int ufusr_ask_unload( void )
. P- z  V: y1 H9 {  h{
7 h6 u5 Q# i4 P4 h# {  Q    return (UF_UNLOAD_IMMEDIATELY);
/ s# U! E. l3 s0 h# F}/ z/ W: {" e) R8 Y/ d
5 X+ b2 E  F+ y7 B
9 }" w( W) o2 W/ m$ L& _9 ?* b- r

, ~6 e* d4 y) z3 |, q* F- v2 Y8 k" S: p5 X8 z# a

6 P" S% f7 h0 W# K: R7 Z4 y7 \4 }! O6 O7 e% 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二次开发专题模块培训报名开始啦

    我知道了