设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7876|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:6 b- x, x. {  K' b; W
Name = (WCHAR *) L"Poke";2 l" y- A+ Y; t
                
- p* O  x3 N  R  j        hr = m_pDisp->GetIDsOfNames (% \1 @% G& F5 |- K3 @: U. ]8 H
                IID_NULL,                                // reserved, B# Z5 O) `) ]
                &Name,                                        // Array of names to get IDs for
! K; ~# t2 c* g# V  h, ~+ O! s                1,                                        // # of names in the array' Q+ B! F4 Z* p; F- n) F
                LOCALE_SYSTEM_DEFAULT,        // System locale
+ Y* K6 k' ]9 ?7 K; h8 l+ U                &pokeID);                                // Array of IDs to fill on output
6 [( e# a) g9 O" L# R2 b                       
3 t9 m  Q+ Y6 o        if (hr)3 F# L1 S; y8 R. R( L8 h/ Y) o
                {% C7 U9 G. E' C1 @
                MessageBox ("Get Poke Unsuccessful");
; H/ M. y" n9 O; M. g" X' t                return;* D6 o0 c7 [! ^. t
                }
& U( f; S" `5 ?# d* _0 n. s  G" J1 e! s% [6 _3 M7 g
/**************************传递数据给extend**************************************/
9 l! J. s& J5 C) n        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
6 ?9 x9 O, ?( s$ R  ~        ( Q6 a) ?1 ]$ w9 b7 [3 G7 C3 w9 k
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
) [$ O0 n* }1 j$ r+ n+ }        VariantInit(&pokeVariant[0]);
. r3 t& P- Z0 W& {: I7 M: X        pokeVariant[0].vt                 = VT_BSTR;
. T  g3 {7 _+ o) }3 e$ h        pokeVariant[0].bstrVal         = valueStr;5 j) ~( a6 z6 `  c- W) r' F
( P/ V/ w+ |" b4 Q  Q: u3 v
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
! Y& T6 @2 V# U2 l3 Q1 I        VariantInit(&pokeVariant[1]);
* _8 ~6 C" W" B8 Q        pokeVariant[1].vt                 = VT_BSTR;
  p1 u5 l: _9 K' g1 \4 t        pokeVariant[1].bstrVal         = itemStr;5 W7 Z$ ~+ U9 l
* C9 s% f0 @3 P3 o
          topicStr                                 = SysAllocString((WCHAR *) L"system");4 i4 z: U" A+ {7 k5 \
        VariantInit(&pokeVariant[2]);
9 C: G% Z8 W# O5 v: w        pokeVariant[2].vt                 = VT_BSTR;$ W1 X2 L1 d' f) w. O& P0 q
        pokeVariant[2].bstrVal         = topicStr;
* Z1 Q+ }5 O) O5 m% D
1 J1 j1 a% ?. k+ T8 w! {5 D//        Set the DISPPARAMS structure that holds the variant.
  h$ N- t' N7 y
1 M( L  U$ |, l( |6 U- g        dp.rgvarg                                         = pokeVariant;
; P2 h" Z+ X# [( q, l/ m        dp.cArgs                                         = 3;" j3 k; R5 N' m6 S* h# g9 k6 T
        dp.rgdispidNamedArgs                 = NULL;: F$ D# i8 H9 E, s
        dp.cNamedArgs                                 = 0;
( K# C0 f  p# S/ I. a/ F( v6 _, J
  @) Z% T- ?& `/ L& w! Y//        Call IDispatch::Invoke()) d6 Y' J' ^1 A( e5 L
7 `: F' c( t' q2 g& N1 ^3 g- E
        hr = m_pDisp->Invoke(
, C5 S4 S4 \  l' j                pokeID,( W/ A  T- Y9 l4 q
                IID_NULL,
( a" A" q- U! r' @                LOCALE_SYSTEM_DEFAULT,
# U. E) e3 _& \* n3 n2 x: e4 y                DISPATCH_METHOD,6 G. r( R! {8 P0 o1 H! c) O
                &dp,8 I4 e2 e) [0 P% j  z  j
                NULL,
8 D4 q3 I5 g+ O/ h; ]7 a                &ei,# h; H0 ]! a5 t' }2 }1 ~4 q- Y
                &uiErr);
- B0 A9 O3 N0 L* X" R2 i' v$ ?7 A8 {$ p  C5 q2 F. @
        SysFreeString(topicStr);) i1 g9 p4 q' `2 O; b+ s
        SysFreeString(itemStr);6 x  [$ W! S, L* Q6 v9 g3 Z
        SysFreeString(valueStr);
! r, q. @( M) M2 j% ]  l5 ^: q; ~. m
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
6 b5 M, e3 p& }2 r: R, G- P3 r此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????2 Y# W6 I# l1 e0 J* M4 F5 Q" d3 W
6 x: S( G: r9 p
0 r) Y* s6 O5 B3 Q
2.这是request的程序
! A* r9 e2 D- L- ~& U- D! _+ \//  Request a value from Extend
1 ]" r& Y  O6 O2 M* u//
8 }6 F( P/ [& @% `4 K3 W; H( X: g//        Initialize the variant that will hold the BSTR.  Set the variant's! l, o2 u+ z; I$ J+ e# t, G6 @" Z. e
//        type flag to indicate the fact that this variant holds a BSTR. Place the
/ ?3 K$ T/ c# ?# t//        BSTR into the variant structure.
9 W- B& Z* }5 x( x& ?( ]
" z0 e4 D! h) _7 X4 f        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);* n5 v, X5 K/ m  d7 a: Y
        / K. I# C3 G) N
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");' O% }/ a! O2 z9 n1 b* M/ R6 U- r6 Z
        VariantInit(&requestVariant[0]); . h9 }: b& H# x2 h  _2 R) S
        requestVariant[0].vt                 = VT_BSTR;
/ L) Q% L8 ^4 u        requestVariant[0].bstrVal         = itemStr;0 @2 S* c2 H) C. ^

8 R8 k- @* Y  K* H" ]7 \9 g( z          topicStr                                         = SysAllocString((WCHAR *) L"system");
- K0 C* Z$ T7 ?9 a5 L        VariantInit(&requestVariant[1]);
' r2 O, h" d' d0 ^) t+ l        requestVariant[1].vt                 = VT_BSTR;
/ ]: D# r6 [# }) I5 b        requestVariant[1].bstrVal         = topicStr;
0 ]7 R" W3 ?* S) s' |7 g" R$ i; B3 b/ ~; {$ w
//        Set the DISPPARAMS structure that holds the variant.
4 G  `/ ~, {& D# `* s
) h" P1 W$ r  q: q        dp2.rgvarg                                         = requestVariant;
0 X& T2 ]0 w* V  @5 q! D; ~        dp2.cArgs                                         = 2;
, q+ p" }) j  I% d& }' @/ I) `        dp2.rgdispidNamedArgs                 = NULL;
: N4 K. O9 E& v- b        dp2.cNamedArgs                                 = 0;
) G) q# ~- E9 n7 J% o) n
- ]) v- k% x8 P- S, R1 ]         var.vt = VT_EMPTY;9 Y& e- F9 {% F% c& P

0 S% U( Z; M, Z! k$ c$ u9 Z//        Call IDispatch::Invoke()5 e9 j7 d  K) u/ n* h+ X

7 N3 D* x8 f! v+ e        hr = m_pDisp->Invoke(
! X) c& e# N1 u  r: j+ u8 K                requestID,
6 S; y: M, i$ b/ L$ B5 Z  c" i8 f: X                IID_NULL,1 G: W6 r5 ?, _( O! B/ z+ u2 J" I0 X
                LOCALE_SYSTEM_DEFAULT,1 H1 ~/ r* F5 X8 F
                DISPATCH_METHOD,
3 t+ A( R; L: v& A: z9 u$ r& @$ M" S                &dp2,
0 P7 F- k0 g! f                &var,
2 f4 D% j: y- t2 ]& W7 d4 Y- \                &ei,
3 T2 M: L1 n$ C2 ~& J                &uiErr);. L0 E4 B9 a( M" l# d

  I/ w: v0 }# [" \$ H1 v$ f        SysFreeString(topicStr);
- B7 {, ^# w) D- f/ g2 D9 i- n% `        SysFreeString(itemStr);
0 _4 S! ^8 \# z4 a请问该程序是获得extend里面的哪个值?
% N+ T( r! j) s/ C, ^5 t# i; B如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-6 01:36 , Processed in 0.020216 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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