PLM之家PLMHome-工业软件与AI结合践行者

[原创] 在VC中调用VB编写的COM组件

[复制链接]

2016-12-11 15:05:21 2809 0

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件! {, D) Y/ B2 N6 k6 g! ?
% m# s: `7 g- m5 ]
★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
) D2 z9 Z1 Z6 S, ~7 @) D: D. d$ Y& Q1 j8 I: J
vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册& J$ f& Y9 a* S- |+ I/ q. C$ ]
; k) `( C  I6 y; U# ]
=============================================================================
, }0 D; T9 X4 d% B: m4 K在VC中调用VB编写的COM组件9 O0 I7 y7 Z' t9 G5 P

' J& {/ F) ]7 k6 }梅雷 - QQ1821117007 " u  \% P% r, n* g5 Z  V8 j
亲测 XP、win7(32/64位)可用
4 L3 l3 q) P5 A4 o; N2 {+ a- P% g9 c. o1 L% `9 Q
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。8 f1 @1 r) H! T$ K7 t+ z0 t! I
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 0 v6 m  Q$ S' p$ P" |
先说说VB开发一个COM组件。
: Z1 S$ `: p/ g7 U2 [/ r0 g用VB新建一个ActiveX DLL 工程,
1 T/ s$ h4 I1 \+ l/ n然后修改工程名称为 MyVB " G! i# K  {% v# U8 \. d! e% l
再修改默认的类名为 DEMO % o% P8 t% M# }
然后再向类中添加一个函数作为测试用,如: Visual Basic Code
) \2 `# {! H- r. v- Q8 F
( B3 _: m8 _. h4 W; J6 ^注意!工程名不能为中文不然在c++中会出现无法识别的字符串7 I/ U/ x1 b$ G  L  a- e) n

* `1 f9 z. i0 F4 e: W: @' o4 R; p- f& v5 A
& V$ v2 ~( x/ N' u
Dim str(999) As String# K0 |9 G! V7 M! u3 }7 a

: ~8 z4 m& e3 h7 g% w; b% n, |Public Sub GetMeiLei0() '无参数传递
) [- n8 e# m* W7 F0 DMsgBox "梅雷qq1821117007"
+ m& F; f2 t' I7 G" b$ I3 `End Sub
2 p6 M- J# A* G1 F6 z3 m3 @% s' n" w- o! Y0 [) O
, H. h5 x5 Q+ H: T" [
'带参数传递   Public Function
# m" J, M1 o3 S) R* hPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
: C& h# f4 I, b2 \2 e1 S! nstr(n) = str14 j3 D* w5 f) ~+ {5 L; R
8 u  U$ U3 [, H* x7 c1 Z* ]9 L
If n = 5 Then
$ }- \4 e" {1 X) I) \6 LMsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
1 x0 s; B- A* qEnd If* L$ L5 x* y& u8 K
# ]- V' L5 j2 l, ~! h
GetMeiLei2 = "数组传递0") Q$ G+ ?8 |6 T. q% [  Q- E

  |, B: K' L4 ?) S: K2 U4 X/ g) mEnd Function$ f6 c& i9 s2 K; b0 M7 r8 m; @8 ?! p
3 o# H. k. v$ H1 E: e& n
2 h# I+ Y# W. U& X
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 - s4 }% N" n' }( w7 t' A! L

5 [) Q* B) N* \) g4 c+ S注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错
# |- d2 d! B" Q1 r- Z4 ^" n
+ D6 M  o; r% Q" c6 ?. \; R! x; B& {' ?0 ~
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称,
, L/ u- z( t, p3 e! X# J而 VC 里调用可以这样做,如: 8 n' O+ ?" O$ m/ f: X3 j
Visual C++ Code ) P' B5 N# D7 l9 n5 D- a

, \2 I0 K% M) \$ m% u) `//新建一个 UF程序,输入以下代码: d8 x4 N: I" _* v# y
/*****************************************************************************7 g; p/ f& L  ]5 _: x8 D8 d
**/ ?9 p5 Y) ]) ~& S6 f
** C++调vb.cpp! ^8 i& E8 }$ Y& j- ^0 C* A, j
**
7 g1 f" U  \5 X: X** Description:
+ L' M2 G9 o8 X& Y/ @" M9 ~**     Contains Unigraphics entry points for the application.; U/ ^" _6 i8 \
**
% R. h' i1 e7 V/ t& ~- q*****************************************************************************/
5 ]4 I$ v, T6 Y# v( r; N% E* x, ]4 M5 x& U# I
/* Include files */
' h: {8 h# P  h+ A  ?) H0 ^# ~#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
' ]% `5 N0 m+ W' F6 J6 m#   include <strstream>$ f  _5 @* g: r# z& e' L
#   include <iostream>% i7 j4 r; J. P5 X! j: p
    using std:strstream;+ J7 P( Q* Y- ]$ s* ~! B
    using std::endl;   
0 q, b1 l" r' j& [$ V' l& c% L    using std::ends;$ L; X# Y8 O1 S7 q2 `/ G9 C- }
    using std::cerr;2 H% ^$ H0 m" V$ G: I
#else( \, l7 g3 R/ R) _! x% A; }+ O6 @
#   include <strstream.h>
$ N) l  Q7 X# u' E, I#   include <iostream.h>$ A" T& i! ]2 z/ W
#endif4 @; q+ L. c7 B! E8 M+ _
#include <uf.h>
, b6 r( j9 k. D" E1 O  _2 B#include <uf_ui.h>
7 l- `  t1 Y/ `9 a5 R( g% i+ X# H#include <uf_exit.h>8 y* U: K; D) o
#include <Windows.h>7 K1 U/ }$ a0 v% h5 p& I
  F( T: m  d7 E- F& _9 r$ q) d
#include <string>! S4 b2 L5 }6 ?% m8 N. i9 P
#import "C:\MyVB.dll" no_namespace- \: y2 V$ ^4 Q5 I
//using namespace MyVB;    //这里是COM组件名称
' ]% R2 R6 s, p# Q6 N' y  v+ X0 w8 X5 X6 I
7 m' w, E, h1 F; J& x: o
HRESULT ComInit();
2 h" a0 }8 F0 D/ l" bint mmm(char* str); Y, K: q3 Y+ i1 R, ~# }" T
{
9 X8 z; F; E! z+ z( L/ S3 e        ComInit();
- i$ m- y: T) _" u6 ^' e
% K- f( d  L: D6 @7 ^        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象# Y; W+ l) x7 D: L
        MyObj.CreateInstance("MyVB.DEMO");5 o, A0 W' E. z3 d* j

+ h, }( t$ J, V& r        //MyObj->GetMeiLei0();//无参数调vb函数
% e6 t$ @# y* S, u
- I9 t, K* Q  @2 [1 z0 }. Ichar str1[132]="0.0";9 ~; ~% b' A* C

2 [4 o. j) d  C. Y9 ?int n=5;
! G: q, y0 ]$ C& {
* ^; V+ x( u' \_bstr_t vRsinfo1;* u: _' I1 }$ Q# J9 E3 y/ u

5 `: L4 ?1 Q% w0 u% n$ }8 MvRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
: x- t5 r6 H/ S4 k; }8 l$ Z0 e$ m4 @! p' J
strcpy(str, vRsinfo1); //字符串赋值1 p) @. u! T3 D6 y) B
& ]& V" P. W. p3 @
vRsinfo1=MyObj->GetMeiLei2("梅雷",0);
+ ~3 F4 R. k$ BvRsinfo1=MyObj->GetMeiLei2("qq",1);
* O* c7 s. R2 P9 m3 IvRsinfo1=MyObj->GetMeiLei2("1821117007",2);
/ i! W7 e1 e6 _. k) QvRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);( S% g8 K6 v3 i  L5 \# ~/ Q: s
vRsinfo1=MyObj->GetMeiLei2("手机",4);
; ], C% K" K# F) F: `vRsinfo1=MyObj->GetMeiLei2("15757753770",5);
: j" Q, r+ p2 A* C0 H+ i        return 0;
3 A, V& S# M" O! ?8 F}3 ~7 P4 D# ?% \) [
. V1 h/ g+ q' j3 o6 F" R. ?7 A
HRESULT ComInit()1 J+ o4 \3 [$ J  q' n
{: N1 N& P/ `" E7 T
        HRESULT hr = S_OK;) w8 U; V7 G) F$ T
        if FAILED(CoInitialize(NULL))
# T5 y& J9 z7 ?/ y3 u! o# c        {0 u, Z5 ^5 o8 W# z8 x; y1 E, g
                CoUninitialize();) t7 |7 R1 P. L
                hr = E_UNEXPECTED;
1 t$ V0 F" P* w$ d: n; {% L        }0 a" G* V0 f& ]1 |- q) u
        return hr;
% N! b; U/ G: c, i# D. _}
! Z, \) v( x8 [% M4 d1 [' `5 P
8 n" b! S1 D) l
! z8 y7 W8 y( c' A" f, t. w. u#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
  z1 S% d# ?# d# Z6 {9 ?+ n7 Y  [1 P6 M

/ h; C  C) ~; J3 v3 }8 }8 _5 ~+ k3 s* ]3 p
static int report_error( char *file, int line, char *call, int irc). n4 ]! N# R, n" `- }
{  {. L; j4 b1 P4 d
    if (irc)" @% ~2 Z6 F6 i2 }$ s' y
    {4 V8 T  o% N8 @
        char err[133],4 z  G- N9 w/ Y0 I
             msg[133];
2 e2 z% b) g  M3 i% T0 L/ V4 [, K
        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
. ]: B/ z& J( t, X0 `            irc, line, file);
/ E, Y6 P+ Y: M+ P) [1 a9 g        UF_get_fail_message(irc, err);
, L' R+ R& j. L2 P7 Z  T" ^7 a
4 Y, @: D7 }/ G0 h; q% d        UF_print_syslog(msg, FALSE);
5 G9 C2 z  d  d" ^* y$ x        UF_print_syslog(err, FALSE);3 D1 `- j7 f6 P# I  v' p
        UF_print_syslog("\n", FALSE);; J! m: K0 D: V' B
        UF_print_syslog(call, FALSE);) W; S, Y7 g/ K
        UF_print_syslog(";\n", FALSE);! r7 Z+ k5 D) N2 F% d! l
5 D7 a  J& z) A' m
        if (!UF_UI_open_listing_window())! b. [; G$ c: g9 s7 F" ~/ i
        {
* ]! Z- |. N3 n2 o5 J  B+ o3 m            UF_UI_write_listing_window(msg);
2 \  g- K2 A) K1 z) ]' G) F            UF_UI_write_listing_window(err);8 n# O2 P. V3 b: l; ]( p7 y! c- O
            UF_UI_write_listing_window("\n");( v2 m" c$ R; s* ?) ^
            UF_UI_write_listing_window(call);, T& |( j9 U0 v  z
            UF_UI_write_listing_window(";\n");$ k- F0 g; P* {( b. Y9 @
        }5 Q9 r7 l4 t* J( p. N
    }2 a8 o% w: B0 S0 H
3 H6 @0 N9 @7 A6 l2 j$ [9 \
    return(irc);
' k$ p1 X% d9 S/ j8 A}
3 f- l, k! a3 w( S* N: i3 j  y) a+ V8 v
+ o$ l2 d! Y- [. [" z( e
/*****************************************************************************8 I4 _: i6 A% K% G' R2 ?* x
**  Activation Methods
2 P9 g0 }7 a+ t- A# o# w*****************************************************************************/
1 [6 y% E* G8 o% E' I/*  Unigraphics Startup
3 S7 n% b9 Y" Y2 h* L**      This entry point activates the application at Unigraphics startup */
# O0 c7 W* b' m! yextern DllExport void ufsta( char *param, int *returnCode, int rlen )
% ]3 R+ P, n" T" Y{5 u- V% Z/ H: b- Q- A
    /* Initialize the API environment */
1 ?* _1 k3 ^6 r5 N9 v! O3 @    if( UF_CALL(UF_initialize()) ) $ r" H$ q9 d$ K) A+ h$ h
    {. G4 g+ q# K' w- `" a; U
        /* Failed to initialize */
3 ~! S7 ^0 @9 |* }1 @        return;4 s! _+ A& f: M5 \# g! ^
    }4 G2 Y6 _4 O: X
3 j- j* r7 p8 r1 h$ ~! u; _5 I
    /* TODO: Add your application code here */- g! Y5 R9 Q7 _" o+ D: j
3 h  c- R- J" s6 \  B; v3 \! G$ Y

& [& l8 q$ ~1 b8 b5 E3 h+ V0 {8 Q4 r4 A/ r8 O# p
        char b[132]="";. [& ?% E) Q# O
        mmm(b);
+ \1 R5 Q! z+ q9 J0 k+ d7 W8 E( x        uc1601(b, 1);   //在UG弹出显示框
* D  k4 W% e& X) [5 |. a8 \0 N! O5 t+ D/ w# A! J0 ?

8 V7 y8 H. H* Q7 ]5 O6 c" q    /* Terminate the API environment */
# s. A, h; ^' {0 ~$ Z, j4 F5 ]# C    UF_CALL(UF_terminate());
9 g# `( _' z5 D9 f! m}
: J3 _0 Y& d5 F) t4 ^
, w/ j- `9 e; g, u. S/*****************************************************************************
9 E" T" Z& ]# q**  Utilities
6 C* s% x" }" Y& k$ \; j*****************************************************************************/) Q9 B5 A3 h. T) [3 j$ y

1 f$ A+ H& L% h/* Unload Handler# [+ }, h+ t8 J$ C3 ]8 s
**     This function specifies when to unload your application from Unigraphics.
* x$ A  {4 \; x**     If your application registers a callback (from a MenuScript item or a/ v) b0 }' B. ~; y* H7 I
**     User Defined Object for example), this function MUST return$ ^5 ~& c3 D1 B$ @! v+ ]
**     "UF_UNLOAD_UG_TERMINATE". */6 q- |0 k/ T1 i& |
extern int ufusr_ask_unload( void )& Q! M3 o2 `) a: A4 _/ X
{- S3 C+ F" ?% B7 B0 S: F9 N% N+ ~
    return (UF_UNLOAD_IMMEDIATELY);3 K  U! c, Z+ G
}1 I  h- @' i7 @0 `3 \3 Q8 i% o

/ Q$ w9 G# }' {! @' f# i. w. N1 P& C! J1 D4 }
2 _' w, _: e+ P7 _% I0 Q  Z) P

7 o$ G3 l* ?1 v! h) d5 W( Y7 t0 \/ A( J/ ~
! I- W/ i7 N: M' o6 T* a# }& F
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了