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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件6 b3 B  }7 v' e( k7 `

; B! E2 `9 u) m8 S★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用5 |( A' E7 b5 x: h; A3 g
1 B, t" z$ O1 W) h, d
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
& A$ T6 B1 H& a, K6 _( i4 n  |: y$ ~; X. j5 `1 l) N
=============================================================================
8 X1 `8 m0 L6 w7 y8 U; S在VC中调用VB编写的COM组件4 `' m8 O/ E% n" P9 b2 v

. ]4 k5 K9 X3 {* n3 D% c梅雷 - QQ1821117007
! X0 K1 s! b9 ?% y, B% |亲测 XP、win7(32/64位)可用
: b6 ^/ Z1 z8 }( f/ S, b4 H7 e  a( E: I" h
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
+ a( S" s/ r6 }/ }3 t6 D/ I+ k4 c为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
5 t' W3 r6 n# A! ^1 a" `先说说VB开发一个COM组件。
, n' i5 s, l) x1 y( Y2 C; X" u用VB新建一个ActiveX DLL 工程, 1 g0 R& k, C7 z6 |
然后修改工程名称为 MyVB
4 s* H9 Z/ A* H4 x+ V0 G: |再修改默认的类名为 DEMO ) A2 P  o. L7 N- f
然后再向类中添加一个函数作为测试用,如: Visual Basic Code6 w% q1 i0 k; S2 v
4 t" J- t: _% l1 K% E. E9 H
注意!工程名不能为中文不然在c++中会出现无法识别的字符串
8 [4 x$ Y9 t; L3 ?
9 q+ \+ E5 V; f6 X
# U) S' y1 P8 o) n2 g# R: g0 r0 B. v
Dim str(999) As String9 h- ?! P- r6 l( P5 m" Q; r

% z( }! w% e% D0 S) [6 J$ L0 h* y- }Public Sub GetMeiLei0() '无参数传递
! [& J4 \- b1 m& d6 P5 ]' HMsgBox "梅雷qq1821117007") M% r$ i1 ~6 L% P4 p2 T
End Sub" L5 X1 w4 F3 e/ y

3 C/ Y. B/ ~' g; Z5 R  x( _
* p6 @9 f( m. S- w4 z6 ^3 j'带参数传递   Public Function3 {. q5 [' `  \# d
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String6 W9 s6 U# K" N/ s+ O# M
str(n) = str1( k1 `+ P- j0 z) q, E

7 b3 `  D1 V8 _4 `$ k+ Q  G) Q4 b, RIf n = 5 Then
6 ^4 W' l2 M9 ^: F& }% yMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
; ~* M0 ?& w: W( ?End If
9 l6 b. R6 B5 U" Q& g* D
6 J0 \% c  H& n) Y! bGetMeiLei2 = "数组传递0") ^& d* L, j' s4 y, r8 E

0 B- N! A2 ]! q' ^' a" {& _End Function
# _/ L' f3 J/ r, E5 p% V; N1 i9 X
, H1 N2 p* n' A
6 z* i" Z3 L  o  p6 j1 r然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 ) U0 h( K3 O% C% M

, u& M) ?+ @* J) O注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 ! S/ I/ O0 i2 y9 ~

& w5 C( c& c7 ?% A
; P* F" m2 [$ i5 x0 x1 c6 H& s6 @$ f) V8 Y其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
, V( T# S" ?7 o  K' ]而 VC 里调用可以这样做,如:
" ]7 \/ I, N& I" ~' A* g3 yVisual C++ Code
) A& r# C$ q/ G" {+ ^9 ~
/ n" L" l& `: [8 i: d( j//新建一个 UF程序,输入以下代码
1 }& [# R! o/ m8 j" P( `8 s; c. b/*****************************************************************************( [8 c# C! u0 P! K7 ~+ ~) k5 u
**" i! D8 M/ H8 c" b6 z
** C++调vb.cpp
$ u! j) F* D; c0 F) G% r1 c**1 W% B, d7 {9 j1 ?
** Description:
; b! k( s, P/ _! U8 p. i**     Contains Unigraphics entry points for the application.
" E" k6 g. V- o8 N+ Y" ^# ^/ }**, ]& }0 {2 [) L# F1 @7 K
*****************************************************************************/
; C- y! T. C8 v/ {  P1 t" _2 N% g0 a9 {0 ^7 X& q/ S
/* Include files */
& C) A! O4 J( C" u3 c#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )+ ~2 B. W5 ]: A3 p
#   include <strstream>
, z0 t* B5 w9 h( ~4 r. x9 p% [6 g3 m#   include <iostream>
2 l% `: a: j, ]9 j    using std:strstream;
5 G2 l/ A0 {; S1 g8 S- [, M    using std::endl;    + N/ ~3 t8 h- s! [% ]% P1 `
    using std::ends;
' t! c; S: r; w1 m% C( j    using std::cerr;4 M6 w. ^7 ^; p$ l# a6 y, Y& z
#else5 k7 ^/ J2 {1 L; v- @# W
#   include <strstream.h>
- W$ Z0 t) n. ^( e8 G#   include <iostream.h>
/ }& d# C8 ^4 f1 G4 K" E8 l#endif# k  F; O0 L* s
#include <uf.h>( Y' K4 I: x# P! g! o' O, m0 i
#include <uf_ui.h>& K5 ~+ f2 `9 ~1 m# o6 `
#include <uf_exit.h>3 \. c* A  E1 Z1 u% [! H6 b% Y
#include <Windows.h>
4 W3 ?- {8 Y/ i+ Z& A  T* b. d6 K
+ @2 |, G9 @2 l5 z#include <string>
/ V% |, E: p2 F#import "C:\MyVB.dll" no_namespace: [% P" N$ N* u' m
//using namespace MyVB;    //这里是COM组件名称
% |! r6 t9 _7 \% B! R, B4 Y4 R# r' P1 p( i5 V# n( Y, M8 I

/ H! H; D- j# SHRESULT ComInit();
$ H1 r" K( P, `1 B8 mint mmm(char* str)3 Z2 M$ a0 H, z4 w4 p8 D( G- U
{: S( p- K" \+ e4 k. r# @' ]# N
        ComInit();+ l: D, Z, s: H" v) [! |9 G7 g/ s; m! p& p
, z; X5 _2 |, u! z7 D- v
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象# f/ ]1 q' Z( ^, _/ t) v
        MyObj.CreateInstance("MyVB.DEMO");
6 U9 O. A1 Q) l5 Y% n: c, k. t# h9 x- ~
        //MyObj->GetMeiLei0();//无参数调vb函数
# d% F6 P, c- O
. P4 v  [( k8 i5 c! qchar str1[132]="0.0";
" P% r# ]3 K1 U: Q! a
; C# V+ |" T6 a( c* Iint n=5; / [- e! |3 O' ]+ I$ d- ~. d

5 D2 b( D( k, X1 z_bstr_t vRsinfo1;! p% L; T9 p; x0 m) j. S7 ~) |& x
0 S7 R6 q' U4 Q+ x6 z6 K5 I2 V9 z) E, u
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传4 \6 m% s5 d3 Z) H  j3 {
' l" D. G5 y  I4 W/ Y. r; G
strcpy(str, vRsinfo1); //字符串赋值; X" L, k, l- Y
) N0 ^7 H. W( x. s+ u2 I
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
& G. o7 D0 |6 e+ avRsinfo1=MyObj->GetMeiLei2("qq",1);8 Z& \/ Z1 R6 p8 I4 D
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);; ]! Y5 u- X+ {9 n0 M
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
0 h8 o7 U( ]$ ]( I/ H1 t5 IvRsinfo1=MyObj->GetMeiLei2("手机",4);" Z" c3 e$ y& Z$ ?
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
2 h  k) R+ `( f5 x6 N' U. r  u' x5 x        return 0;) e8 o: J+ c' V$ N2 l8 N) Z1 g
}* Q; z/ ?! G+ e  ^9 t5 E

0 b+ e0 U! _; V* lHRESULT ComInit()
% a/ G3 E9 I" A: [; {{
. W5 S, v' U0 |        HRESULT hr = S_OK;" u  _  N( h6 `: ?4 Z# _1 Q
        if FAILED(CoInitialize(NULL)), w9 V" ~3 Z; T6 |) b/ f( L6 o
        {! i9 h9 Q1 J9 `% o
                CoUninitialize();
" s' z  l; i% f7 j                hr = E_UNEXPECTED;
" s- s$ P) s' ~  w3 I1 {7 p5 C        }! G1 p2 z; H0 x) ~% y
        return hr;% F$ N/ d" r2 P2 R
}
$ w7 R& `. A- Z# \8 J2 H" P+ _/ v+ u) }
0 M3 J: a% u" e% H+ s* [9 T/ y
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))). L$ u8 N2 b4 J' ]4 A

9 ^( }/ g/ D! j7 n2 ?) P
1 q# \, Z" J4 T- E; E" ^4 ~+ e. z- R( e7 N- j3 I
static int report_error( char *file, int line, char *call, int irc)
9 T5 f7 o2 A9 s% ]+ k7 v% |{
/ R6 o8 K4 R0 z2 u6 ~4 S6 H6 f    if (irc)
. B$ V4 p# i, M8 W    {: U% d0 k  H4 I: X3 ^
        char err[133],7 P9 V: i( M3 \1 u2 I4 s
             msg[133];! o: A9 F( W' {, f. X2 G" ~% Z+ @
* m, c7 I& n4 u4 s* O6 P6 {
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
/ M' L/ R: ~! z            irc, line, file);
+ c  u4 j. {* E        UF_get_fail_message(irc, err);% J, U) M& W2 j" y7 p& c6 g! o8 v
( f) t) w& K- h, Q( b0 G8 B
        UF_print_syslog(msg, FALSE);
) R& @- _" i0 t. |) V0 E  ^        UF_print_syslog(err, FALSE);% W7 O  E6 j+ y9 J
        UF_print_syslog("\n", FALSE);% Z. S7 C: }3 z9 c* W& A) g
        UF_print_syslog(call, FALSE);8 X# F* b4 M% k( m; W
        UF_print_syslog(";\n", FALSE);
' j/ _- I! o  u: S5 j" p' u  ?- Y, r1 F" Y5 K& p: j3 x( b
        if (!UF_UI_open_listing_window())
) R5 ]. ^- Q1 ]+ @5 F        {" q( A5 z( p: G9 {
            UF_UI_write_listing_window(msg);) L8 c7 o1 `6 X! E; P
            UF_UI_write_listing_window(err);
  F0 D/ i* t, e* K/ l' o/ [; t' E& H            UF_UI_write_listing_window("\n");
" ?1 u7 R( ~  a4 Z            UF_UI_write_listing_window(call);
, _5 n, Y) B) p& R6 V% H) {            UF_UI_write_listing_window(";\n");
5 y0 W/ K4 k7 l  t2 i6 M        }/ c- Y+ T  u" M8 s% j( y) X* o
    }
; Q; E2 ?+ I3 c/ {' e
9 a; C5 f7 ^1 ]0 M) p7 Y) Z0 t    return(irc);
5 I& g0 y# d$ }}
( ~' m# Q) ?$ h) x1 B/ ]
0 y7 k* c" n& d0 W2 L
5 L( f( ^( J" ~0 Y3 o: u( u/*****************************************************************************2 H' {8 M- @+ a) G
**  Activation Methods
% X/ s6 X7 o6 S8 U4 W8 V*****************************************************************************/7 K8 X& {0 Y1 i
/*  Unigraphics Startup
2 L1 T3 {% C0 m# ^' `% a- P4 w& [**      This entry point activates the application at Unigraphics startup */( R4 J+ R. U+ g1 W. @6 L
extern DllExport void ufsta( char *param, int *returnCode, int rlen )/ E3 P' q) w( P4 S0 Z
{" W! o! {  l, i7 [/ u2 E0 O! G
    /* Initialize the API environment */
9 d9 p, r; ?1 }+ d    if( UF_CALL(UF_initialize()) )
( J* a" \- Z# D1 I7 d+ a9 J: v7 n0 @4 C    {
$ b1 J+ I- K. D/ M* }        /* Failed to initialize */
( L7 R# ~; m; Q        return;
- N# y6 U# E3 m0 X) l    }: B% e2 P2 t. u: L9 A" d. ?/ @

3 C' R- I: ?& b5 l    /* TODO: Add your application code here */
( t3 [4 r7 ^9 s% ]% P: U
% |. `  a) U4 Z! ]! S4 R1 P4 N, |, Y3 p) Q% V! O7 B

2 b' t' M2 L, m# c7 q- O        char b[132]="";; A4 k2 n& }4 a. p9 P0 y
        mmm(b);) L* }7 `, e5 i* R6 a
        uc1601(b, 1);   //在UG弹出显示框
. ]# m, d5 O7 }) ?: B# ^' w
  `! `- r* {/ U+ J# T& _
/ T' L  w. q4 K1 Y0 N3 _    /* Terminate the API environment */* v, x5 e( K) b& i5 d: M$ p  H% e
    UF_CALL(UF_terminate());
2 M# N. \% n' u, G) u}* P# {4 Q, Z. Z( x( e7 w
0 D# V0 \& F2 l' X) e1 h  k. l
/*****************************************************************************
: q+ p3 Q0 w( m4 V2 h6 X9 K3 T**  Utilities. ]1 b5 g+ ~, q' ~1 j- o/ U2 @9 z
*****************************************************************************/
+ u- t. ^) Z( Q- D+ t, M! g' G7 Z! u8 A2 A* p" ^, o& k
/* Unload Handler
; z- Y, \& M$ b/ w4 f**     This function specifies when to unload your application from Unigraphics.
% u9 b# g  L- V& ^0 F**     If your application registers a callback (from a MenuScript item or a7 B, ^" u$ i" i: D! d
**     User Defined Object for example), this function MUST return
4 F( J, ]8 x9 L: l: _**     "UF_UNLOAD_UG_TERMINATE". */1 q& c2 w$ Z! K) p4 ?4 ~; G, S
extern int ufusr_ask_unload( void )+ p. F3 c$ [& N
{8 }/ _2 @4 e! n7 s+ N; U
    return (UF_UNLOAD_IMMEDIATELY);
; b0 w; T" w, F# q1 e$ Q% L}6 [6 O( P2 r5 F$ A
9 b1 Y( J4 [) Z# |
) R5 r# b2 N1 C
% H" Z" Y/ e# z" A9 m! E. ~2 v
. l  ^* N7 C7 t  m. u. b% H

3 f$ x2 M+ s% f) B8 ^& P% k% Y. o) k# Z% v4 R! a8 @
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了