设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8527|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
; O. z2 h4 K3 U( n% C" HName = (WCHAR *) L"Poke";
: e( t3 q# q* e6 l4 K# \7 X                
' d0 N" r" [; ?) j- P, s6 d4 o        hr = m_pDisp->GetIDsOfNames (
- W, k* j/ ^3 `, t                IID_NULL,                                // reserved  @- G0 E1 D7 A: T& a/ f1 a# i
                &Name,                                        // Array of names to get IDs for
5 g% }8 d: s4 ^" s" }# i2 S7 n                1,                                        // # of names in the array
+ }: I. s# o7 Q/ w/ y; ^                LOCALE_SYSTEM_DEFAULT,        // System locale
4 Y" ]9 ^: Y1 o5 g0 T% L                &pokeID);                                // Array of IDs to fill on output3 T. M" g5 O0 c! `! |8 ~" Q' }$ A
                       
* C# s' K5 T, I# @+ s        if (hr)) Q/ a0 B' Q! V  t7 E6 f
                {
7 d, c: i) Y6 E8 M! E" T/ p# m                MessageBox ("Get Poke Unsuccessful");
7 @" Q( p$ {' n  O' {                return;" f3 `% O; R  G9 C  t  T: H
                }" t+ k6 q0 R5 U) }7 }9 H$ z7 p

  }( H. N. o$ H/**************************传递数据给extend**************************************/
. P) f1 K$ u) u$ G7 \2 u+ S        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
) r; y, _6 s& Y" V       
8 Y% }# t5 v1 k4 J+ Z1 v% d2 G         valueStr                                 = SysAllocString((WCHAR *) L"1232");
7 I$ L8 Z5 p2 M0 g: C, c6 F        VariantInit(&pokeVariant[0]); 7 @# ~9 ]3 G% G7 U* o7 A
        pokeVariant[0].vt                 = VT_BSTR;
: @, s8 i8 R( G+ z8 k3 l        pokeVariant[0].bstrVal         = valueStr;  E6 Q1 q) L+ F8 r% [
2 T' q! j- V* ^+ i2 b* n' [7 t
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
& U$ x9 V/ R/ T) `7 ?        VariantInit(&pokeVariant[1]); 6 V3 `, p8 @4 b; I' x" G' U5 p
        pokeVariant[1].vt                 = VT_BSTR;+ f1 u& A* ^- e; ]4 f0 l/ o4 [
        pokeVariant[1].bstrVal         = itemStr;, g5 w1 \9 G6 D4 \8 T
/ D  X8 q% ~$ G& D  T
          topicStr                                 = SysAllocString((WCHAR *) L"system");
! g4 R( I4 R1 _, i6 e& I        VariantInit(&pokeVariant[2]); : E  F5 x# ?! {6 T4 b0 |
        pokeVariant[2].vt                 = VT_BSTR;
) @  I2 E) A2 I3 j$ e( l# L' a0 |        pokeVariant[2].bstrVal         = topicStr;
9 b9 R' K  {& x" x6 |: d- y/ x  H) z# o% R* L9 i
//        Set the DISPPARAMS structure that holds the variant.
: d& o) J' n0 q" ^/ h! E) ?' F) ?
+ Z/ P5 X% W6 N0 D0 P, Q  H0 N, S        dp.rgvarg                                         = pokeVariant;
7 \+ `! R- D6 q6 u8 v1 }& L$ T        dp.cArgs                                         = 3;
; f8 N2 I% Q  f4 a        dp.rgdispidNamedArgs                 = NULL;
+ v1 J& B1 f3 w/ ?8 U! K        dp.cNamedArgs                                 = 0;1 Q9 L& X* e2 Y3 i
8 t0 T7 G, {. @) _1 N6 z( f
//        Call IDispatch::Invoke()7 ]3 q% ^) a5 H
, C: m, o0 [0 V4 u: ?: ^" }, H+ s
        hr = m_pDisp->Invoke(
9 A. I$ f/ R0 N0 U1 N; |9 f+ X                pokeID,$ P2 S6 Y7 F, s' Z0 E
                IID_NULL,
& Q6 X) p6 b: l                LOCALE_SYSTEM_DEFAULT,' F* f! |1 f9 |
                DISPATCH_METHOD,
% p6 x$ K  @6 x* ^% W9 m                &dp," l# T7 w6 A8 _  Z0 C6 o% I) V
                NULL,
" q3 D; M: A& U% V                &ei,5 o5 Z7 C1 m# p$ {" n
                &uiErr);" ~9 H: F( j( \
( H6 R3 E' T8 Q% p+ j* w
        SysFreeString(topicStr);4 _, R+ K% s/ S& j% Q7 y3 V
        SysFreeString(itemStr);* v! b( Z$ Q$ s' H4 R
        SysFreeString(valueStr);; V! Y! h: z* N: D# E

9 l) w2 R5 a2 t/ n0 \6 J- g; {现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
. M: |+ X5 c; |& w6 G此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????7 C" b! o) ~; ^

2 B+ N4 F) x8 @' }/ H- ^
0 m1 z9 o. |$ Q' q, P6 z2.这是request的程序2 z3 J- S# A. B5 y. N% [; e- q4 g
//  Request a value from Extend4 r- R, k4 F( R- a3 G, m" I8 h
//
* O. V* E& k& ^, \% u//        Initialize the variant that will hold the BSTR.  Set the variant's- M5 ^; r+ y. c
//        type flag to indicate the fact that this variant holds a BSTR. Place the
7 W4 u6 [7 y& Q8 G% I/ ?. R//        BSTR into the variant structure.
7 K/ t$ D% C1 T  z% E& ^- @" y) k9 s9 r3 q8 i
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);/ n* ~- ~( T; n( F" L( b8 |
       
+ n5 r8 q& T/ H4 F+ P' {4 j- N* R         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
& y9 z4 G4 `& \# [4 ^- \        VariantInit(&requestVariant[0]);
0 [; t: e+ K4 V; F7 N. J5 H7 T! d- }        requestVariant[0].vt                 = VT_BSTR;& ]/ t, s. S' F8 C
        requestVariant[0].bstrVal         = itemStr;
4 k+ y& \2 n7 N* x; H* c; a  f1 J, T6 m0 v  U  L
          topicStr                                         = SysAllocString((WCHAR *) L"system");. X2 B2 t. z3 T7 _* ]4 o
        VariantInit(&requestVariant[1]);
0 V- }9 u* ~7 g3 M, Y. t; ?# A        requestVariant[1].vt                 = VT_BSTR;, A, t2 Z( b% F! ]  `6 Q
        requestVariant[1].bstrVal         = topicStr;! U& R! R! u: Z+ }0 e% w
* Y7 u9 ~1 A7 ~7 L! k" @" E
//        Set the DISPPARAMS structure that holds the variant.
) u( j. D0 ^) P' B: _
- T/ b! ?9 A8 H        dp2.rgvarg                                         = requestVariant;+ E+ e9 \  ?* u, y" m7 t
        dp2.cArgs                                         = 2;2 J' }: Y! V" o8 b  f# J6 [
        dp2.rgdispidNamedArgs                 = NULL;
, q  D$ i/ ~' s; B! V        dp2.cNamedArgs                                 = 0;
9 d/ T! J9 y. Q9 }  C; `7 X) F  Y! u- `" C2 r
        var.vt = VT_EMPTY;- z6 ?2 o' U# v& v3 z" R9 L, [" A
5 w( P- }+ i( c5 ^% a6 \5 Q' I
//        Call IDispatch::Invoke()7 T% M+ i4 i* A( K8 B' K
  p# g6 D* E, Q% T3 B
        hr = m_pDisp->Invoke(2 E, [* w# E* }- c% T$ {6 O
                requestID,
3 f6 v: g. z% J: c6 Q                IID_NULL,( v+ I/ p  p+ @, B
                LOCALE_SYSTEM_DEFAULT,9 q; i$ z4 L8 z, ^
                DISPATCH_METHOD,
( p. Y3 Y; G8 Z; y, \- a1 h3 F2 k                &dp2,. c& E: ~9 Q2 N* ]" w, ?
                &var,4 |- U! E& M: t% \: }5 r' P
                &ei,
* r& K7 d1 G- a! T5 A* N                &uiErr);
# G1 `; C7 K3 a; ~( i3 B' S# x2 [) ?! a8 p, W- o, V
        SysFreeString(topicStr);
( a7 f& I% U- D        SysFreeString(itemStr);
" f4 C9 \3 `6 n( r; F请问该程序是获得extend里面的哪个值?
8 H/ K6 X7 [, s4 Q7 u/ {$ T如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-3-4 14:21 , Processed in 0.015367 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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