设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13140|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:( l$ m8 ~4 E. @( ^- \
Name = (WCHAR *) L"Poke";. c! L! B& [3 Q0 o
                
4 l- d) r) n" q) L- M        hr = m_pDisp->GetIDsOfNames (- G* Q$ t' r7 p" ^" M( z  ]3 q
                IID_NULL,                                // reserved
; a! `- M8 p- Y0 \; U+ E3 d4 L! H                &Name,                                        // Array of names to get IDs for
/ Q2 x, |% m7 a* b. F9 j7 ^, V6 C                1,                                        // # of names in the array
  l. ?- E4 X2 z$ z4 i1 Q: @5 O                LOCALE_SYSTEM_DEFAULT,        // System locale
8 m9 I" h% H  u( h                &pokeID);                                // Array of IDs to fill on output
! @; Q+ K! j: f; Q6 x0 b5 B/ _+ ^                        " v; S. Z( M4 H) `: U, B: b, j
        if (hr)
1 e& h0 D( I* b# u5 E) e! o, m                {% S/ P2 w9 a4 T
                MessageBox ("Get Poke Unsuccessful");+ K% Z, R3 r; u( B2 m8 ?/ f4 s
                return;
; B$ o0 p( W0 z                }% u! ^, O0 K" I+ i; Z6 U
6 o8 u3 D+ X! h  p3 v7 M1 {6 n8 H
/**************************传递数据给extend**************************************/6 x& R1 u" q1 J, F; d3 ?
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
! d6 }0 G. Y2 D7 T' u/ U          o; G% Q% J1 H, _$ R
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
3 e1 `( }, g0 Q3 I5 h        VariantInit(&pokeVariant[0]); + @- e0 R  Z+ h# A0 b# b2 x
        pokeVariant[0].vt                 = VT_BSTR;
! L  T+ g4 U. A6 T8 _0 U        pokeVariant[0].bstrVal         = valueStr;6 Y6 ?# E5 T" E% j9 X

; B5 Y* ~$ Q! J         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
0 I5 s& j( f9 D  L6 T- }6 A( u        VariantInit(&pokeVariant[1]);
* o3 y( \3 |/ U0 Y) p" V' i# O        pokeVariant[1].vt                 = VT_BSTR;7 T. G* @$ p; e$ L$ T
        pokeVariant[1].bstrVal         = itemStr;" M: D6 t& d# p1 B

# P. U1 h# g; H8 p% S          topicStr                                 = SysAllocString((WCHAR *) L"system");
6 c) s; _5 T$ m9 @  t* D( l        VariantInit(&pokeVariant[2]);
+ C: J0 c$ X/ P+ |4 \, u* ?        pokeVariant[2].vt                 = VT_BSTR;
& d' q+ O, f' b* g: ^' o/ |8 x        pokeVariant[2].bstrVal         = topicStr;
" H' q0 m: n8 n! I4 b7 k4 T7 q  a: m# e: O
//        Set the DISPPARAMS structure that holds the variant.+ _5 v. ^' {$ g( u3 N

) r# Y4 x3 s2 U        dp.rgvarg                                         = pokeVariant;5 s/ Z; o) z; s+ d' i; T
        dp.cArgs                                         = 3;
1 I0 f2 b, z0 R# ~2 j0 B4 _- b        dp.rgdispidNamedArgs                 = NULL;% ^/ h- o6 Q) W/ W" \
        dp.cNamedArgs                                 = 0;
% I+ s# Q3 p$ J) W1 g
# m$ W, P6 D/ a! E$ D0 e$ u  t//        Call IDispatch::Invoke()
" @1 Y! p; ~/ s9 s4 x, E  M) a* f3 Q: }( ~* p
        hr = m_pDisp->Invoke(
4 I9 D. b9 _) L% V) G$ G% W2 a% f                pokeID,
* j2 K2 N) i  |4 P+ T9 S; z7 w                IID_NULL,  g+ Q# ?7 I  r3 k0 n+ }: Q: ]
                LOCALE_SYSTEM_DEFAULT,5 |6 @/ T: }" K2 M+ |6 ?$ k
                DISPATCH_METHOD,; A$ M; [7 |( M: v# N
                &dp,0 X6 L% F( M7 d7 O
                NULL,  f, y7 G* ]6 w: z
                &ei,
7 M! `5 {+ \6 r& P: W                &uiErr);* B/ m) \: y8 a: p* y3 E

. @/ y" Z6 B" n2 u2 Q        SysFreeString(topicStr);
" V4 F$ p- [0 K7 o8 \        SysFreeString(itemStr);; H$ |( {5 K' t; F
        SysFreeString(valueStr);
8 L. e5 o9 f4 O6 X# T5 u9 @9 k' k5 P3 t0 H) F% U) u4 L- f
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
1 s; H* ]" k* E5 m) F此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
( S& z- d; X; S; e; N! s4 J1 C* R0 n4 m* U
! `4 m& R1 r3 y  N9 q1 T$ f" y
2.这是request的程序
9 {8 ]; o/ \  n) j; u9 j//  Request a value from Extend
6 L+ f9 y. u9 o3 b% I+ _//8 c/ P6 |, W& i
//        Initialize the variant that will hold the BSTR.  Set the variant's% ^# J. ]' R0 {; h$ Y8 [
//        type flag to indicate the fact that this variant holds a BSTR. Place the8 r! _% ]2 c8 a4 y+ v
//        BSTR into the variant structure." e! L7 ?9 t/ j! @6 Z( J' a

: I) s: y! W7 g3 Z. i# Q        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);* S- V6 D% q! U( R# }$ @3 d
       
; R! t( z7 h1 b& M         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
& z/ ~/ y( c! J        VariantInit(&requestVariant[0]);
0 Q& o4 ~  Y7 E& B& L        requestVariant[0].vt                 = VT_BSTR;
$ J+ a: w! L" g6 V1 [7 w# X) J        requestVariant[0].bstrVal         = itemStr;
7 W( Y. k; L, z3 n" h2 \
) ?2 {- c8 F  L2 v6 {. j          topicStr                                         = SysAllocString((WCHAR *) L"system");5 ^, C# p; e7 N& y. s9 G
        VariantInit(&requestVariant[1]); # j" N" M8 l: u7 u0 M9 P
        requestVariant[1].vt                 = VT_BSTR;3 s$ O$ m4 w0 n( }7 v& @" e! v
        requestVariant[1].bstrVal         = topicStr;5 M+ ~' I- B& S  o- Z" x

3 l. G6 q2 b4 `( `  T//        Set the DISPPARAMS structure that holds the variant.
1 `  m3 k% m8 F# H9 F5 H: V6 D/ j5 B) y' h
        dp2.rgvarg                                         = requestVariant;7 z4 Y5 G2 m# h- b4 F
        dp2.cArgs                                         = 2;( c6 f/ o4 k+ z6 O; W  n% Q( E  d
        dp2.rgdispidNamedArgs                 = NULL;& J& _0 w1 H' h# L
        dp2.cNamedArgs                                 = 0;
" f# s7 ?6 q9 e/ P* x9 J; O1 z7 W
2 I* `7 ]/ ^2 ^6 \& c8 d         var.vt = VT_EMPTY;
2 Y/ h1 M/ l8 B+ K# s+ m
* r) j. ^/ W( A, S  `//        Call IDispatch::Invoke()$ S" t1 x1 j9 I; g$ _+ j- e

' O  _' ]% }- d8 v        hr = m_pDisp->Invoke(3 {0 l1 I/ L1 @& W" c
                requestID,
7 j+ m* S5 l2 r/ e9 i  h7 s                IID_NULL,
( n# o3 b9 U0 P( ^                LOCALE_SYSTEM_DEFAULT,% |; a$ m- o" c9 c! n
                DISPATCH_METHOD,/ G( y1 D% F! P$ R
                &dp2,3 [9 s6 S* z) f9 D
                &var,
: ?# X/ `9 J* ?8 h% |* Q9 I( C                &ei,
3 ~/ B# J4 e. a) l7 G3 g& y                &uiErr);9 ]5 ^  k' U6 }
; I- v* s  t4 ~" j8 Y
        SysFreeString(topicStr);  \4 J& n+ t9 C8 q5 {7 D2 h. T
        SysFreeString(itemStr);- s1 h+ [" m. ?  X+ r
请问该程序是获得extend里面的哪个值?
: W7 e7 P7 a3 k0 K如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-14 09:24 , Processed in 0.013161 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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