设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7526|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:9 g& R. \/ o! l5 _! l; ^
Name = (WCHAR *) L"Poke";
6 L  F% y: t6 g                
& m* V/ g: ~' y2 n9 y& q, ?4 X9 @        hr = m_pDisp->GetIDsOfNames (
* d+ X0 _. C; D  u; {- I4 F9 Y6 r# ?                IID_NULL,                                // reserved" L0 }7 d8 ?5 a4 E8 P4 B$ A" W1 u7 I
                &Name,                                        // Array of names to get IDs for, R# z. h. p& t9 ~: q2 H
                1,                                        // # of names in the array
! t5 t: X# F, @/ b4 r1 Y# w                LOCALE_SYSTEM_DEFAULT,        // System locale3 W( z8 N# X. S  g+ Q, [
                &pokeID);                                // Array of IDs to fill on output
8 Q) S( i+ x, V* G                       
. e9 }: T. t# A: e        if (hr)
3 A, m9 u" y- i  Q                {) {& t+ o2 q$ i& Y
                MessageBox ("Get Poke Unsuccessful");4 P5 J, t" C, h4 W
                return;
4 I6 |: t$ Y8 g  |" ^$ k# E* p4 r                }
  v  V  _. U' ~" w0 L( t3 H9 `( C  z/ L+ y0 M+ E  O) _% U  z6 u* Z1 k
/**************************传递数据给extend**************************************/
4 h) d, m' p. R8 d, U8 h        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
  k# z3 u! v# z6 M- x' O. d        : f6 s) A: g) U0 c, L! Y3 J
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
: X8 g" J0 B/ S1 {7 x9 n8 B4 B        VariantInit(&pokeVariant[0]); 9 l" X3 X) }5 O& c6 T" ~; X2 C8 Y
        pokeVariant[0].vt                 = VT_BSTR;9 l* l3 ~9 [+ G+ z) ^
        pokeVariant[0].bstrVal         = valueStr;
- i& s3 w( C9 @2 [, A1 U+ @6 F" |$ W. }  C$ U4 a
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");" @$ P  j% `+ e) C2 z# M
        VariantInit(&pokeVariant[1]); " x0 `) U6 m+ d3 R
        pokeVariant[1].vt                 = VT_BSTR;
( u  m2 n) H1 z# U# f- `; }        pokeVariant[1].bstrVal         = itemStr;
' _' y8 c: @& t& G4 S; z0 t" m5 B3 r( j2 o
          topicStr                                 = SysAllocString((WCHAR *) L"system");
6 W, m$ t# S8 D% M7 ^# j        VariantInit(&pokeVariant[2]);
! F+ \& Q( \8 E) c7 Q1 k$ Y5 O        pokeVariant[2].vt                 = VT_BSTR;8 z8 L. V. e3 Y* `. \$ P/ j
        pokeVariant[2].bstrVal         = topicStr;
: o. ]; y% C6 H( u% y3 A' h1 c$ ~4 m) l4 J2 x
//        Set the DISPPARAMS structure that holds the variant.
1 H0 \- Q: ]' b3 G; |9 Y% `. I! x. `5 N- q( {
        dp.rgvarg                                         = pokeVariant;; `4 o- l  `, s
        dp.cArgs                                         = 3;
% H4 L" C& k0 U- E; N7 z        dp.rgdispidNamedArgs                 = NULL;
& w6 J3 r1 E' G4 x6 @/ ]0 [        dp.cNamedArgs                                 = 0;
. V4 \( q4 N( ~0 C  z% d/ K! Z, D* y6 [( C) n
//        Call IDispatch::Invoke()1 Q# a# T- ^+ g5 ?
/ @: l1 b- [6 b  _$ H
        hr = m_pDisp->Invoke(% k! Z& ]/ x5 c7 V/ R0 `
                pokeID,
1 c$ ^% F- t8 B* ]4 N' R" I                IID_NULL,5 A* O+ \& G) m$ P
                LOCALE_SYSTEM_DEFAULT,6 |2 u2 a: |; P8 b5 L
                DISPATCH_METHOD,
8 x- a# ~0 m' M" I! u9 r' O                &dp,
$ |; J" I. {5 p                NULL,
$ V  I, K6 B6 w                &ei,
: V# j% N9 |! v4 r6 |# M/ R! R5 N, S                &uiErr);" G, }" V/ ]" r. P- @8 ^& t

3 |% Z4 h' q5 p6 \5 e0 A        SysFreeString(topicStr);# d2 P- |. c; |3 j, V& T
        SysFreeString(itemStr);
7 M) M& p7 o  L* Q. g5 V) M7 _        SysFreeString(valueStr);. F. z6 F& h) v- j# n- B; g

6 M9 w  z) D; V8 ?' f现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
) M: k  ~9 u7 H- X此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
6 [. h- S7 T9 l9 ^3 e& R- h% l9 P% K5 ^5 C  g+ x

" p7 }, F( x' i5 N: p" P! z: A. u2.这是request的程序
6 @5 z( Z1 j1 n, [% F8 T! o//  Request a value from Extend
6 u2 M0 @5 D, l* I//
! X6 @# T* P; P  Z. i//        Initialize the variant that will hold the BSTR.  Set the variant's
$ j: {/ [3 M! r$ K7 m//        type flag to indicate the fact that this variant holds a BSTR. Place the' g/ {2 O2 U, @! g
//        BSTR into the variant structure.: {, R  l# H, c
* y# r% U7 {* B. [( {! W
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
5 _8 C' q, Q3 ^, E  u( w8 E# O        ! I2 m% E1 b/ p8 A, e. k
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
8 |1 k9 r) V! i2 z0 G, {! ~        VariantInit(&requestVariant[0]);
2 M9 }$ T3 N/ T3 f) F6 ]        requestVariant[0].vt                 = VT_BSTR;* a& a$ x5 f1 k0 F7 J
        requestVariant[0].bstrVal         = itemStr;
5 r3 f3 ], s9 T! V0 d9 A& F! N- d0 F# H- c5 j! [
          topicStr                                         = SysAllocString((WCHAR *) L"system");
" V( A3 d4 M, }  b        VariantInit(&requestVariant[1]);
' K( b. O: i& H# r1 e! u        requestVariant[1].vt                 = VT_BSTR;
' w: u. H- P% @        requestVariant[1].bstrVal         = topicStr;: |" O. `$ _8 w
7 F' w  }/ s4 U; \4 n
//        Set the DISPPARAMS structure that holds the variant.6 u3 H& e6 K& A% U

) T: I9 V! j5 n/ |        dp2.rgvarg                                         = requestVariant;3 S# d" X& ~# o& u. D. i
        dp2.cArgs                                         = 2;0 L! t' [7 L/ v
        dp2.rgdispidNamedArgs                 = NULL;3 @. {: R2 t+ b* w* S) y9 ^# S9 x" ~
        dp2.cNamedArgs                                 = 0;- E  g* C; e4 h/ S

' ~' h8 X% G  v$ V0 r% q         var.vt = VT_EMPTY;% a) D0 x, S7 d- H

$ U. g5 y7 k6 b1 G9 A" F! b//        Call IDispatch::Invoke(): q& n/ w- u2 ?, c# h0 W( y. e
/ U1 e5 b5 L3 O* C& N# u
        hr = m_pDisp->Invoke(4 U4 s5 K! i) A. z! z; ?; o+ t7 l( R
                requestID,, v( X) T7 I1 M& w: M
                IID_NULL,0 B0 w2 z# s' P4 i( }, J3 X
                LOCALE_SYSTEM_DEFAULT,
" X. m- ~. F1 K3 X5 ~                DISPATCH_METHOD,
7 e: Y- i( X* v+ `                &dp2,4 F0 }* o) ]5 S# ?& T+ x0 I: H
                &var,
8 l! u! u! j" m6 g; j4 l' {0 k/ D                &ei,
: F/ _+ g0 o) G5 [! w$ W                &uiErr);. `6 V8 |6 Y% S2 T$ Q/ t2 [

2 `8 D/ l/ i* m6 C& F7 N1 T        SysFreeString(topicStr);
2 l% {& e( x' x# J        SysFreeString(itemStr);4 S, p! E0 A, F0 u5 V. i( p. z3 ~
请问该程序是获得extend里面的哪个值?; z% _& I) E: Q/ H5 d
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-23 11:48 , Processed in 0.015937 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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