设为首页收藏本站

最大的系统仿真与系统优化公益交流社区

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12996|回复: 0

[求助] c++和extend的COM接口问题

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
) c8 V; o7 x# W0 j& ]4 h! HName = (WCHAR *) L"Poke";
# n& f5 N) K3 [( n5 C                 - m6 j' A; K$ x2 V  n5 L5 P1 `" d
        hr = m_pDisp->GetIDsOfNames (
2 I6 Z: M' G& X% w/ _0 p, ]                IID_NULL,                                // reserved9 Y2 L6 n# H7 Y' K
                &Name,                                        // Array of names to get IDs for
0 G2 N- Z- Q# M0 H9 I                1,                                        // # of names in the array
6 `# S/ ?2 m) E3 z, g8 s- g                LOCALE_SYSTEM_DEFAULT,        // System locale: i$ n, C  ?. d
                &pokeID);                                // Array of IDs to fill on output5 V" o# c# U5 `$ l/ U$ B! h
                       
. b: `6 V2 T2 t3 O  j7 ~2 E        if (hr)
0 n5 V; u1 M6 A$ {% W                {
/ }5 Y' j: i" n* _! G0 V6 ^. g                MessageBox ("Get Poke Unsuccessful");
1 ?7 w, m, \# z- M3 A9 {$ N) x3 F                return;7 s% p, h9 R; [
                }9 w! y( |! u& k7 ]0 c& Y
+ L# |  f! A6 h5 V' k
/**************************传递数据给extend**************************************/
) c) ]0 t+ H$ o: m        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
1 ~3 s1 R$ H: Q* l! [       
0 l( k$ F+ l' i: n6 s         valueStr                                 = SysAllocString((WCHAR *) L"1232");9 w/ L% M& M* _. W+ J' s0 a
        VariantInit(&pokeVariant[0]); ' R6 c2 u8 |: K7 J; u7 W0 h+ f" |- D
        pokeVariant[0].vt                 = VT_BSTR;
$ e* x, n3 `+ B0 K+ M% E+ W9 Y9 K        pokeVariant[0].bstrVal         = valueStr;
1 N  H- R+ {1 b9 A5 C- d
. D6 N0 ^, w* q- p         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
5 b: j7 @% k, c- \' l        VariantInit(&pokeVariant[1]);
6 Y  X. R$ E' N2 E! Q& b        pokeVariant[1].vt                 = VT_BSTR;4 Q4 ?2 d/ M. R6 m
        pokeVariant[1].bstrVal         = itemStr;3 w# P2 e# l- h4 _* E- ~+ y
5 l, x0 M  N6 m" q, X! ]6 W6 p5 s
          topicStr                                 = SysAllocString((WCHAR *) L"system");8 c/ Q- i! v1 Q- {+ N  n' [1 }& h- F
        VariantInit(&pokeVariant[2]);
3 \( i9 M* R+ @, p        pokeVariant[2].vt                 = VT_BSTR;
' e- ~- L9 B# B. d+ `/ C6 T        pokeVariant[2].bstrVal         = topicStr;
2 S) G$ v5 ]; \0 A! ?5 i/ r; i1 {
//        Set the DISPPARAMS structure that holds the variant.7 M' I& r( D# n4 h2 r$ m/ C* b# \

" I9 ~8 n9 F( {! A        dp.rgvarg                                         = pokeVariant;4 y7 \: ?8 S+ g
        dp.cArgs                                         = 3;( M1 X$ p& l9 e$ b* x
        dp.rgdispidNamedArgs                 = NULL;
4 B1 a! F. X( q- `1 E; m        dp.cNamedArgs                                 = 0;5 }% I+ Z' _. q" }! f) w) U

  Q0 `" B% B# R//        Call IDispatch::Invoke()" e) ^  Y% L& u* T5 H

. L9 j- k% u. l: |& T0 n% ~4 ?( e        hr = m_pDisp->Invoke(
1 c  s' L( P5 m# B8 w& V                pokeID,
  d: z8 B. S# f8 n4 u. [+ E                IID_NULL,
( t/ y! @& T& r3 J- w' `( ~  d                LOCALE_SYSTEM_DEFAULT,
& q: D% z) l; Y, T& o2 a                DISPATCH_METHOD,+ n6 D6 Q7 s- P, V3 P
                &dp,! _/ n6 e+ ^' p8 A0 d2 {
                NULL,
) j5 y& {8 g' w# P                &ei,' b7 E: Q) C# f
                &uiErr);
5 M4 q  i! [# G# a7 A7 H: p6 o" ]) ~0 E0 l
        SysFreeString(topicStr);4 Q( b0 P& c2 o1 R$ O
        SysFreeString(itemStr);) n* j; Q4 \; d# l8 g/ g3 K
        SysFreeString(valueStr);/ g; X# W1 K' a# Z' @4 c5 a* a
$ s! |3 L- O) I4 a8 ]
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
/ ^: L& F. t7 \8 _' x+ ]5 T此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
6 m8 K3 `7 L! _! a9 G$ x5 ~# r; }9 T

+ G; A; v4 c/ A, L+ T% X2.这是request的程序
/ L/ t- ^8 }& ~* R//  Request a value from Extend
$ @) O9 h8 |. n7 n//
5 a+ L4 Z. J8 A//        Initialize the variant that will hold the BSTR.  Set the variant's1 g. D+ |  g- ]  ~$ N4 s9 m- Q( G
//        type flag to indicate the fact that this variant holds a BSTR. Place the6 k0 ^4 B! l. H
//        BSTR into the variant structure.3 R/ J  }2 |8 T9 Q; o) D
: I" q2 y- O; z5 {3 o( ^
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
* l! ?0 K8 S7 G" N; Q       
1 c6 t' d+ |. n, q# Z* K. k# d         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
' `+ U' g& d) {        VariantInit(&requestVariant[0]); " r! j4 }1 N1 r3 H( {
        requestVariant[0].vt                 = VT_BSTR;
" s' ?. _, C0 c4 K: N        requestVariant[0].bstrVal         = itemStr;
4 ]& a& R: K; l* A1 p" L; @/ v4 u& E0 [" ~
3 e' A7 H# J1 m& ?: x+ K8 t          topicStr                                         = SysAllocString((WCHAR *) L"system");
. b; r. }% U5 |; e7 e  b        VariantInit(&requestVariant[1]); 5 r# D$ g, }8 b/ _  Y# C  r: f
        requestVariant[1].vt                 = VT_BSTR;
) I* ]$ R/ [9 C        requestVariant[1].bstrVal         = topicStr;
0 i* _4 K3 a: W0 y# D- k  J
3 s# n3 H5 D  B" h; [//        Set the DISPPARAMS structure that holds the variant.' C( ]0 |0 N1 V2 L3 F& q7 c4 x. f) q
& T' P7 W% a0 @  Z+ [% n
        dp2.rgvarg                                         = requestVariant;% ^' e) Z1 I% }4 z2 I, I3 T
        dp2.cArgs                                         = 2;5 \9 ]; c% O( [) S; S' U
        dp2.rgdispidNamedArgs                 = NULL;7 G8 h6 T: `7 r3 Z$ p& L
        dp2.cNamedArgs                                 = 0;! Q" a: {* x4 w
; R! g$ B1 w' [- [9 x
        var.vt = VT_EMPTY;
- Q! a8 D* L) n0 F$ E( r: i$ z8 R6 ^* m
//        Call IDispatch::Invoke()
5 i+ F5 p) ]* X  x( l' c* x, B2 g$ `5 y# s& g% Z, U* |
        hr = m_pDisp->Invoke(
  X& i+ e( {8 S0 N/ s' c                requestID,7 c0 F* Z# M: m& ?! [$ E* d, x
                IID_NULL,
) m  V5 g6 q$ A5 W                LOCALE_SYSTEM_DEFAULT,
6 k) H$ V( [1 ~                DISPATCH_METHOD,
" @0 a3 `8 v3 S% [- D, n                &dp2,
/ n" s& C  Q/ E7 j: D, k                &var,& C4 t5 o. o& b, A
                &ei,
5 B) r( P5 y$ m& }4 K: C                &uiErr);
" I2 N! V9 y8 |. B9 W! r1 E1 z; Y# I
        SysFreeString(topicStr);
+ b& g/ c& o% W7 F        SysFreeString(itemStr);
. n3 f  v, c) [8 ?* A请问该程序是获得extend里面的哪个值?
! E' n0 |" y3 {如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|SimulWay 道于仿真   

GMT+8, 2026-9-8 03:02 , Processed in 0.014091 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表