设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9984|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
2 ]! ~; _+ R$ ~$ s, eName = (WCHAR *) L"Poke";! w- H9 t) d# |1 l7 C
                
/ H' q4 |3 m/ M( x        hr = m_pDisp->GetIDsOfNames (
7 ^, i; G; S, R% D( U) ]% m                IID_NULL,                                // reserved. i' d1 [. {% X5 L6 e$ A& f
                &Name,                                        // Array of names to get IDs for
2 S" i" V3 w5 H: V                1,                                        // # of names in the array2 b3 Z! v( R6 Q5 D/ C7 p
                LOCALE_SYSTEM_DEFAULT,        // System locale
/ \) W2 k: N9 |& J" I; i- D                &pokeID);                                // Array of IDs to fill on output# m# |$ v' J# [" T
                        " p; G7 u0 q+ o9 p& s$ R. V: r8 g2 F
        if (hr)% \3 ?+ n  N4 c, c- H* v
                {
3 N% k" K  B: ?0 T2 o# c0 T; e                MessageBox ("Get Poke Unsuccessful");
, u+ V7 N2 d( n; X* V" s                return;( ^0 e4 C, Z! E- h; H0 d
                }
, i2 ~- }4 l( q# u: h6 Y1 `
! Q& M  ]7 {$ ^' O) t# V) n" x/**************************传递数据给extend**************************************/
, L; R4 @9 U* U        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);! {5 c8 N6 \+ X# o
       
3 e3 A" O, E6 z, g4 b% W9 F& N         valueStr                                 = SysAllocString((WCHAR *) L"1232");
9 R' _$ P  x. K; Z" x        VariantInit(&pokeVariant[0]);
3 w. W% P  P8 b        pokeVariant[0].vt                 = VT_BSTR;
2 V% d9 f9 ]3 b5 J        pokeVariant[0].bstrVal         = valueStr;9 C9 x$ T9 P( e/ P

; @$ z/ d5 M! s! |' }+ V         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
2 M% [0 u3 p; l0 l3 r' \        VariantInit(&pokeVariant[1]);
: u3 x& K+ A6 [( V. p' A# A        pokeVariant[1].vt                 = VT_BSTR;
& Y+ w% d; E. ^* P* i        pokeVariant[1].bstrVal         = itemStr;
9 \! \% E" h- {# B
% I/ k6 ~" @0 U' I          topicStr                                 = SysAllocString((WCHAR *) L"system");2 T! O# t; A! P: z6 X9 v
        VariantInit(&pokeVariant[2]); $ u; Q; t3 n# d# A3 @$ L8 K# g
        pokeVariant[2].vt                 = VT_BSTR;$ x0 F& b; ]& U: U/ `
        pokeVariant[2].bstrVal         = topicStr;
/ m, D4 O6 I& H9 U+ I. R- A# K, v: V, @
//        Set the DISPPARAMS structure that holds the variant.! L# s: V: D6 H4 o$ Q/ V) J. M0 c

0 Q+ P4 s4 e/ c: o# G4 P        dp.rgvarg                                         = pokeVariant;
! A$ {! O- y0 n7 b' [        dp.cArgs                                         = 3;
2 \* J5 T( p. V! }& I" n; |        dp.rgdispidNamedArgs                 = NULL;
( f: m" w* \' d7 ?: @        dp.cNamedArgs                                 = 0;
+ B6 r$ M) U9 ^
: f* [* N3 h5 G1 G6 E3 R" Q//        Call IDispatch::Invoke()
( h4 |( e* m4 Y  E" c2 A0 x( w7 J9 p: I. `
        hr = m_pDisp->Invoke(
( H$ |" Z2 P" `2 x- b                pokeID,
3 D  W4 D5 l  z( W4 I                IID_NULL,7 y) s+ ]9 V& ~9 Q
                LOCALE_SYSTEM_DEFAULT,
$ A4 x1 i+ B/ `, Q/ F. |) V                DISPATCH_METHOD,
9 d/ ^7 z  k( C7 W0 w1 e, y0 s                &dp,
# V2 r- s" C& i) P( B                NULL," l! ^# b& g' j0 {; ~, _
                &ei,4 Y( S& B; W) f
                &uiErr);
  @, j7 i) s0 R2 e% Z1 ~7 _! k' ]( o
        SysFreeString(topicStr);6 T6 X8 ^& Y" \9 i# x* ~9 f3 }+ G' {
        SysFreeString(itemStr);
: e9 r& W: ~* h* ^        SysFreeString(valueStr);; Z2 l# Y. O1 K- j7 K- Z9 X% j) a

  {6 T$ I" I$ _0 v$ X' A, _现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???  o, x/ _* l  f3 I
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
2 a# e7 C6 ?/ h7 F) k
3 u1 M8 r& ^  V' ~  Y" z* \# j
+ i8 N# b) y2 ]8 O; j& ?! N2.这是request的程序
4 }" r8 }( C& k2 _0 C//  Request a value from Extend, B. A7 A) q% K) ^( W0 S' f5 c
//$ O' P0 }  }' T- g5 n: j
//        Initialize the variant that will hold the BSTR.  Set the variant's
4 g. H" i7 m! G! H7 M" n. Z) p  E; i! I5 ^//        type flag to indicate the fact that this variant holds a BSTR. Place the" w; Y0 m$ `9 k) l+ M) I6 [! ~- ]
//        BSTR into the variant structure.5 z3 ~9 s# I6 p1 O: h2 p  A

( q3 W# T1 k" \        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
- q% B2 E6 \& F+ ?; q4 X6 b+ c; o       
' k3 J: `% W& I, J         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");5 [. \& C, E( V) X' \
        VariantInit(&requestVariant[0]);
% P1 L& |% s/ b9 q0 k        requestVariant[0].vt                 = VT_BSTR;0 S- J8 Y  b: Z" x/ w, O
        requestVariant[0].bstrVal         = itemStr;
# ^9 B4 @7 r9 l! v( o
$ r# f1 b  \+ |1 a! d          topicStr                                         = SysAllocString((WCHAR *) L"system");; L. b: E7 _" t2 d$ |
        VariantInit(&requestVariant[1]);
8 z( p+ z2 z4 q8 k: ^2 w        requestVariant[1].vt                 = VT_BSTR;7 r) E; W) x! A$ a* E* Q4 z
        requestVariant[1].bstrVal         = topicStr;
+ W1 V9 [/ A( Y: x3 H
. z) b9 L5 E4 ]7 c/ |# i* ~//        Set the DISPPARAMS structure that holds the variant.
" n" j. z; k" n5 x% T/ h6 N" o
) Z; f! X$ D" I% D0 A( ]        dp2.rgvarg                                         = requestVariant;
' ^5 w( ~5 a( j. Z$ S% h        dp2.cArgs                                         = 2;
0 a1 d+ X! y8 `5 Z3 c3 j" F        dp2.rgdispidNamedArgs                 = NULL;$ p; B, `/ N* c; T8 ?$ P
        dp2.cNamedArgs                                 = 0;  Q! i& Y, q. E( z, \

& Q6 l+ A& |. G  r% c# Y# d7 v1 K0 X* u! I         var.vt = VT_EMPTY;
( n8 H$ {$ Q$ A6 C7 x0 `6 h( D/ u, Z: M. a) O" L
//        Call IDispatch::Invoke()- ^2 a3 m! Y# u/ c- k

; b: i, Y2 k, v        hr = m_pDisp->Invoke(
! g& b4 q/ B7 u. E                requestID,  p! D$ u$ |2 g0 O7 A# \3 f6 V% x
                IID_NULL,
& s6 |7 I0 U4 ?5 B$ r                LOCALE_SYSTEM_DEFAULT,
" t% g, l8 F9 C9 e9 u                DISPATCH_METHOD,2 U9 q6 d6 u$ g2 s9 E7 r0 y
                &dp2,
( q. K9 {/ E% l4 Z8 e" J! \  X/ V                &var,0 M9 t/ N2 n9 l7 A/ Y
                &ei,
" g  C& y& A" L( D1 W+ b" [                &uiErr);1 C& ]( N' v7 n8 }# c
  g( r/ f, ]* _" B) j3 M
        SysFreeString(topicStr);. j- O' l8 N1 B5 r/ U3 \- D( l6 d* v
        SysFreeString(itemStr);5 k9 [( p0 z1 C8 C. E5 `8 d
请问该程序是获得extend里面的哪个值?
) s. q# v+ k% u8 |/ Z5 e  P& N如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-7 16:40 , Processed in 0.016676 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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