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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件2 @4 y$ R  j* \; j2 R4 r
+ ]; y4 N" n- r- a
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
) q. w' H  u1 R/ q+ Z0 S. O) J/ O
4 B! e/ l% I. C" \/ Vvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
$ R4 ]2 S& K! L1 [) N$ |+ v" T4 {* L& H$ I( l- y5 R
=============================================================================
4 |# q8 j* T& ]* t' `( t9 o9 w在VC中调用VB编写的COM组件3 q7 W- c6 @/ }( c0 f$ Q9 A  u
+ Y2 _, f5 |: ]2 ]- d& ^' L9 Q
梅雷 - QQ1821117007
' Y$ F( |: f9 L- Q0 G亲测 XP、win7(32/64位)可用
( c7 z& Y: A0 K, Z
& |) b9 N3 }. A& l6 _) CVB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
! _  M; [% y' P( E# f. F为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
' W4 K1 {! m: d; c: ^先说说VB开发一个COM组件。 2 _, x7 G$ ?+ L4 a, U  w
用VB新建一个ActiveX DLL 工程, ' t* c) c) w: W+ F; T$ \
然后修改工程名称为 MyVB
+ H* d( e' W% x" U# G% e再修改默认的类名为 DEMO / O' K5 L9 W! k; z
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
9 \- v" ?2 s- a( N9 M" Q+ w1 y' I4 s8 k- m& S$ I) y
注意!工程名不能为中文不然在c++中会出现无法识别的字符串% C: F1 \0 W2 X' z! \
9 Q0 ?: h7 h8 J% K/ u* X

) s* @! H, }# E) r8 L) M7 a7 Q
( o  H7 w: D1 O7 ZDim str(999) As String
9 s) M- [8 g4 p/ c7 T
. f8 O( Q* e3 q6 d2 Q0 iPublic Sub GetMeiLei0() '无参数传递
6 c+ D% y  Q  Y! \; S8 yMsgBox "梅雷qq1821117007"9 ^+ o- {' s$ B' o8 g- B; r9 V# V
End Sub
% R% K2 y4 m* ^1 E8 J$ s7 ^3 J4 I! J4 H3 `  M$ K/ K, z7 N/ g
- b: K4 j, y/ A1 {( a, B
'带参数传递   Public Function
3 C% H# _  W! m( U4 VPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String) N( r- y! I7 B$ d1 N3 S# G$ d1 j
str(n) = str1# U1 v+ X( `5 D4 N7 u, Q7 N
/ k' v; J( V; @6 V+ \5 r. M9 W
If n = 5 Then
. p7 ]9 ?4 {1 _MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
4 f7 a2 l9 v1 `, p: jEnd If
/ Y- N; O- ~# _2 ?7 S
, E& [3 \7 L4 ?( h, Q; t) WGetMeiLei2 = "数组传递0"
3 \8 [! r. a! R% }1 [- ?+ Q0 R/ X" D# x$ g+ T/ {
End Function; b+ p7 d7 U( m. ?6 Y  h
% p" X# D3 n) V, Q& [5 b( {) R
! o' m8 E. C6 z1 e1 o, O. ?' k
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
6 k& N  D) J# [& ~, j; ~' B6 X2 r( z; w
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
& W$ n! x2 L* Y' o  z6 M5 }: C5 `: H* k/ }- r

+ o  [7 B" A5 s+ v0 I- Z其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
0 [& [4 ~1 `( M, T; E( Q而 VC 里调用可以这样做,如:
  T7 A7 P6 N  t2 L1 N3 D7 z% wVisual C++ Code
; ~4 B( K: v" e: F1 ^! q( u( ]1 m% Z
//新建一个 UF程序,输入以下代码
6 W; _. x4 N2 T2 v, Q  O9 W5 Q/*****************************************************************************" q( J9 w4 f8 q5 ]. W/ W: Q! R
**
$ Y, G# t% \6 L" Q9 I** C++调vb.cpp
( O" Z$ `6 W; n5 F7 i, F**
0 \+ ?7 k5 B6 z. V) A** Description:
6 c& f! }, Z7 C1 V. L# q**     Contains Unigraphics entry points for the application.
+ o, J; L+ T/ m8 W; z**2 K2 a! \$ ?0 m" F# a6 D
*****************************************************************************/
9 a$ p. i0 u6 C0 |# ~  q
3 u' L' X$ r5 U% O& o1 b# h' i/ i/* Include files */
& @$ d+ f0 }1 Y" ]! V* p#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )/ L; Q% J, h) B
#   include <strstream>
0 e" c: T: J2 U* f#   include <iostream>" s6 E9 p) F8 j  v9 Q  |
    using std:strstream;
7 f  [9 W; p0 Q0 {    using std::endl;   
% w5 u2 D& I% U3 S2 @$ Q    using std::ends;
5 ^3 c- E/ A8 j+ B# D    using std::cerr;7 G9 a8 `' e: N1 t7 D9 F3 W3 I4 y" M
#else
6 O+ a: }) r: j4 D( d( G$ A. w+ }! P8 ~#   include <strstream.h>
9 s  }, k0 ^- U/ l7 s#   include <iostream.h>1 O+ }) l, u$ y/ A: @
#endif
8 r; P% U$ `2 S6 U+ X4 z#include <uf.h>
8 Z7 D8 K1 A, v- l' d2 R6 h3 `#include <uf_ui.h>
! y: O' S4 z% v2 |#include <uf_exit.h>
: ?4 Y! |7 H* A9 \8 j#include <Windows.h>
+ g6 o6 n( N/ k4 J3 t. e, u% _, _, y/ u2 w
#include <string>$ p2 ^  @; W5 Z, W: f2 p& \
#import "C:\MyVB.dll" no_namespace
; X- C# U: J" c7 B/ I//using namespace MyVB;    //这里是COM组件名称
' j4 ?% ~& z5 v. E7 ?$ c7 W% T& F7 ^6 n  O$ S
& B2 K  ?+ B& S8 h
HRESULT ComInit();2 Y! M, h/ [# v+ m6 W1 c, H4 T+ r
int mmm(char* str), p, x. U" l; {: _! p6 M
{
2 Z( x7 [- f( D9 W" ^        ComInit();( x# ]# X! B$ F/ j1 O
( s$ l  x6 N- O- t% S% o) h  F
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
; @2 U! }  C. n        MyObj.CreateInstance("MyVB.DEMO");
& ~1 M) ?+ }8 ?
9 F, Y0 |& Q" |& Q        //MyObj->GetMeiLei0();//无参数调vb函数* S  O. `+ V; S( n4 j5 X% ~

% Z. R+ W+ P! Achar str1[132]="0.0";
3 J, U( |$ o! e/ j& D: c" `0 g( |& K  C, f4 S& X
int n=5; , _' L  e+ ]2 i* [2 N

4 @% H' B1 f- S' Z% K_bstr_t vRsinfo1;) U7 e: h3 n3 I+ j. P, p
7 {/ P7 l( Q7 h4 n! M( N
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
' d, t# d. G! B9 `8 z, i9 m. y8 k" }. c8 u& b- D
strcpy(str, vRsinfo1); //字符串赋值+ n+ j$ Z6 C7 f3 j; v- g' ]
  b( @  ?7 [8 C0 F
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);$ g$ y: o/ F7 N
vRsinfo1=MyObj->GetMeiLei2("qq",1);; x2 w' ?$ k) U0 w7 n/ l# @
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);* Q# V; e" u# w
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
* b% h- c% B& ivRsinfo1=MyObj->GetMeiLei2("手机",4);& C3 z3 E% V% ?( z
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
! H5 Z+ Z1 `8 _" D0 s, b        return 0;8 t5 v) r* k$ x# q% S- p
}6 V, V. ^( y& J! h
+ F8 ^2 J6 k; s% h4 H  a
HRESULT ComInit()7 A/ h. p0 l' n$ f: ^( j
{2 E4 c$ @; j7 U0 R+ ~( }! t% q& ]
        HRESULT hr = S_OK;+ m- ^7 \0 o5 A
        if FAILED(CoInitialize(NULL))
% k( J# Y7 N0 u& O7 }7 K9 K2 `) ~        {' ?. |+ V8 a9 k) j% K! Q) z
                CoUninitialize();
3 T" s/ U, _# R                hr = E_UNEXPECTED;
8 _; V! z4 c/ Q7 r; |  L  \        }
1 z/ V! Q  E6 g3 Y        return hr;- G( n$ o. `3 r# m7 _+ l6 P; m4 n
}
- {! F& v+ _6 E1 p. j, O3 H! n9 Y+ h( M. I

9 \: e* P, B8 g) Z' N#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
) L$ r4 X7 `& M: |6 @! L2 ]$ E9 U+ @6 S
4 E1 ]4 X6 T6 k. F- w2 }
* e4 T% w9 E. J8 t& {3 Z* M
5 x0 r) E% p+ R0 ?. ~& y: Cstatic int report_error( char *file, int line, char *call, int irc)
' j& S7 F4 w; V( n% R0 l{
; i/ j, ?+ U- ^& _- P- f    if (irc)8 s7 D9 u( U1 _% @% S% S
    {! v" l* |  c( s% }' T
        char err[133]," Q: d" y$ I! Y5 ^
             msg[133];
9 Y' p% }7 m8 K9 i( |( n- P
- Y5 X  O: D0 d3 N" y/ M) n2 o  K3 d        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",1 e# O  t% J0 {# p3 G
            irc, line, file);4 l1 G! P+ q  @) {' S: x' B' k- ]1 L; N
        UF_get_fail_message(irc, err);
# u4 g- y$ n& C* `6 w; [, g
5 i5 G- C3 i! V2 X        UF_print_syslog(msg, FALSE);' {1 F. A, s  d& x9 c/ Y3 Y, S
        UF_print_syslog(err, FALSE);
) a) n: p: h8 @        UF_print_syslog("\n", FALSE);
6 `3 `. i/ t7 [# P: G) |$ Z        UF_print_syslog(call, FALSE);
; g+ f8 W0 L4 c9 Q# C* {        UF_print_syslog(";\n", FALSE);
3 D9 R% ]0 T" t: J1 b8 D4 ]
: D# F4 b( S: Q0 u3 K; K' Y6 I        if (!UF_UI_open_listing_window())
" @& x+ _# E! t1 A5 J        {
: Y& w  y+ T& v! L            UF_UI_write_listing_window(msg);
% o1 U. q& e9 K* h            UF_UI_write_listing_window(err);: N( U* Y3 s: [+ P
            UF_UI_write_listing_window("\n");9 |8 H( {& Y/ w4 C& L: L; q, u) y
            UF_UI_write_listing_window(call);, n, H6 X3 Z* G3 i$ F, s
            UF_UI_write_listing_window(";\n");
) n# h9 W: Z* \, @' p) R' F        }
; ?& w- ~% n. T! `    }4 |& b# ?, I6 q+ E' b  j1 |

& f/ h& m4 v' `$ C6 q9 s$ \    return(irc);
! f; V& I" v3 {+ o9 E; A3 j}0 U& V2 ^4 s/ f. H
! i9 k4 Z. d1 _" Y8 W( x0 c

4 b& y1 I# e* A' r  s& F+ X/*****************************************************************************! o% R" e& F# v7 z7 X5 S! X
**  Activation Methods) y' x6 w  m0 e6 b. N* [
*****************************************************************************/3 d# I: d) i6 i4 A4 ~2 [
/*  Unigraphics Startup
! Q& u% I  Z. v/ n, ?**      This entry point activates the application at Unigraphics startup */) M3 A0 N2 f) g1 C# M, O# }
extern DllExport void ufsta( char *param, int *returnCode, int rlen )
0 r8 D$ y# P8 O% h% B{5 j! h" z, Z: c
    /* Initialize the API environment */  r, j" x6 x! {1 x
    if( UF_CALL(UF_initialize()) ) 6 c9 R" ]9 L8 P
    {
* `, ^! `7 D) z/ p! k8 D& C3 }        /* Failed to initialize */7 F4 H9 {! l% z2 f! Z* i
        return;( L' h( ?! u  N. }; K! F! D
    }
; J- F+ B7 u; `8 p* L7 m+ r/ y5 N3 w9 K$ j* o; [, C9 |
    /* TODO: Add your application code here */
+ c; W: J* q4 T2 _* i
- R4 _) F0 H( b, E2 {7 W) Q, ]4 B9 U7 @* h, v6 N. S
4 O/ T  y9 E4 e1 A6 L1 y
        char b[132]="";
& c% p% k7 x4 i: k        mmm(b);
4 l- O9 n! F! o1 U, n! W        uc1601(b, 1);   //在UG弹出显示框6 Z1 ~8 l/ G" Y
% j; \; y3 ]6 J( O1 s( `

" \7 R2 Q" n+ W3 o0 H3 O9 }    /* Terminate the API environment */
4 Y* U2 M3 U9 n% }4 G9 X. X# d5 i    UF_CALL(UF_terminate());
: o+ G& v8 h/ x  L6 y}. x, ]8 d! b  @, t  B
! p* x& Q: Q9 C2 [
/*****************************************************************************
' u; P& g6 S! v1 D**  Utilities
  c9 K  @& f' L# d' n/ n*****************************************************************************/
0 _2 a- w" ?5 x/ D$ k4 r* |/ B! T1 S. Y$ |
/* Unload Handler
6 v. d+ t4 M" e3 t% O**     This function specifies when to unload your application from Unigraphics.
$ q8 {/ [) }2 a! O% e**     If your application registers a callback (from a MenuScript item or a. N) h" @' f) P
**     User Defined Object for example), this function MUST return  b; f- B5 C1 I% a8 k
**     "UF_UNLOAD_UG_TERMINATE". */$ W# @* u7 a7 ^$ P$ y' ]4 A5 B# a7 r
extern int ufusr_ask_unload( void )" T$ S( A9 k3 F/ E% g, y0 k4 S
{/ L5 m3 g1 n- i# f) U
    return (UF_UNLOAD_IMMEDIATELY);
/ i. M, ^3 X* ]/ x% u}
- n. M: c: f1 b1 x/ a5 h* s8 j( x( M% N* C  ?: G* k6 b6 J: |
' g7 {6 V9 h& ~, b( |6 n/ k% ]

& n8 D3 x) u4 `6 \$ W" b7 y! A9 U. m& e5 C( X8 F

% b. k: F; H9 @/ m; M& R
: g* H$ @7 l. Y+ e) J# l$ k9 L" ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了