设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7237|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:6 o8 x& p$ t! |! O
Name = (WCHAR *) L"Poke";9 Q; J$ L$ N' r1 U
                
9 r* V2 {3 \. J        hr = m_pDisp->GetIDsOfNames (5 |0 x2 I4 Q2 j/ y
                IID_NULL,                                // reserved0 Q+ U1 j! `; y* J
                &Name,                                        // Array of names to get IDs for- \% s9 U' T' P" I. `7 B" q
                1,                                        // # of names in the array. D+ V  g7 E$ |7 E  v( {" z
                LOCALE_SYSTEM_DEFAULT,        // System locale
: r; o+ I, Z9 n/ j                &pokeID);                                // Array of IDs to fill on output
" L2 I( ^1 i! [+ E: f9 q" }& J                        6 q" O# Y5 X' v; @. c, o% P, t
        if (hr)
; L- F% W9 Q4 c& E                {
/ @8 K9 Z5 p5 U: j7 G. S                MessageBox ("Get Poke Unsuccessful");; V" A1 K! q$ U, J( ~
                return;
: S* Y# Y+ M. k2 I0 z8 C                }+ C& l% t+ |( B. F% W

) f1 P$ v. l& O7 O: T' G/ ]! ^/**************************传递数据给extend**************************************/" S. S  ]2 o9 k9 H, x' ]# @
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);4 f. F. c8 I$ J: V
       
* u/ E2 U$ B) C; p& t' V$ T         valueStr                                 = SysAllocString((WCHAR *) L"1232");
; p1 q2 z3 s4 n# x. z7 p0 r  T        VariantInit(&pokeVariant[0]); # s; G) T7 t8 l1 q/ j! Q
        pokeVariant[0].vt                 = VT_BSTR;# u: u% _) ~: U4 D8 i1 G6 q
        pokeVariant[0].bstrVal         = valueStr;
0 d  `: ~2 r  d
8 |' J" {% g6 i6 E" h7 H# S         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
/ L/ }/ L- {3 _/ U! `: h- k        VariantInit(&pokeVariant[1]);
( F$ Y6 Q7 t& w! c* e5 j        pokeVariant[1].vt                 = VT_BSTR;
9 p3 O0 F' x6 p; e" v1 B        pokeVariant[1].bstrVal         = itemStr;
* K1 g# s; g/ r7 t0 P, y7 i9 j! C4 B6 W
          topicStr                                 = SysAllocString((WCHAR *) L"system");
4 m) S; g" O) z  ]% ^+ B0 Y        VariantInit(&pokeVariant[2]);
9 Y3 B; o, K1 a! }, |0 B        pokeVariant[2].vt                 = VT_BSTR;0 s) B1 x6 U% `( b
        pokeVariant[2].bstrVal         = topicStr;
) N2 G$ B* M6 c) R$ b% o2 g$ G1 `/ d7 h0 z
//        Set the DISPPARAMS structure that holds the variant.
% g- c  `  @7 C7 p5 O% N
7 C) r* s" S1 ], A2 W2 Q        dp.rgvarg                                         = pokeVariant;
: ]$ a+ m1 I  z& Q        dp.cArgs                                         = 3;
# L# N: P8 K6 @* L5 t        dp.rgdispidNamedArgs                 = NULL;
  m" K& G) Z  |/ R% N# |1 N        dp.cNamedArgs                                 = 0;
9 |/ _; K6 M3 }$ v$ _4 t0 G1 O) v4 S) g" f$ s4 ?8 ?
//        Call IDispatch::Invoke()
: q! s2 T/ d0 h- j  Z! K7 W9 s$ X9 r" k- l2 k
        hr = m_pDisp->Invoke(8 Q6 V( X2 g7 F
                pokeID,
9 J8 Y$ n9 r) w2 I                IID_NULL,0 C9 W2 L; t& h
                LOCALE_SYSTEM_DEFAULT,) Y* G5 S* }1 f  w# W" M& E
                DISPATCH_METHOD,
! H& |' w4 N, l) m- G8 x4 n                &dp,% z. d- ~/ V3 F+ H/ y% _/ u
                NULL,& n! k$ x0 A/ r( e6 a
                &ei,  Z+ o8 A! ?6 ]8 G8 B9 _
                &uiErr);- f, A6 G1 x9 z, c

2 ?* N  I* C) X1 c        SysFreeString(topicStr);5 F* o. s: c" F# D" ?. \- X
        SysFreeString(itemStr);
3 @/ \  {- ^1 k  L, E& A        SysFreeString(valueStr);4 F$ y# F" B7 W; q+ q

. b& f4 N( Y" V2 |" w) j现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???9 ]- u# u5 N+ N* _  I
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????1 y* s7 Z; }  W; q6 [6 M5 a# f: E
  w9 |' b2 J5 Z' E' h
, d+ [& c3 }: X
2.这是request的程序
( y$ m, L: f1 ?1 t6 ?" N8 b: q3 r& t//  Request a value from Extend
2 v4 o9 v% [& z: ?& F//3 W- m5 k5 w; s" p; @1 g- d
//        Initialize the variant that will hold the BSTR.  Set the variant's
) M& E9 V4 P4 z! `  ^" D//        type flag to indicate the fact that this variant holds a BSTR. Place the2 U; |8 M( C* Q* r
//        BSTR into the variant structure.- `  u0 Q& e% O9 s$ O1 z

  o2 R2 @- o9 N& V  N+ O6 j        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
9 d' B8 A7 U& V! k8 U" \        8 j& Y: E7 Z+ Y3 K$ U
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
3 m8 d+ H* t# u: c) t        VariantInit(&requestVariant[0]); . e8 [5 z  j1 |3 o3 w  g
        requestVariant[0].vt                 = VT_BSTR;
5 @2 q* _  w7 `' G: L  V$ h        requestVariant[0].bstrVal         = itemStr;6 e+ j! F9 V# o' }3 W# V4 S
" F9 U! B& B. ~2 T
          topicStr                                         = SysAllocString((WCHAR *) L"system");
: f3 p& \* x! M+ H# T( }        VariantInit(&requestVariant[1]);
. L: W$ Q6 q) G$ \8 v9 ]        requestVariant[1].vt                 = VT_BSTR;
9 W( Z" K: i5 R. `: s1 M        requestVariant[1].bstrVal         = topicStr;! S+ K& ?% n  P, [7 \

% Y" I# V2 B$ K3 X# H! m//        Set the DISPPARAMS structure that holds the variant.
3 F- k% ?4 b& \7 ]+ ]7 U0 l; L
5 V" D; F* T: a2 h( n$ j7 p        dp2.rgvarg                                         = requestVariant;
8 |4 Y% V! z/ _# Y7 G        dp2.cArgs                                         = 2;
& \  c6 e! g" U( |9 o% Q* |8 d        dp2.rgdispidNamedArgs                 = NULL;" B: Q7 F$ ]' A
        dp2.cNamedArgs                                 = 0;7 D/ f- I$ O$ [- O) j0 O4 s% \
4 t  M3 S- b! I# t# Q
        var.vt = VT_EMPTY;9 v+ H/ Z8 p& ]* P/ }% B

6 n  {/ ?. m( ]  I/ _& k( ]0 g//        Call IDispatch::Invoke()+ ~, L6 ]/ k8 e0 w% A9 ^7 d
& V, y" L- N% B$ Y
        hr = m_pDisp->Invoke(1 }# V, M4 h) A5 o
                requestID,/ h8 a6 x" V3 s& l( I7 {; V; M
                IID_NULL,
4 {: Z8 ?& S4 c' [* p4 v4 I  x( D5 c                LOCALE_SYSTEM_DEFAULT,5 m4 I3 \. n) S& l" a# Z
                DISPATCH_METHOD,, o1 @, V: s5 n% e
                &dp2,  n+ Z. m. N: h+ l/ a
                &var,% F" j1 |  b/ ?/ J- c
                &ei,) [$ u5 k' N9 Q7 l0 C! y
                &uiErr);3 D! k4 q. r  g# Q- t% z5 z0 K

* r5 \8 T7 S% |        SysFreeString(topicStr);
1 p  m0 u. n6 @2 ]; s        SysFreeString(itemStr);  t/ _8 i, k0 n3 N# ]
请问该程序是获得extend里面的哪个值?
6 n# J# k$ [4 U如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-7 16:15 , Processed in 0.016102 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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