设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12239|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:- ^5 X+ W# \/ Y' ]* P7 a9 m
Name = (WCHAR *) L"Poke";
2 _3 X) F- r, S3 Q! Z/ p4 K                
+ x. K9 h/ ^/ ^& p9 _4 I, P        hr = m_pDisp->GetIDsOfNames (
* ?1 ]6 C) Z( I5 R+ `' u                IID_NULL,                                // reserved
$ v4 x2 y, A- G. h: q) J                &Name,                                        // Array of names to get IDs for3 D/ ~  w+ @0 `- ^. C' t3 ^/ W
                1,                                        // # of names in the array, E+ }" }  ]% z) j" D% G; _
                LOCALE_SYSTEM_DEFAULT,        // System locale8 |) D$ ?/ Q" Q  \9 |9 l
                &pokeID);                                // Array of IDs to fill on output) c* j) Z9 V3 Q# Z6 }. i+ ^
                        ' T1 n$ O) Y. u6 V# Y, r
        if (hr)
6 W3 r6 J4 W0 G% S3 n( l                {
; f+ y4 V' T6 y4 A& [, O                MessageBox ("Get Poke Unsuccessful");) e2 A4 J  Q- u  w  J  W
                return;5 n5 A' X. R6 m
                }
9 I) Q4 G" k" y) z) d+ n. `8 N
. f4 w' N: }" W! x, f" Q( [) X/**************************传递数据给extend**************************************/
8 u* g! q, }3 B+ R# H$ f# Y        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
0 s/ ?* x  S! Q& i       
2 B) L; u1 d$ I         valueStr                                 = SysAllocString((WCHAR *) L"1232");) }- ]9 ~) B* [
        VariantInit(&pokeVariant[0]);
2 N4 i" C  O- X' o4 r6 q, s; e        pokeVariant[0].vt                 = VT_BSTR;, P0 L6 X( B! w9 Y3 ~4 Z2 f
        pokeVariant[0].bstrVal         = valueStr;7 m5 [! F5 `/ c, x9 b3 h

/ d( T6 U1 |* v1 g6 h' ?( H         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");1 n, [- f' ^* p, P! j
        VariantInit(&pokeVariant[1]);
: X6 ~3 ]( @2 m3 V        pokeVariant[1].vt                 = VT_BSTR;
& j& v/ R( R! Y; p        pokeVariant[1].bstrVal         = itemStr;
. b5 ?! X  z( w9 Y1 f% n; |" K4 v  S
          topicStr                                 = SysAllocString((WCHAR *) L"system");, R3 R* d2 j, `
        VariantInit(&pokeVariant[2]);
2 ~' z+ W" J. s% O        pokeVariant[2].vt                 = VT_BSTR;
' \4 _+ M. K" v$ J/ @: B( T+ N        pokeVariant[2].bstrVal         = topicStr;5 M, [* \, l  o8 C, k

+ {: ^' u5 N1 w- K//        Set the DISPPARAMS structure that holds the variant.& F* W$ C! v/ x+ `0 ^

/ Q; z7 ?) ?. _4 v% q+ R! |$ Q        dp.rgvarg                                         = pokeVariant;$ A9 P# q' u( D) h5 ~! K: R
        dp.cArgs                                         = 3;
+ h# W' O8 k/ x1 _6 m& `' E$ B        dp.rgdispidNamedArgs                 = NULL;
) x1 n' x! |  @( d- j4 `8 j        dp.cNamedArgs                                 = 0;
3 Y- t+ ^2 M* s* y4 t8 J
: P( X+ K2 W) e& v3 A//        Call IDispatch::Invoke()- x$ U: X# s+ F( U
$ e/ b/ Z8 e, [+ d' S, P9 x
        hr = m_pDisp->Invoke(
$ D# |# b8 I4 h9 d- r                pokeID,& ~5 E5 G9 M  B. b7 M0 l! ~
                IID_NULL,9 G$ o0 X3 h# B  {6 M8 Y) }* e
                LOCALE_SYSTEM_DEFAULT,
  \4 m0 ?! q  E  B                DISPATCH_METHOD,
6 [& {9 s7 _, |# M                &dp,
$ f, {8 {5 z- s: c                NULL,
. q& F- R) G3 F5 s0 J5 t! K8 L. P' r                &ei,% s, X2 q: F4 C; Y$ V4 M
                &uiErr);
. m! |3 F  i$ b5 B1 V! g; c
9 F: M- t( a8 V# ?% M8 \$ \        SysFreeString(topicStr);7 T( C: b4 \) V! _# ^
        SysFreeString(itemStr);$ Z2 ~. N1 t& w; J
        SysFreeString(valueStr);
1 D4 H) A5 ^# Q& e5 d  @$ p# l- t+ d5 }9 j  W
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
6 {' }6 ^8 U" l3 ]$ E此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
# [2 |) j& u; }& b/ d. b! M! t; O& ~9 f: z+ g- g

$ F9 j1 b- a" `- w5 W3 V2.这是request的程序
) t/ v8 c8 C$ J! m) K6 a8 u/ F//  Request a value from Extend/ C5 v$ w% U; t, z& }3 F2 Y
//
- N" m( w' v( Q9 x: W# c( ?//        Initialize the variant that will hold the BSTR.  Set the variant's
4 ~( ~9 K, f$ g//        type flag to indicate the fact that this variant holds a BSTR. Place the
1 }) v+ w+ y* y/ f; Z! F//        BSTR into the variant structure.
4 E# w* d& G: e% o. a6 g9 \- r
5 \# X( ]' e9 q& D( |        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
- v) @" A. f, y4 V        $ u; x& c6 o" {0 W8 D/ d
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");) k* [5 M( X! ~1 Q
        VariantInit(&requestVariant[0]); * w4 G& N8 l1 E6 R& ]' f
        requestVariant[0].vt                 = VT_BSTR;
: p+ R, ?& J4 m7 }        requestVariant[0].bstrVal         = itemStr;7 o) ?! c* o! J4 n1 F6 X8 s: S
, `5 M* ]2 ]( i) _& t1 I4 j
          topicStr                                         = SysAllocString((WCHAR *) L"system");
' q4 |1 {( J; _5 f3 d' F6 z        VariantInit(&requestVariant[1]);
; V  L) K0 h/ h  V7 W        requestVariant[1].vt                 = VT_BSTR;
' c2 x4 R: R7 R% u3 b8 J        requestVariant[1].bstrVal         = topicStr;
# K  V' C2 x0 v6 I7 h2 N+ y- o
6 t; B1 {! g* T1 i2 O' h//        Set the DISPPARAMS structure that holds the variant.' v: V6 J; y0 x7 r- f
: y8 T7 O7 o+ q2 l0 }& t2 t1 l
        dp2.rgvarg                                         = requestVariant;
* x/ k9 }1 E7 g' }9 g        dp2.cArgs                                         = 2;& ~- Y+ W1 f" D+ n7 S7 D( C$ D
        dp2.rgdispidNamedArgs                 = NULL;
6 d; ?( @/ [; K0 y; b' c        dp2.cNamedArgs                                 = 0;7 g; I/ @+ x2 s" s
; b! Q- Q# J9 `& O6 t  |& R# u. B
        var.vt = VT_EMPTY;
! G; u) C; T, b, Y, W# v- m* E
( ~* V$ C. i# S2 r8 K//        Call IDispatch::Invoke()( W$ s. W5 @% H) l$ L: v" s

" a( r) H  T. O" L; t        hr = m_pDisp->Invoke(3 D& S3 x- i: Q+ H7 _
                requestID,; r: z" S( n( A9 t( ^
                IID_NULL,# ^& b& Y. t  V
                LOCALE_SYSTEM_DEFAULT,4 }- Y8 |/ `- D
                DISPATCH_METHOD,
; _" |7 R: m" o) A9 R2 l! d                &dp2,: v; R4 O$ A/ H2 p8 V" v# q
                &var,
+ |* b+ b* p3 _" G) v                &ei,
, q4 @" |; C0 y7 q6 I; [3 d3 ~" \, D                &uiErr);
) f  l$ a2 J) l2 ?5 B; F7 o2 b! e- ~5 V. A; ~7 F0 ]
        SysFreeString(topicStr);4 D5 H: C4 g# O* R2 |
        SysFreeString(itemStr);  @  [5 I+ K3 R( ~7 d2 s0 E) f
请问该程序是获得extend里面的哪个值?
6 {! R) Z# N0 n0 Y, c* N2 K+ N9 g% P( |如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-4 08:49 , Processed in 3.142043 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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