PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 15:05:21

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

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

x
在VC中调用VB编写的COM组件
0 q* d9 ]# p! X! {0 s$ R
, e2 n: {3 P5 }" ^, P& e★调组件时只要程序不关闭, vb的com组件内部 公共变量一直是保存着的非常好用
' M0 _! M# }- k3 ~. C$ G
9 q" V" [3 U5 E& {8 m* `vb6com组件 文件夹是vb6工程 生成 MyVB.dll 用 注册ActiveX.exe  注册
' A* U4 C5 N1 P) K3 [
5 |2 a+ K0 D) r- F=============================================================================
6 b6 i- W& E: z+ o& s. y在VC中调用VB编写的COM组件" [0 C. ]9 z2 Z) t; R4 n) i

+ e' i% f) v: w  H" S' o$ z6 c7 K梅雷 - QQ1821117007
# j  Q" b* I' C( W3 f! z亲测 XP、win7(32/64位)可用. }( A- P( }$ R5 x* T

! R" g: m% V! O# T- `2 ?VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
1 t2 ~2 ~. I, E为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。
/ [9 ~! M+ m8 a4 z; f% ]! e1 k6 }. B先说说VB开发一个COM组件。
  q8 ~0 ^# k% s) `9 A+ {用VB新建一个ActiveX DLL 工程,
& r, S0 g1 x  U2 u' V然后修改工程名称为 MyVB 2 g( q( |: d5 h  _5 y5 \! S
再修改默认的类名为 DEMO
0 E( d' c8 z9 G3 v0 r然后再向类中添加一个函数作为测试用,如: Visual Basic Code: H) C$ j( e! p
- K- d8 j" q* U' V; b) `* l
注意!工程名不能为中文不然在c++中会出现无法识别的字符串' X1 `) C" O7 D1 x% g- i$ S' b
; f# A! ]7 a. V5 d* `

) A. h! |3 P* a7 r2 `& `; Z+ i) u& r! F/ f* Q) P' U
Dim str(999) As String. @! Y6 u; Z' A
3 F. i; z/ v& t" s2 W0 k- Q, y- h
Public Sub GetMeiLei0() '无参数传递* ~5 p( V$ b6 n& k1 v% J
MsgBox "梅雷qq1821117007"
" S# `8 M5 k: [End Sub3 D7 m3 B: n! Z
0 }6 \" y& S' |3 k0 c+ q! e

& B. {" N& e& R+ `, v'带参数传递   Public Function
) y: ~6 F* @3 ]3 o& YPublic Function GetMeiLei2(ByVal str1 As String, ByVal n As Integer) As String
; u, W' B0 ?6 m3 ^4 ~str(n) = str1+ @9 [3 ?; X8 B; B  R
& U+ K9 H) \+ o9 D  {* u; q
If n = 5 Then* |0 l6 K: w& i; ~! @' X" D
MsgBox str(0) & "-" & str(1) & "-" & str(2) & "-" & str(3) & "-" & str(4) & "-" & str(5)
$ o# _! w1 X2 z# r6 L+ aEnd If
5 u" w& D) M' x0 x8 r
1 _* N( \: I: V) q6 S$ B5 T* yGetMeiLei2 = "数组传递0"% K" l; y% {: r2 }' Q- V2 h2 e
' D6 d& @' W6 {3 ?$ V: n6 H
End Function7 I! D: q. X5 D+ [/ B& O
/ s% s7 d3 }9 k  d$ _! ^
. C4 P3 }" E2 Z) V6 o4 D
然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 - O( T) |) }0 l0 ]. N5 k. F

5 J# M2 C7 x5 x% v1 G) e& z2 t注意 [注册ActiveX] 生成的DLL文件 必须注册 不然在自己的计算机能用在别人的计算机出错 ( M9 M! J0 z( u

0 Q3 z* q3 u1 h) K3 I: j1 T2 m# M8 s2 H, `0 W' K
其中,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 2 ]5 S" u2 g, v' P! l- k
而 VC 里调用可以这样做,如:
! \  }! D! ]9 b+ H3 i. o( C6 JVisual C++ Code ( L6 R& b0 q  P) v+ y

; R3 V- ^3 u9 E. W+ i+ s//新建一个 UF程序,输入以下代码0 n2 f: n0 B4 q4 S/ q( p
/*****************************************************************************, C! P/ A& E6 s) V1 V0 z0 F
**
7 L6 s2 z( [. X0 @8 r0 c" r: H** C++调vb.cpp
. a0 K1 p& R# l; s: K: p**
# b/ N* y  e3 W: b' a** Description:
7 r: L. e; y2 h% K+ r" B% Y/ Z**     Contains Unigraphics entry points for the application.
' K$ j7 ^& a) R( @**9 B1 A: Y! S7 {, N3 Z1 @: ]0 D4 h
*****************************************************************************/. z' |0 o3 u- ?( ?- }" ?0 A! }2 M
/ q) h$ Y% Q" g9 {( F
/* Include files */; U, H0 v  z0 \$ {' j, E
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
4 b( k7 I3 C! s) {8 t1 t8 `: K#   include <strstream>
& p& {- f( d, S- J9 ]  d#   include <iostream>
0 D% i5 q% S% L! i$ m1 Y    using std:strstream;
: p) g2 K" _1 T  X& U' O    using std::endl;      g) s# |9 {* U3 a
    using std::ends;+ s) L3 Q" l' H& K; j7 G. a
    using std::cerr;
; Y  Y/ Z: k6 [6 P7 E: n) E#else+ Z0 z1 s/ ~+ w. B1 f8 U
#   include <strstream.h>
6 x6 b" L+ a$ Y. f- A$ i3 h9 [#   include <iostream.h>
/ u+ H3 ~5 G2 l! Z1 O9 N; z4 v#endif" J' p9 `" y1 ^" Y
#include <uf.h>% @3 S# e/ u+ S; c2 E
#include <uf_ui.h>! H. ^4 o( K: ]0 s
#include <uf_exit.h>5 Q/ s" h& G$ q+ H# d5 ^; q
#include <Windows.h>& d8 S- C5 P& M. ?- r* Z! _3 G( V
$ w& u; B) T  a, N0 ^7 d1 W  r
#include <string>
: ~' z1 U9 z4 s1 j#import "C:\MyVB.dll" no_namespace' G7 w$ K9 |7 o6 k. d2 L
//using namespace MyVB;    //这里是COM组件名称
: T, i( ^: f# w) z4 z) a0 J- b0 ^4 g9 W; ]7 w$ e( \( F4 y- h* O9 |
9 O+ g% h+ _9 T6 r
HRESULT ComInit();
, r2 F- L2 `2 p! u( lint mmm(char* str)
) q2 F1 q4 N1 H+ k{6 Z" \3 M8 k! d
        ComInit();
& t; P' X' X% y5 J. g6 G) [: N3 J, H  R2 p% b
        _DEMOPtr MyObj;        //注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
! t& _+ x3 }7 t        MyObj.CreateInstance("MyVB.DEMO");
% v, y' E- O. ?$ h& f7 }" T
3 h& \! O8 g" X' L        //MyObj->GetMeiLei0();//无参数调vb函数
/ y& t& Q9 d9 g* k( h% N7 ^# S5 T/ p, a) q. B  ], E  K
char str1[132]="0.0";
4 x  e: {6 Q3 b" L5 e( z5 t9 q1 U5 ?: d( @- E! m8 q7 `* a4 d
int n=5;
% t' u+ f2 h3 I! w) }6 ~$ [0 o3 e6 l. d! ]# r$ q& J/ b6 u7 n
_bstr_t vRsinfo1;2 g; J5 |/ p" S! [6 \. A9 J
, j+ o) y% d( \8 b
vRsinfo1=MyObj->GetMeiLei2(str1,n);    //调用vb生成的dll 带参数  互传
+ ^* c5 g5 ~: `. i
& n% S) U1 t/ _  u9 B! N) C0 L( b5 sstrcpy(str, vRsinfo1); //字符串赋值* Q. K1 ?" s. e( s1 M; I

' `! l. e6 t1 R. J, yvRsinfo1=MyObj->GetMeiLei2("梅雷",0);9 q1 ]% e$ g, B/ `' m
vRsinfo1=MyObj->GetMeiLei2("qq",1);) d7 {: q! G; g/ k. o& o7 `) }
vRsinfo1=MyObj->GetMeiLei2("1821117007",2);6 u6 L, @9 O, A) Y
vRsinfo1=MyObj->GetMeiLei2("乐清虹桥",3);
( }2 _& H! w3 e2 g/ j5 PvRsinfo1=MyObj->GetMeiLei2("手机",4);
) j  \6 b# {6 m/ f# Z+ `* }6 OvRsinfo1=MyObj->GetMeiLei2("15757753770",5);
5 {; u8 T8 y* p% X        return 0;
, E! i) ]* r4 c3 D# y}
9 ^5 K* ]: `1 Z7 `, b1 f; v6 e$ }, v% i' y3 X1 {
HRESULT ComInit()
5 `. L7 C) q4 T( s{& G% e8 N/ {4 M3 Y5 K+ P
        HRESULT hr = S_OK;4 d! k6 d( W- @7 Y0 n) ^
        if FAILED(CoInitialize(NULL))
7 t! M5 E' [6 s2 {+ n        {
& L9 I( X% F" D. M; r' Z/ K                CoUninitialize();
( N4 S1 V& X( n! W; ^; T                hr = E_UNEXPECTED;5 R7 F6 \3 E* N" \7 e
        }' O) f# k3 z$ Y) d& Y: W8 \
        return hr;5 L0 U6 I1 z3 D& a9 A% {' L- b
}
+ ^, ]9 A* N" ]' n5 \9 [+ j8 _
" Q" [; @3 I% D5 U5 J3 R$ N6 C
8 D, ?8 x" |: r( j' G4 o* K#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
  h- r/ y0 W0 J2 v8 \% z
& W; q5 i( Y6 \4 [. C+ M% l+ y0 j& u8 ~

' H9 G6 P" S2 [7 q4 H2 r/ P% Q# y9 D1 \1 f( Zstatic int report_error( char *file, int line, char *call, int irc)
. H+ }4 Q0 u' M( Q; S4 k* D{" T. m0 f7 f2 V1 `4 P
    if (irc)* {+ T/ _: D* l# R; B, @" q
    {
1 y) m! d. ?2 H; f# H        char err[133],
3 u4 `" k, w+ L8 G3 N5 x             msg[133];' g. ^' N" J2 Y" e* I

3 o8 D6 _$ G; ?/ `% z6 \6 f: _        sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
% r! ]) t. l0 O. q4 `            irc, line, file);4 E3 ^  u- q9 f& ]3 \0 b
        UF_get_fail_message(irc, err);- f2 d6 S9 ]! b3 p( R. l) c

  Q2 F- J1 M, ^7 B        UF_print_syslog(msg, FALSE);
* A3 {3 N1 {" A3 K7 i# M. H8 T        UF_print_syslog(err, FALSE);& l) m  L1 G7 R- `+ ^
        UF_print_syslog("\n", FALSE);9 y1 z) [/ ]3 R& l$ j$ T5 X1 k
        UF_print_syslog(call, FALSE);& U" j# s% V5 n
        UF_print_syslog(";\n", FALSE);
2 c! I. a7 v6 u- K5 _0 [9 a: [: S7 m0 U0 ~$ N
        if (!UF_UI_open_listing_window())
' D5 H( K6 c1 L  n  p        {
# Q+ c  ~! f( d7 {9 L$ y4 c            UF_UI_write_listing_window(msg);, X, P% j$ ]# H! N- {
            UF_UI_write_listing_window(err);" n- g/ L3 I' e5 k; C
            UF_UI_write_listing_window("\n");
, t) t7 n; N0 d! b. T' w: E) d            UF_UI_write_listing_window(call);
0 }& M* o- p4 w9 L' k  o            UF_UI_write_listing_window(";\n");* C/ n- y+ @4 t$ d- n. f$ C
        }
5 D  x) A0 V/ [# ~; F1 n    }' ^  w3 ?+ \! I6 D1 I: a
- t' E2 d+ Q* x0 c# e
    return(irc);
4 @  t0 N5 E( s4 g* u" d5 Q}
! ?) R7 S! Z, T% Z* d/ u& R1 v6 O$ t
: U: t7 `' \3 z9 r8 K/ p6 q
/*****************************************************************************& @  ]  l2 Y+ U4 h, ~5 ?2 s
**  Activation Methods; {% v1 V) u. F! s! I& K) a0 y- w5 ]
*****************************************************************************/& M3 X+ V% M! f, k9 X% G* p, k" w3 W" p
/*  Unigraphics Startup
! n8 u( ~$ l/ e2 \; P**      This entry point activates the application at Unigraphics startup */
2 j) W7 w$ u# Z8 @9 U/ `extern DllExport void ufsta( char *param, int *returnCode, int rlen )
" M. I5 I) [/ u( X' c{
8 [; i# l# Y  B1 T) W    /* Initialize the API environment */
7 x- p' A- N' y: Y7 a    if( UF_CALL(UF_initialize()) )
% e6 _- g! n! i4 n% Y& W    {2 }- P% m  I1 h' h
        /* Failed to initialize */
0 U* X- w1 d& h( ?4 W& t        return;
2 ~% K. b. z( r& F" s. q, {0 i) K    }
( z/ P& n2 ~9 A* `
9 v( s/ r( t. y! K& z/ H% L, q5 ~    /* TODO: Add your application code here */
* {' J; v% e. u- Q9 {! ^
8 \, Q- q7 [# x. d4 K6 |. r" }8 V7 a/ }

" C9 F9 c; O- A$ k$ v- |        char b[132]="";( e1 l/ Q# q  L# c* {; d2 |
        mmm(b);
: f- K" q- R" C2 }1 r6 i$ e        uc1601(b, 1);   //在UG弹出显示框
2 }* j4 w# T, v/ B
' ?. `- e3 {  X$ ]& a: d9 N. Y
" T( t1 P6 u& p1 X, B; f    /* Terminate the API environment */( S, b5 s* u/ b  M
    UF_CALL(UF_terminate());
+ L- i2 }% {. x  f- J  k- r}
9 x/ j: a1 n( `7 ^: ]$ T9 \& {2 ]/ L# Q8 k3 X: f
/*****************************************************************************
* y' Y( c: ?3 z) j; U8 Y* C**  Utilities
6 B8 u! V6 J0 S*****************************************************************************/
( J- V. ]3 T; v9 n
  J8 V& l, h- Z! U4 [/ H1 q' h/* Unload Handler
1 l6 U' {7 e- X. {9 l* j- Y**     This function specifies when to unload your application from Unigraphics.6 ^. G( ]) V3 L2 I
**     If your application registers a callback (from a MenuScript item or a$ ^! v+ t1 W8 I2 S% O
**     User Defined Object for example), this function MUST return
( ^# C) v- ~8 g- @1 j**     "UF_UNLOAD_UG_TERMINATE". */
4 W5 Y  s: v" ~7 p: M* mextern int ufusr_ask_unload( void )
! `: U7 ]# e3 T{2 g, R; [2 P, R3 H' M3 D: q# q
    return (UF_UNLOAD_IMMEDIATELY);8 h6 K; V* ?1 R
}
, e# p: _: m. x' S/ C- p2 l( L: M* E: S' D

7 q6 _( d  v! {, q9 O0 U  G) @
/ O. r5 T- @- T: v  A. D( h1 D7 S: W6 z9 n' h& N

$ L! a% b( Z( C: e* A$ k1 R$ u+ k) Y8 u9 g) D1 ]4 U
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了