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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件- Z" a! t9 S5 Q4 Y7 ?& O9 @# K

1 I" w! ]& Z( W8 o# ?) Y. `6 c★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
8 V8 g9 ~4 {: K& Q( f: M
" X9 E9 H6 x$ y$ a& Jvb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册% J+ s  q; i' z& ~) }. Q
" e5 g; F& u! o3 z1 U
=============================================================================
  G5 @. x4 s. v/ g在VC中调用VB编写的COM组件2 S% D* l7 m# e2 s

2 }/ z8 B$ W4 f- `3 @8 {梅雷 - QQ1821117007
. T! ~1 [8 u  L  r% J) O. P. @* u亲测 XP、win7(32/64位)可用
$ v2 g5 ~% @2 g! X7 d0 l( O  {4 U# c" l! L% f! ]
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。9 p; Z; S/ F! `) e4 j- x1 `! i
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
( A2 G& W+ z* S3 w/ G先说说VB开发一个COM组件。
& ?. [. x! g1 B& C; v" P9 l8 d用VB新建一个ActiveX DLL 工程,
% S" O$ c1 X5 p6 q然后修改工程名称为 MyVB
- c0 F$ f- |/ I, E/ L% N  W再修改默认的类名为 DEMO - p) C  n2 z0 k7 P9 d! j  O# S& r1 h
然后再向类中添加一个函数作为测试用,如: Visual Basic Code) v* |7 A( f5 \+ u% O6 }- I# u

, j' {  s+ P+ r9 m# h4 ^9 J$ Q+ C注意!工程名不能为中文不然在c++中会出现无法识别的字符串
% t8 w6 B: n4 `9 P( e6 e3 V6 b- Y
; s" }7 }& y1 Q$ g! l- ?$ K0 L' v+ c/ \! T* v( d+ C
3 B) `$ O+ A# V( N( Y
Dim str(999) As String
. O+ l1 V8 ~3 Z8 }5 {! y  E* u+ R3 v+ O- y0 Q
Public Sub GetMeiLei0() '无参数传递" P, N4 y; Z1 v4 ?4 F/ V, F$ k5 Z
MsgBox "梅雷qq1821117007"
+ w: L8 U3 n& v7 u) z' ^End Sub
; I. U5 o' c" K7 A/ a- ~+ c  }6 H4 X- |

- U4 z! q0 b9 `) ~0 C% @* p'带参数传递   Public Function0 H' i2 ]! G8 l* a* b, o* g
Public Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
5 @0 S( D; J6 X( f( O: ], ]str(n) = str1/ g# K" j+ M( P1 A% O5 y& G

# \. P, _3 J* `1 `, z% u  uIf n = 5 Then( y9 R2 X; q8 h
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)9 q1 Q; Q1 G* d6 g- {/ B5 I. f
End If/ s6 x3 g- p; {  T; F% v

8 }/ r6 P/ u2 r) `- K  [8 T% mGetMeiLei2 = "数组传递0"
! b0 \# w! y( d0 W( }' L
: L7 O1 y; u' LEnd Function
5 k% X+ S  E% y, r" y6 A' ^* _9 N4 U0 w/ u9 e( |' o1 y

/ Z$ r3 N, G  u0 ]1 d然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。
6 @5 H+ x, H0 V2 c' }- g
% L* c& C1 D0 L注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 * _8 a7 M3 d. u

( s9 m! y+ n7 Y' D  A: C/ b% P( s+ v8 ~$ B: ^: N
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 0 B# K0 d- y8 [0 K1 D7 t" G; r/ j
而 VC 里调用可以这样做,如:
; j" H) ?) l, e% P1 S: ~Visual C++ Code 0 j1 m7 R: K  b& L

' x$ O, P7 B& M5 b//新建一个 UF程序,输入以下代码0 G/ i, m: s/ z/ P& Q
/*****************************************************************************9 V! ]5 |9 r( f' b2 |2 E
**% }- {  I/ J8 R5 Y3 F9 s
** C++调vb.cpp
" q1 U7 O/ C  U2 c: a**
* }$ B# w# w  g6 ~' N** Description:
: ~  M5 G6 w& a5 O" x% K: a**     Contains Unigraphics entry points for the application.
8 }: L$ K. U0 J1 J* H& C5 h# b2 B**' j* \( y# z4 s' B6 W$ T, |6 F
*****************************************************************************/, a" s( ?8 b# x
9 y6 x, f7 g# x1 Z* ]
/* Include files */
5 h! _7 j( I0 f) b. P#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
4 K$ q, a3 B+ O$ v# F9 f( E. L#   include <strstream>
0 t/ I% Q2 ?8 A6 p" p#   include <iostream>7 y3 ?! I1 ~  z& o7 R& o0 i
    using std:strstream;( e" |: X2 T2 V" g- z& x- H, f
    using std::endl;   
0 Z3 C9 b8 G" b9 {$ q    using std::ends;0 ^* o3 g/ V, v9 p1 s8 {
    using std::cerr;
+ b" ~8 l$ w! k7 j0 L#else
  }8 N1 w. D* ]#   include <strstream.h>
2 Y# Q+ a  o; m6 k6 E: O4 G& y#   include <iostream.h>- v6 B$ k% d. M4 Q
#endif
4 w' M& ]2 p; U4 w. w#include <uf.h>% w( Y& H& ~* M! l/ r3 J
#include <uf_ui.h>
  x; d/ H( f9 \! k! A0 [; a( M#include <uf_exit.h>" B6 O5 C0 _+ S4 g" T, `
#include <Windows.h>) z+ y, Y2 [! M2 c5 ?5 K8 Q
8 m" z4 }7 O- r  ~  |! C! G9 @( ~
#include <string>, s* l  _5 T; k8 _( T$ s
#import "C:\MyVB.dll" no_namespace5 w; x9 V4 `2 V5 p3 x
//using namespace MyVB;    //这里是COM组件名称) z9 _( h( F9 {* o5 Z
  K+ P/ ?% g: w0 a- c- g0 C

8 s1 Y5 m! F* t. \$ M/ {HRESULT ComInit();8 e7 x/ q- y8 A" ^
int mmm(char* str)1 \* h" ?& W# ^6 \9 [+ I
{5 J8 J$ o' v+ q6 G& L
        ComInit();7 f/ W/ H" L  P1 x; C+ N
  m- K5 q- K6 P2 V
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
4 y$ U5 y# J7 S9 K' R# c& B        MyObj.CreateInstance("MyVB.DEMO");
8 c5 |, T7 Y8 G7 \$ w! O* z6 K/ E& i
2 t# \2 y6 H# `* P# u& S8 v  H        //MyObj->GetMeiLei0();//无参数调vb函数4 l4 m$ }. z6 H, q" j6 r0 o

* u2 c4 Y& x; h& X* A: p  W7 X/ m" Wchar str1[132]="0.0";" @6 H( q+ D* Y. }# g3 q! q

% f4 W! h6 `( {( F9 S9 d) q/ Jint n=5; 5 ]$ Q5 i! `% R
$ t7 h6 `1 {. r. o
_bstr_t vRsinfo1;8 D( w/ k2 Y' i

6 z6 I  \" X) M' B0 ~# bvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
: H) F" v- g7 t3 m! T4 A9 r' c# C! s0 H( k. M
strcpy(str, vRsinfo1); //字符串赋值+ ^1 K5 F% i8 c+ v3 `' x8 g
1 f9 Y: [8 ^( M$ E) \
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);2 |/ N/ K$ }! W0 B3 Y0 c
vRsinfo1=MyObj->GetMeiLei2("qq",1);
2 T. U8 P. ^0 I  S, A9 qvRsinfo1=MyObj->GetMeiLei2("1821117007",2);  T+ c/ D$ K* j6 G3 C6 h  e3 ~
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);( {4 h. i1 h! B( F* G
vRsinfo1=MyObj->GetMeiLei2("手机",4);' Z- d" q/ x8 d5 T0 r
vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
+ K& M3 L$ Y0 Q2 s1 }        return 0;8 T. d0 a" p3 t1 ]; Y8 l$ p
}* g) m. C' s2 \4 ~! P
$ x( s/ c9 M2 d3 [# D+ u
HRESULT ComInit()
4 o$ M- U' F9 X/ C7 V. p/ _/ n{
' u: V# `6 U5 g9 w( K8 m        HRESULT hr = S_OK;4 e" g, d# z7 r5 e( M
        if FAILED(CoInitialize(NULL))
) O, H+ u) h/ m5 ]/ v& V" M        {( K0 j; E; z: Y9 a# t  q/ }( b
                CoUninitialize();: O+ Z# T) O7 K/ M6 h' X- B% g
                hr = E_UNEXPECTED;
/ I$ V$ A0 T9 w$ N* I) x! i        }
+ s5 z6 v/ ~7 J6 t        return hr;
2 L- _$ h& [2 c5 a5 A5 s+ j: Y}
* o7 S& l" T9 C) g1 l4 |! S8 p2 [( O) k5 x5 A7 u2 b. h; I

( S5 N3 b' z. O' h+ x#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
, M5 r/ @$ o7 \- B, E/ k! q' i+ H; V( ~
6 a6 H) n) }. i3 W$ u
2 }# G& Y9 M  n- g: d, m& R8 g
static int report_error( char *file, int line, char *call, int irc)# u9 ^& e' u  n5 E
{5 a5 \) T% p* i. i% y1 o, _. |/ j
    if (irc)
  W* N" o8 g( p6 W    {
/ E' J" o2 J9 F# w9 ~6 D        char err[133],+ M: W/ y/ g! ^& ^3 S- w8 m
             msg[133];
& T. d4 ?4 f* A; \8 P! A( j0 ?/ w
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
! g+ n  X* h9 i* G. |4 b' Z            irc, line, file);
2 t, q) B  P3 |8 N4 S  U  K        UF_get_fail_message(irc, err);
7 i/ f3 N& i- [( j! r8 O2 l5 [# B
8 i/ j0 L  h! `! a! _0 |4 Y        UF_print_syslog(msg, FALSE);" b1 [+ L! L7 M) E8 U; |
        UF_print_syslog(err, FALSE);7 ^- }7 t( n9 Q
        UF_print_syslog("\n", FALSE);
' {! E/ m. C, X( P6 r( k        UF_print_syslog(call, FALSE);
  }9 X5 ~! F9 v* Z! r8 ~        UF_print_syslog(";\n", FALSE);, @* j) i0 q. [$ A4 ]* n1 H

% j" G8 q! c: O. ?9 }' E        if (!UF_UI_open_listing_window())% N: f! y/ i* I  M" M9 ^
        {
, C0 ?  C; E! _8 B) P4 p            UF_UI_write_listing_window(msg);
+ C; @2 g; O9 l* r8 f, C# `            UF_UI_write_listing_window(err);' c! j# r1 v9 M2 [$ f
            UF_UI_write_listing_window("\n");5 ~+ [. x9 }3 _7 G" v2 [& b& ^
            UF_UI_write_listing_window(call);
4 ?2 [; C) V) S0 ]- o/ s2 s5 s            UF_UI_write_listing_window(";\n");/ q' ^3 M4 U- ]$ S2 _
        }
9 i9 c; H3 ]4 ^: \    }2 Z% _5 m# a4 P( P- s! |+ B4 {, `
$ s. N1 h2 X8 |
    return(irc);
& T! |$ P8 y2 }7 @}* V6 F+ W% y' `/ G& Y" b
- ]$ }" D: O5 f. L

' w+ N$ ~- s, F- L; q/*****************************************************************************' b* ~- v5 o" j5 Z# H0 k$ i
**  Activation Methods- H. t( ]* G) B% v7 v! ]6 U
*****************************************************************************/
9 e! e1 z0 T, R/ ]9 \4 O5 i/*  Unigraphics Startup' H  H% L1 O# |6 c, ~* _
**      This entry point activates the application at Unigraphics startup */
+ G+ g( k- o8 u/ bextern DllExport void ufsta( char *param, int *returnCode, int rlen )' L: p, l6 Y9 Y  h' W
{& a$ w+ `( |6 a- N5 B: U
    /* Initialize the API environment */$ Y! {/ B# u2 q5 k, B/ P0 u- s
    if( UF_CALL(UF_initialize()) ) ' f3 V  S% Q: Z0 o) Z8 W
    {- c; o5 H  M% s. m! @" d$ i
        /* Failed to initialize */( _9 q9 b0 p! ~0 k7 ]/ Z4 J& v
        return;
$ M8 e  t: R7 a7 k1 S    }
5 V* W" f( O6 p5 V5 V$ d, N$ Y1 t9 o/ M
    /* TODO: Add your application code here */7 A* j1 X6 }' v9 `2 w) t1 k# _& U* t' E
' d" _# e/ O, y& w. h3 D
$ Z" x" }- F; V. {0 ]3 V

$ `  e, S; M( @2 s6 V- A. Z        char b[132]="";  k/ H% F! h0 ^# G% B
        mmm(b);- s# y4 w+ Z4 Y/ i0 H7 i& H$ y
        uc1601(b, 1);   //在UG弹出显示框
7 }; x( @1 {  I8 ]4 p4 j4 ?: A' i$ p6 C& F! M# ^0 D

7 {  W$ d1 v# X: {% ]& F: d! C    /* Terminate the API environment */
5 d8 b; [' h6 X2 E# g$ \7 J    UF_CALL(UF_terminate());
- J8 N  j2 c3 R& n8 X}
/ r$ M3 ~5 H4 k) d( [$ e) @9 W  N
/*****************************************************************************4 b. f/ z" M/ t
**  Utilities+ r9 ^- q% \3 y( A  C# X9 A2 [4 K& U
*****************************************************************************/, q: j: G' H+ d. R; }6 |
# e: r3 p2 k3 g$ @8 y
/* Unload Handler
% B9 `* {2 e7 r; s, ]**     This function specifies when to unload your application from Unigraphics., C- p8 o  c: `' J- q. W- g. F
**     If your application registers a callback (from a MenuScript item or a
; \9 |* h) I" D4 Q) q3 n**     User Defined Object for example), this function MUST return. D% I3 G' M5 D" B, [, \! g
**     "UF_UNLOAD_UG_TERMINATE". */
$ h# w8 z) T2 N! `  q0 X1 xextern int ufusr_ask_unload( void )
0 ~* e$ ]7 Z$ u4 W* _" \{, ]: j- s' ^$ _, x. @$ u
    return (UF_UNLOAD_IMMEDIATELY);
$ s2 a( Z& `& ?* T  H, \5 q}, V. p  d( Y  J+ y& k8 g+ k
: b3 Y  W3 J( Y" O

0 g3 l3 L. m" W, F
+ A" B. V5 n2 _: I# @( e
# ^1 _5 D( d( P$ U* ~  H: J$ x" w+ p/ O  V! r. \7 k( m

8 M; h4 z* N' {" X$ n! J' A4 i
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了