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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
+ t  D) `! z& c- j8 h, m  _0 o$ H
9 P( b! J  o4 o9 z★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
( s5 H; y. `* I& @8 _% X
  G) L) Y' B$ ]* Nvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册& u) i+ t) O; {* N" ?: u7 L* q
9 g" R) A7 M# k, Y1 d
=============================================================================( w( N% l: K: `1 k# ~
在VC中调用VB编写的COM组件
9 c- V4 S$ v4 _
. F$ ^8 {" W2 H& u梅雷 - QQ1821117007
; s$ m# Z. j* a( R  J9 }1 N# m2 j亲测 XP、win7(32/64位)可用
: {7 N% \# ?& H/ ]$ z
7 O5 P! \: `. r+ l  e6 DVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
# J9 A' Q" @/ {1 h$ T2 O为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
. o' W0 q1 |6 Q# S( j先说说VB开发一个COM组件。 - B8 {/ v$ E* J1 _# ^- H, G3 f
用VB新建一个ActiveX DLL 工程,
" F, h, k- d7 b$ B/ z然后修改工程名称为 MyVB
  F' l6 u. U6 D# b% D再修改默认的类名为 DEMO 3 o! V6 M9 ^" c8 K& c: B: s% E
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
/ X$ A4 o1 s8 y0 [6 M! g0 z. K0 _1 a- j  C1 f, j( T1 s) u9 h
注意!工程名不能为中文不然在c++中会出现无法识别的字符串& G5 _( U2 l. q8 b! W2 S$ }
, t" C! |1 L, t7 [( ~
% z* x0 M; e( E

  C$ b' @# F- u: `' ZDim str(999) As String  T6 Q2 w1 f1 s: V2 h

  F3 R" w0 @& xPublic Sub GetMeiLei0() '无参数传递( |; ^5 d5 e+ ~. n" U; Q
MsgBox "梅雷qq1821117007"5 c5 y* ?: y  L  M
End Sub
5 \8 j1 J  y3 S% Z: C% F. B  u: B1 [: T4 a, a' e4 S
3 O" {- E8 ^  n  r
'带参数传递   Public Function. X1 d: y5 o1 f3 j# `
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
4 Q, k9 Q. a+ X, ]7 G0 Sstr(n) = str1/ k3 |# y( q$ e* Y

* Z# k7 a: `5 w" }" ]4 v/ b+ EIf n = 5 Then
6 k+ S# h3 `4 }7 HMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)& S1 r/ {1 A+ O$ ]. \9 ^! I6 G
End If
) X( \7 D8 h/ F& M0 ^0 V3 h
/ i' I! ^8 [3 c/ GGetMeiLei2 = "数组传递0"
  V/ x; G0 N8 q. _" ]+ q7 ]0 E" A) {2 X8 y" ]3 Q( P) E* h, g% R7 [5 h+ t
End Function- C! j$ F0 x4 o& `. J1 m
) F$ k, j) C; U' [: v* W- s

+ o% M9 G& Z/ L4 x: S  t7 R# r然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 " i; w2 M9 B% ]) z3 b- ]

& W( t( v8 B8 ^/ {7 x" j4 Z注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 - e" D6 N4 ?8 K( z7 |
6 B% Q( p7 d& v0 x; e, Z% I3 j4 j

  C8 R' d! h0 |+ M! R7 S: ]其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 5 _# c2 K9 C  J& D6 [
而 VC 里调用可以这样做,如:
7 \+ R9 Y6 u; A' s  i  C9 b, B7 }Visual C++ Code 7 k/ y9 _4 U! f" g! U* `# C
% t9 z! t0 u* E0 j% \9 |4 a' |
//新建一个 UF程序,输入以下代码
7 ~$ W* ^$ J) p/*****************************************************************************8 z. C+ u+ ?4 t+ H7 p3 h( X4 K" A
**
* o- v( R5 m0 v/ G; ?7 @** C++调vb.cpp% t# J8 G& z! b; i7 U+ P& s
**5 m# S# O: h' m0 I1 q& ?: O
** Description:/ `' P' V9 L; x: \1 V  c
**     Contains Unigraphics entry points for the application.% b5 t0 y2 g- Q! j$ i- ~3 v
**' v/ P% A5 \: V% x, Z4 n) l) o7 H
*****************************************************************************/
0 M7 k) Z! X0 k: M. z6 e* k9 V  S0 S* J$ O
/* Include files */
5 c  C* u$ B0 _5 ~# I  i. D* R#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
0 h3 ^( @! `8 t! G& ^#   include <strstream>
; A5 z3 T, |3 B: B1 t* W#   include <iostream>
* r% i0 p9 n4 u2 k$ _% i( X$ G  y    using std:strstream;3 g) o7 ^/ m3 Y; v# \8 J
    using std::endl;    2 c) c# [/ E  |" J9 o' ]. g2 F, h
    using std::ends;! `! f2 q+ u( o4 u0 S: ~5 M
    using std::cerr;
4 E4 ?3 y! Z# W; n#else% L2 d; |- C  T. J6 |
#   include <strstream.h>
7 W# N2 t5 [: r- i3 F3 z#   include <iostream.h>
  N8 P( `  L; ~#endif2 J2 \* L2 {5 y) s0 @3 f! _
#include <uf.h>
& P! @1 X( |% ]/ A9 v0 d#include <uf_ui.h>
" h  p8 Y9 ]5 }5 @) Y$ {2 l% e' M- v#include <uf_exit.h>
2 I$ ]% x* E+ o#include <Windows.h>
6 J3 {* [6 i/ ]$ T3 F
& ~7 e5 Z4 v) R( h0 h3 C  d#include <string>
* h5 P* p) `! m4 F- _4 Z! a! Q) u#import "C:\MyVB.dll" no_namespace' c3 t: a4 X3 y" K1 a
//using namespace MyVB;    //这里是COM组件名称9 p# w$ W% R2 v% n  J" ^

) W. H0 \& w% M/ e0 Z. H% S( ^0 U( v% o3 a0 E0 l/ q( y/ Q! }
HRESULT ComInit();0 Z: l, `* M3 Z# h6 j
int mmm(char* str)2 z$ Z+ u$ Z5 |, ]- V6 A  m
{
8 @6 x6 Y- T& W3 a, i2 Q        ComInit();
! ^% O" Q4 M  F0 M/ f) D0 u" L* U* x2 g: A; }$ Z9 Y
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
# G: A8 K8 p/ P5 v, L( ?8 H5 B; x        MyObj.CreateInstance("MyVB.DEMO");- G7 h* ]0 [+ X; A7 ^& I7 ?

1 k6 G* Z4 X% ?        //MyObj->GetMeiLei0();//无参数调vb函数
5 X( P: \2 n3 _# Z: b' m$ [
. M' j9 F; [4 D! U) Echar str1[132]="0.0";
) @4 @7 b& n. ^8 M* g* O* a; Z$ V, a. ^) G
int n=5;
+ q+ l$ ?% z: B% C; S; }8 s. J; g# I. |, a. [
_bstr_t vRsinfo1;* A" I* ^( d" Y* Z# ~- u

" c; B! p5 W0 I* f' z" t' p& e$ RvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
- f2 ]5 s$ M* V
; m5 l. {9 R8 w$ O+ G% G3 ~strcpy(str, vRsinfo1); //字符串赋值
! f4 \  g4 C  n. W' k4 U4 j# C( x- }" j0 k& h3 I% `7 i& D$ a/ i
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
" ^9 {5 l# _( X; fvRsinfo1=MyObj->GetMeiLei2("qq",1);
7 @+ v) }) v" R! V6 i2 U) evRsinfo1=MyObj->GetMeiLei2("1821117007",2);
: Z' H4 D# N# d* v- JvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);& w5 ~( N0 H/ T% l" k, ?
vRsinfo1=MyObj->GetMeiLei2("手机",4);
: V0 ]6 k* T; vvRsinfo1=MyObj->GetMeiLei2("15757753770",5);
. k" k* B, Q- l* O, }; t# H4 m, _9 `        return 0;5 n: T& b' U! }( u
}* a( m& o6 @7 g( a
9 e% W- G' X' {$ r5 _7 P# X
HRESULT ComInit()
6 F( j& L6 W# z0 b; y3 j{. B0 l* `) t4 h9 p: S4 S5 [
        HRESULT hr = S_OK;
; [) x- U1 W5 y; k' B4 X  s! w: C        if FAILED(CoInitialize(NULL))8 T8 V- Z; B* y  }5 a
        {
- j4 Y0 r6 a% ]$ K+ w8 d4 S7 A                CoUninitialize();
4 V% {2 l/ h! m0 {4 ~9 \3 |                hr = E_UNEXPECTED;+ g7 m: w1 A8 [
        }0 w3 i' ~1 l5 D4 z" U
        return hr;' T$ l9 D  H5 E/ S) h
}
  n) H  l3 k7 H2 o" M$ B9 Q6 F1 W8 l* t

9 o( m+ S3 E, ^$ p' R4 p#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
) Z7 S8 `7 X4 j
7 _9 C! n9 V7 d9 g
: i! {8 g4 N9 b+ S$ ]) H- H& [% k6 I4 w1 d$ W, l# E9 U
static int report_error( char *file, int line, char *call, int irc)4 x; \! C( x- d9 k' n$ u
{
2 Y! |4 G* l3 @0 H* o5 B* u    if (irc)+ ?/ `3 C2 e; I4 e/ A
    {
+ |6 D* i0 I0 h- U* p  [        char err[133],
5 Q% C) o* m" S! E. O1 V             msg[133];2 d5 ^5 `9 H) i

2 K+ I8 \$ v- O: G4 V        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",: N9 N; n, z' Z" l8 j: z+ _
            irc, line, file);
% x7 {9 @1 W5 N! M        UF_get_fail_message(irc, err);  G0 Q  y: W) n6 h8 K8 S0 _

6 @8 ~- X, d: c: [        UF_print_syslog(msg, FALSE);
1 `) y* z% X# O" a& d# a        UF_print_syslog(err, FALSE);/ o' F( y+ Z  Y; K) e, G
        UF_print_syslog("\n", FALSE);9 j2 C" ^* d: q4 _; K' s
        UF_print_syslog(call, FALSE);- n- L3 C5 B3 x
        UF_print_syslog(";\n", FALSE);/ }9 G3 d8 `: s) D; k

, N! b4 |! z8 g. C8 i! H8 O: f4 w: j        if (!UF_UI_open_listing_window())3 G7 K$ W& \: G0 j: R  v# l
        {1 u' x0 m! Y: Z9 U
            UF_UI_write_listing_window(msg);2 p& j5 |. w$ P
            UF_UI_write_listing_window(err);
! A& j" ]2 a3 I' c8 Q* b/ H: X            UF_UI_write_listing_window("\n");
5 O+ S& x7 _6 R3 |, I- m            UF_UI_write_listing_window(call);
8 I1 _. M' F( {! j  L% @! W            UF_UI_write_listing_window(";\n");- Q7 f2 H  t# W! J
        }
2 X& D$ [6 `* o5 ]' J, ^    }
& z: @; x3 v- F8 K9 p: f
4 \0 `. I7 h/ U$ {( g) W4 A    return(irc);% k) f: r6 ?: N3 x9 q  g$ q
}
$ S4 v$ i6 {3 ?/ q: j0 p' x- ^, T+ ?

0 x8 g' _: S" L* i- q) A/*****************************************************************************+ p* p% k8 T3 V
**  Activation Methods
/ O. g" i# Q" K; B0 y: M6 X5 q5 k) Z8 P*****************************************************************************/
5 h- T8 L  T  W" k  E5 J/*  Unigraphics Startup
" ?) I8 o" g2 r( c**      This entry point activates the application at Unigraphics startup */
% f; ~* d4 j  k9 Rextern DllExport void ufsta( char *param, int *returnCode, int rlen ); k1 G. @$ k4 F- O
{; w8 `* \  z) z
    /* Initialize the API environment */
% e- Q) F: m% \* c: s    if( UF_CALL(UF_initialize()) ) " G  G( c& {  X
    {
/ D! a: G- _7 G9 y        /* Failed to initialize */; S# F+ G1 L0 z3 h) [
        return;
: y" P% f! h7 ?" p; G" p* D2 P! h    }
# _& U/ a0 v+ h8 I7 m1 g/ b2 p3 g- i
6 G/ F$ a( g3 k' v3 P    /* TODO: Add your application code here */3 N2 ~! w% w6 @3 N( _( G9 T8 M

9 A: d3 J/ m) T2 z& ?$ V2 B3 X: _
9 e( b9 a4 c" o* H: Z& X/ G, a+ N
        char b[132]="";* A$ v2 H% ]7 N, z
        mmm(b);5 h1 U' w% K  Z: l/ D# l
        uc1601(b, 1);   //在UG弹出显示框0 g2 M. s6 y# H+ m" q+ g

, O# c+ v2 [6 _& `6 C9 O7 l; i+ `+ s7 P
    /* Terminate the API environment */; L1 v) G/ {! U7 A. ~: z; o" S
    UF_CALL(UF_terminate());
$ P+ ?. V  T. u' ]' K" S8 T. G}
7 o+ ^9 `6 w& X' n0 W+ [: W# t1 I$ q5 K  o
/*****************************************************************************" r; q9 s3 q3 i- c
**  Utilities
! J! O! h' E7 C3 J8 m( G8 E*****************************************************************************/% v8 o- U' q& o- T7 o) |/ M

" A( m8 U, K" Q9 B- ~! w/* Unload Handler
9 H6 r0 Y' ?) e**     This function specifies when to unload your application from Unigraphics.
! Q9 p) M& V3 S7 R" C( p+ f. E**     If your application registers a callback (from a MenuScript item or a1 M7 a5 M) j4 p# s/ l+ e
**     User Defined Object for example), this function MUST return0 |7 V  W4 k3 n/ L. j, A: Y( J
**     "UF_UNLOAD_UG_TERMINATE". */+ n2 O. d+ l/ u; Q# j0 e9 S( h9 I% A
extern int ufusr_ask_unload( void )
, c# q# C0 N9 q3 \" A  C  @) m{' r& |; c0 q6 R% b6 ?
    return (UF_UNLOAD_IMMEDIATELY);
1 l1 V8 W/ b7 P4 ^4 M3 ]+ R5 P}) n3 l& M8 H. E5 J7 Y
0 r' U4 R1 N" r8 R) @3 j8 _0 @
# p. V) B6 A$ p% Z) H

% G$ o, h( W& z6 s; T! K# A1 _2 ]5 ?/ J/ A* e$ z% l& X1 H

8 i5 L- p! e; z% ]; N% K6 M. F8 r8 B- B% U! r
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了