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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
: q% h1 W# }2 Q; O- b  s1 a2 Q; @/ }' e% {! a% Q7 x8 A
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
( v' R0 @) Q( ?' z, ^+ Q2 L9 V
3 l  y6 f5 z/ L: \vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册7 Y; t7 o( n! R

, `& I" F$ m: l9 G=============================================================================( c( w) s, q, O9 ?
在VC中调用VB编写的COM组件8 u' C% Y# z+ _$ R

& u" c. T7 {# H# R, i梅雷 - QQ1821117007
1 r" I! z1 l8 ]' J# X亲测 XP、win7(32/64位)可用
# `9 d8 J2 ?3 l6 f% T/ E* b% w2 `) m
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。7 }) q3 r, o* `9 |. p  }
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 6 p' U  S1 g  h2 M0 n; B
先说说VB开发一个COM组件。 * q2 F, @" X8 p7 Z% v
用VB新建一个ActiveX DLL 工程, & r- f" P' r7 m$ @2 C: A
然后修改工程名称为 MyVB 9 r" w8 a  Z* |
再修改默认的类名为 DEMO
# {8 n# |1 p( U- _然后再向类中添加一个函数作为测试用,如: Visual Basic Code2 z1 h9 W5 X) K- r4 Y6 L$ r# x

2 [8 W: J, k5 y+ F; {( R6 S, o注意!工程名不能为中文不然在c++中会出现无法识别的字符串6 {* j! x  Q- p! `( k7 r
6 A2 ?% Y: o! X) Q' J2 H& ]/ |# b
* L, e" @, n& K6 s8 D! o1 V

  G+ j3 _! A2 X1 g$ J/ x% Q, dDim str(999) As String
0 T- M- `! c1 P2 k/ D+ F. o. ?" }5 E8 I. g1 k5 A+ Z: c6 v
Public Sub GetMeiLei0() '无参数传递5 Y  Q* {/ {- J' `4 P' S
MsgBox "梅雷qq1821117007". \. I/ P+ H5 V( y) f- t
End Sub
* H5 q# A' n: z1 a& }' w
' b* D* A+ d4 L3 q: Q9 [/ V! \  Q0 G+ t+ A, t; P8 T
'带参数传递   Public Function
! [/ D/ y5 L; A% m6 pPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String- G; G( T: b* y* R/ e/ j1 o. p
str(n) = str1
1 k- I! {% f9 \8 [$ D6 l  |# ?
( Z9 w& x6 s9 }If n = 5 Then/ ~! T, S' b* _2 A/ Q
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)$ ^, H( r" N" X; a- T+ f+ J1 p1 C2 @2 n' n
End If
) ?9 ?: Z9 W' H
. `( R: R$ b$ RGetMeiLei2 = "数组传递0"' p6 I6 k0 ?, a( v4 Y# K
# S1 R3 ~' r- d
End Function4 n' P! |' n: j6 W8 B& L, B+ p' e

" R0 c7 s/ D7 T' b  c3 X: @. v# O! g3 a4 o3 }. ~0 z4 L& i- j3 b2 E- I5 {
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 3 n: ^  c9 i1 E( I7 z( ?7 q+ S
# W  k+ z! @" T. M! q
注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
+ L+ j% n, d  K7 N" i/ o' ]
2 T; f  M5 J/ m5 r. K  _6 l( c+ K6 p% a
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
: d8 r/ f) d8 b而 VC 里调用可以这样做,如:
1 M  [4 C) S+ q7 h5 v1 r- hVisual C++ Code - s3 j& J9 P9 |. G

. A/ a4 V! V7 @- p7 g2 f//新建一个 UF程序,输入以下代码
4 A/ k5 [$ ~9 A0 r6 F/*****************************************************************************
; [$ h, P3 k! K" n**3 Y  n6 K7 j) C; C9 n9 R5 n. [
** C++调vb.cpp
: S+ P5 q* Q9 k8 d**! q  D9 k! A: q! W+ U
** Description:5 G' T" [- P+ x6 ~) z! m& I
**     Contains Unigraphics entry points for the application.
  G$ U* i( d3 m4 L& z# v1 k) x**
) c( r! g1 y" D- z+ J. U5 ]2 f*****************************************************************************/
5 J) F4 m2 B2 T5 ?. _/ A' Y& g3 `5 I- n
/* Include files */
4 u2 }8 m/ Y2 `2 T* M7 E) [  v#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
& E3 o4 x9 i# ?8 f# V3 F; l2 Z#   include <strstream>
" {" j' _  L; i! Q#   include <iostream>: T% T# E  X6 l$ N, P' f
    using std:strstream;. p8 ^' b( g- ]% i! n1 X& q
    using std::endl;    / U9 S, r" e2 d
    using std::ends;
, h: M# ^- l, \. O; O3 d    using std::cerr;
5 Z* S1 W6 i7 b, u/ p, I0 Q5 l#else
4 A3 w& p' c4 u8 t' s#   include <strstream.h>
) w5 A* \8 b9 [; W( O#   include <iostream.h>2 |! ?8 l. V* u$ r* L- C  A% `- \3 T
#endif. x: K* D* r% o
#include <uf.h>
. k, M( @" W- F, v#include <uf_ui.h>
6 o: u- H6 t. [4 A/ ?9 i' x' _#include <uf_exit.h>
$ }# K9 l7 G% U4 {8 q2 ?7 r#include <Windows.h>$ W. m" ?' ?% X$ Y/ r& I
! ], W; ?1 G3 X
#include <string>8 {& m- K( S/ T1 I. y
#import "C:\MyVB.dll" no_namespace8 |* v7 r  D- v
//using namespace MyVB;    //这里是COM组件名称0 }: g: Y; @" f8 p4 L
: {1 l6 o# ]; P/ d5 u

+ J' j1 A/ n4 @& K$ j, j# hHRESULT ComInit();
3 T+ E" H- u: X/ X4 Dint mmm(char* str)5 Y9 P8 C4 |( y7 L* a& B( y) M" @
{
( B2 z7 _: f' ?" O        ComInit();
$ A' W( B- u3 r* ~* X/ L+ X
1 X: {0 O: x/ a( I        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
2 C/ A/ H9 |9 ?) e& y* J+ |/ D4 V        MyObj.CreateInstance("MyVB.DEMO");) a% U% X4 E3 s1 d. k

7 j, e) G! h8 W! L: Y        //MyObj->GetMeiLei0();//无参数调vb函数
$ d4 k* t1 D- e
2 g6 V- [2 _8 V& Z, N2 r3 Achar str1[132]="0.0";
$ S9 @9 R4 A' \8 ~" W' {$ _% F- e% C& H; E$ O
int n=5; 3 H; R% s! w: ]8 ^9 s1 H/ F( k
& W7 Z2 Y$ F2 D% ?3 n7 C
_bstr_t vRsinfo1;
3 o9 b* P( n+ l8 V9 Z$ D
% a  ]+ e; l: V$ ]/ cvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
8 O: E8 f4 k) d1 Q& d8 l2 h% ^* ^8 T- n
strcpy(str, vRsinfo1); //字符串赋值
' K- K2 u( g2 z5 k8 q6 _. J6 d' }7 \" x  U3 k
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);6 g* p1 l! n" [: Z
vRsinfo1=MyObj->GetMeiLei2("qq",1);
3 m  W/ |- j* R9 p7 T0 |7 F3 tvRsinfo1=MyObj->GetMeiLei2("1821117007",2);* C% L3 r3 H5 O; Y# H
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
' ~8 w6 A/ ~. i8 O: dvRsinfo1=MyObj->GetMeiLei2("手机",4);
, @+ k  q1 K0 P/ g, k2 @vRsinfo1=MyObj->GetMeiLei2("15757753770",5);+ ~0 c8 k; g3 t% d+ q
        return 0;
$ E3 \, `# s& G# ^}
- j3 I- H( ^: T: \8 R
" ]5 ^. X' W, e1 UHRESULT ComInit()
- V# S" u3 F% q2 G% e4 B1 f4 B{
+ ?" V. d0 b4 C        HRESULT hr = S_OK;3 S7 r: @" l1 H" a
        if FAILED(CoInitialize(NULL))
7 |' Y* I$ s+ g5 F  b- a" {        {
7 P; v& P7 g+ ], j9 C                CoUninitialize();1 S. [" t& J! O8 g* g
                hr = E_UNEXPECTED;. W( P- T6 e, S) B2 ]1 V" p; k
        }
! U3 l4 G- k) I+ ~1 }        return hr;
$ A9 }# E9 l& s5 }( a}
4 q! `- {( a, ^: [3 E
; ~, O; P5 ~7 ?9 Q' v
& M& n$ v7 f' ~#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
  N7 H: p1 N, T, t+ M  S& i% y! k% k
5 w7 _6 B/ p% V; u0 k3 k

% `1 y7 a  o; x1 S; q1 I0 Q7 wstatic int report_error( char *file, int line, char *call, int irc)
4 ~7 a0 ?3 x( R( F/ P) x{
/ @0 J# t# n$ }% s( A/ c, n$ u+ h* }    if (irc)
1 n- S5 |3 H3 w$ t3 [5 E% |    {
, c9 N8 T5 g& D! d3 b6 u! Z        char err[133],% U. u* C+ g9 X1 H. d2 t' Q
             msg[133];
+ l, a% k) ?! h
! Z8 k, P! B5 e6 {& {        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",; a" N0 U( m0 R  v3 K$ h8 I
            irc, line, file);
& s/ D; F" ^6 J3 W6 c3 [9 N$ J        UF_get_fail_message(irc, err);
/ H% }7 ~; J% Q) k
- [1 p' P3 J3 p4 E        UF_print_syslog(msg, FALSE);+ h+ N5 v4 T$ q' x3 W6 W$ f
        UF_print_syslog(err, FALSE);; U7 @  k, J- h: E
        UF_print_syslog("\n", FALSE);
, m" J6 {( g  H4 Y' i' u        UF_print_syslog(call, FALSE);
* Y$ S: C! M( B" m        UF_print_syslog(";\n", FALSE);9 y+ Q" c% @$ d  q( V/ n. r) u
( }6 B& S' b4 u$ C: W2 v# f
        if (!UF_UI_open_listing_window())
4 T  m: A1 F( s# P% q, |        {8 a2 B9 G% D' q/ N
            UF_UI_write_listing_window(msg);/ n1 t9 B, @2 q- h7 I
            UF_UI_write_listing_window(err);: [" j) l; A3 v( a$ o9 ]; h
            UF_UI_write_listing_window("\n");: n# N) X2 [. o
            UF_UI_write_listing_window(call);$ `, a! P7 u$ Z: T" l; C
            UF_UI_write_listing_window(";\n");) r' F9 k, D+ d  M7 v; ~' {
        }! p3 A" e$ s5 t( u' L8 L9 y
    }
  E6 O) B3 {3 V) m! a" Z; w5 b8 Z$ y4 {0 O& h# }
    return(irc);7 e$ w8 ~- c( W0 f4 d
}
5 l" E. c! M. A6 x! R# G1 o8 D# a, m: {4 q5 e& Y# i

3 X7 ~) r% s& f! r4 p4 I6 K$ B/*****************************************************************************6 K8 [7 a) k3 {/ J0 }0 j
**  Activation Methods4 ^& D: d8 A/ U% ]% A7 z. {4 l
*****************************************************************************/
4 h; }! _/ s0 z; W; ?. L$ B/*  Unigraphics Startup
: {' i& E" d4 g" R**      This entry point activates the application at Unigraphics startup */
& U; M, m; l" p% ]extern DllExport void ufsta( char *param, int *returnCode, int rlen )
) I! a# ]: l; b{! w0 |) P0 P+ J
    /* Initialize the API environment */4 @: @1 {3 F; i& V5 R+ u- }
    if( UF_CALL(UF_initialize()) ) 1 t/ p  i2 ~1 k% D
    {8 k: R/ L" z" n( r& h
        /* Failed to initialize */# X7 E: h! e# @5 ]
        return;; j! r1 p; [. w/ p0 b- \/ l
    }0 `" s8 j& J. _3 Q& H( h

- k1 a0 M% f  u5 W    /* TODO: Add your application code here */
% L  U8 j" o- `) E
( A. M5 A- F8 N( a+ _
9 H" \, s' C6 x6 c' ~* L6 `4 @$ l* P
8 U0 [" _" {6 }6 w+ i' F        char b[132]="";: g4 D; e: w+ G+ J
        mmm(b);
3 Q" S; p+ L1 b        uc1601(b, 1);   //在UG弹出显示框
& f1 a! \; ^, u# @! w% A# a0 l2 ~4 D

: |% R  Z' L( h- x: [( o* @    /* Terminate the API environment */
4 C4 Y0 |3 r2 @- n6 l8 g" y* p    UF_CALL(UF_terminate());+ V( M5 A8 b- m
}
! T, ?: I9 f. \2 \: r0 F, V; s4 ]3 M6 x  a" V' Q4 F5 v
/*****************************************************************************5 t8 n; }. q/ Y* G: L
**  Utilities0 x/ K0 e- V% F  g1 Y
*****************************************************************************/. X7 A! `4 n2 ^. r4 ^0 p& v/ e# d

+ ~; X! o3 b) y3 v$ K/* Unload Handler' D, L8 n  p- _- S
**     This function specifies when to unload your application from Unigraphics.; {+ u; \8 |$ n7 s+ K8 N. |
**     If your application registers a callback (from a MenuScript item or a
0 a/ }. _1 ^0 T. y: h) [  \$ a! u**     User Defined Object for example), this function MUST return
& D3 \5 o9 Z8 |3 B" u# l**     "UF_UNLOAD_UG_TERMINATE". */
7 ]* W% g5 `+ i: |extern int ufusr_ask_unload( void )& r4 i$ U, v) p' j( q% r2 [1 ?7 S& ^
{2 |$ W% L6 [; ~1 t2 p- o+ W2 ]' m3 y/ f
    return (UF_UNLOAD_IMMEDIATELY);+ `0 R6 J, n) L6 W* U2 ~" l
}
& a- ~+ O# l& ?; O; H2 }: W$ P- ?6 j0 O0 ?

2 N6 c$ j" o: o2 l7 k5 [$ `) c9 n# d. k: C, J; N# |
  B3 b) c( z  S! I5 ]* ?  [/ v0 `
9 y6 |/ ~# ^" t

: e7 x- x! g5 U1 l* r; 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二次开发专题模块培训报名开始啦

    我知道了