设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10290|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
; S& A" W% \6 b4 [! mName = (WCHAR *) L"Poke";
) O3 O4 v4 a7 l: k                
6 `( I) C# }* e6 z9 I        hr = m_pDisp->GetIDsOfNames (
8 N' }$ l. A: ^; V& B                IID_NULL,                                // reserved
. D1 m. _  S7 E( a) W! ^                &Name,                                        // Array of names to get IDs for, ^& }6 x7 ^" _! F% y; b% O8 a! [
                1,                                        // # of names in the array
4 J: C2 n+ U  h, J; v' l1 n                LOCALE_SYSTEM_DEFAULT,        // System locale
$ R" @8 t5 t) P) f, U5 i5 B                &pokeID);                                // Array of IDs to fill on output
8 Z. ~& t9 b- e% c) C                       
0 c. `% K2 v! M* @. Y7 T: h9 i0 @        if (hr)
, p( w8 B, R3 r7 {                {4 ]2 Q5 L& z% Q, H* K8 n# m6 K
                MessageBox ("Get Poke Unsuccessful");' {- v1 ~8 c; n4 ~  k
                return;$ |; e; @8 C  b9 ^
                }
- r' t/ T5 |/ P! ~# c7 {- `
/ z0 H6 C3 u* `5 s/**************************传递数据给extend**************************************/" b4 |% F: [* U9 t  i2 e
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);1 w* J1 s1 |" O( g
       
6 v1 D4 p$ g9 T6 P6 e2 H! \2 X7 w9 N$ M         valueStr                                 = SysAllocString((WCHAR *) L"1232");- `/ J4 i- u3 ~, `/ ~. R
        VariantInit(&pokeVariant[0]);
: I7 q3 d' e1 z) M# h        pokeVariant[0].vt                 = VT_BSTR;3 G, A; n# T4 ]
        pokeVariant[0].bstrVal         = valueStr;3 a& ?. J, D! e9 R
! S8 y! X$ d: U* p3 o9 S# m/ W
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
) E( v7 Z3 R) D( c; `        VariantInit(&pokeVariant[1]);
# C- M# |2 I0 R( Q- I$ K7 y        pokeVariant[1].vt                 = VT_BSTR;! q5 x0 \. B, \3 l( Q3 ?
        pokeVariant[1].bstrVal         = itemStr;. ?+ m/ H/ I+ w- p% q( t

" M8 v/ l6 o: n3 q; _. k; V          topicStr                                 = SysAllocString((WCHAR *) L"system");1 {% \1 S  K$ A9 B% l5 b7 ~
        VariantInit(&pokeVariant[2]); , J' r6 i% [, o' M+ F' q' W' M
        pokeVariant[2].vt                 = VT_BSTR;$ n0 D' l5 A1 K3 M- F/ w% ], C
        pokeVariant[2].bstrVal         = topicStr;
9 x/ ]) q: o+ H. z& d" F  D& A
1 J& \9 c2 a, S7 V# W//        Set the DISPPARAMS structure that holds the variant.7 L! |% b. W6 F! q8 T  Z. [

; s9 U# \1 z0 D        dp.rgvarg                                         = pokeVariant;3 g( Q' M2 w8 P4 U; `6 t/ U
        dp.cArgs                                         = 3;
7 {' ~) x5 l. y6 z" K' n& H5 X$ {        dp.rgdispidNamedArgs                 = NULL;. C' B1 N3 d1 |: y9 g
        dp.cNamedArgs                                 = 0;- q1 S( d$ [9 C$ b: M6 G0 Q/ }

8 q0 l" C- w- T% B0 M9 i! s6 C3 A//        Call IDispatch::Invoke()
9 R* c8 ~' L! V9 x. O
9 L4 b! X$ h% {& H1 a! s4 }9 T        hr = m_pDisp->Invoke(
3 y, g  C. P- A$ z3 b1 J2 |) j                pokeID,
! H1 q8 p& k% O2 l0 w% Y4 Y                IID_NULL,
  W3 N/ V5 U6 G' s8 l. ]* u                LOCALE_SYSTEM_DEFAULT,
3 d0 d1 d! s* k9 l+ `                DISPATCH_METHOD,' @6 N; \/ w" Q4 [: T, J% e+ C
                &dp,
# L. \- R3 `7 K; r                NULL,& X! @1 z8 |7 Z5 g( n( A2 A
                &ei,7 f0 W6 W6 C3 [$ k6 h# ?1 ~0 ]
                &uiErr);, X' F9 T  R( V! z! Z; P

1 f0 J' h) B( x# I0 z  c; r        SysFreeString(topicStr);0 S8 S0 d! a8 S6 R. [3 N
        SysFreeString(itemStr);6 K7 q5 t! Q6 X3 w" y& \- F: X
        SysFreeString(valueStr);+ z$ V4 A( X, L0 \

. J$ _( F" q- \5 a" ]7 g现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
9 ~( F. {- B* d* M3 }此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????1 r, I; |% L) e0 |% z! G

2 Q( ^$ _$ E" ?8 y  I
1 {7 F$ ^# U1 ?2.这是request的程序! ?1 h% K5 d% {3 a$ Z
//  Request a value from Extend1 S$ f7 A9 a# q
//
+ t( p0 |, Y; B% |( q//        Initialize the variant that will hold the BSTR.  Set the variant's
, q) O6 S7 v! Y& l//        type flag to indicate the fact that this variant holds a BSTR. Place the% @- e/ ?* n, ~9 Z
//        BSTR into the variant structure.
8 @" Y  l+ K1 m. v1 N7 F: o' D" ~5 C& [& J0 Q
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
' }- I- ?0 m' s- f7 u        , M; b+ J+ s: v( C* k) m" i
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
' y( @  t( @# w. b( C        VariantInit(&requestVariant[0]); . R& d% f" E8 M
        requestVariant[0].vt                 = VT_BSTR;
: `' ^" K; w$ p( i6 Y9 e7 Z' \. ?        requestVariant[0].bstrVal         = itemStr;4 O) g1 `3 k$ U' L% t

# M/ D5 H% b& ~5 `2 _3 g  M$ [# S+ Q          topicStr                                         = SysAllocString((WCHAR *) L"system");& w! ~, P5 B; A- ^/ N; n
        VariantInit(&requestVariant[1]); 5 C. F: Z% s# l& z
        requestVariant[1].vt                 = VT_BSTR;
2 k0 I8 F) @& G" c        requestVariant[1].bstrVal         = topicStr;
5 k, D. z  m7 H; v  l  ~) E% M! S2 O7 D% a9 O0 E
//        Set the DISPPARAMS structure that holds the variant.
- T- F5 e! O( ~; Q" A  }  X
: t+ |4 V# |! R5 O/ t        dp2.rgvarg                                         = requestVariant;' W8 a9 {# p" V) F
        dp2.cArgs                                         = 2;
, c0 W' a+ ^5 P: k        dp2.rgdispidNamedArgs                 = NULL;# M: A7 e" M5 I( W. o, f( k
        dp2.cNamedArgs                                 = 0;
& a, }) X6 a; P- X8 a5 }4 R9 Y; u9 u! ]4 l8 W
        var.vt = VT_EMPTY;1 N3 H0 j/ q' n
8 T$ x! W) B4 k3 T( [
//        Call IDispatch::Invoke()
; D1 a- D! R7 k9 U7 C) k" N8 E
. Z0 G4 i9 C; z' T9 h: }/ s        hr = m_pDisp->Invoke(4 {( L8 e  g" m0 _; |) b1 S
                requestID,& B; I! Z* N6 {$ H3 Y% l  B
                IID_NULL,
* p$ B! ]6 s4 `. v' F+ T                LOCALE_SYSTEM_DEFAULT,9 e; Z& @* ?! w' ?
                DISPATCH_METHOD,
$ ^& {: @0 Y5 W- C5 e) g                &dp2,. Q$ l5 J  |0 r! g" f% N
                &var,
7 O- B9 N6 q$ T& C% h% {                &ei,
7 r" C. P4 o, F% C3 k$ w7 ?) y0 U                &uiErr);
& c9 b& n0 y- D0 p3 s' G' N
) E6 D) I8 s1 e' c9 ~; C        SysFreeString(topicStr);
/ A' d- x5 l$ H* a: u/ A        SysFreeString(itemStr);
9 j8 ~9 b6 |. _: z/ ~8 N" L4 g! n请问该程序是获得extend里面的哪个值?6 `4 s! D! t9 Z& I" a+ O, d- A/ r
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-19 09:15 , Processed in 0.016235 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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