设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10441|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
$ j! v  z+ o, R+ qName = (WCHAR *) L"Poke";
# }1 h  L8 a; M6 Q6 Z                 + ?# K2 h4 z' n8 b1 \' Y
        hr = m_pDisp->GetIDsOfNames (
3 q4 }$ K1 f2 \$ ]4 g                IID_NULL,                                // reserved2 @( u1 Y2 O! A2 x3 v5 ]2 n7 D8 q" w
                &Name,                                        // Array of names to get IDs for4 D0 W3 P8 D3 I/ L) G; O! n
                1,                                        // # of names in the array5 {" |- P( H, Q! `6 x
                LOCALE_SYSTEM_DEFAULT,        // System locale. y  G  v- O9 T  M/ `' e# ~
                &pokeID);                                // Array of IDs to fill on output
6 r8 X( S- O/ q7 t+ Y                       
! Q) I$ b$ z/ W( h( r7 L2 j( T        if (hr)
' n2 w) R; i( ?" f                {
: F" P1 o# l% V# [1 }: {                MessageBox ("Get Poke Unsuccessful");9 I! m" R- }1 F: Z7 v7 @
                return;$ A5 i+ o7 q! [' C8 R! x6 M7 e% H4 V
                }
8 ]( l: ^( f# j- d
3 k9 X& d- R- ~2 L* A/**************************传递数据给extend**************************************/
/ t; K7 ]4 E  T4 `- ?        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
$ S) R. j. @& p: |1 R* [       
) l0 ?* f8 R) ~1 \* W; ^, R% h         valueStr                                 = SysAllocString((WCHAR *) L"1232");
8 b$ O/ o! e$ O1 B& d8 w7 N        VariantInit(&pokeVariant[0]); % Q- d! ], h" l- ^1 y. k4 n
        pokeVariant[0].vt                 = VT_BSTR;' @( B$ d3 _& `4 n4 T9 Z
        pokeVariant[0].bstrVal         = valueStr;
3 ~8 {7 H' K  n+ G3 E+ j) ]( @9 ]: M) P6 e; }% X* p3 r$ _
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");8 P/ _& J/ \' d6 [& q( [
        VariantInit(&pokeVariant[1]);
" q, Q" \. R: }+ m# o! R2 }        pokeVariant[1].vt                 = VT_BSTR;) F4 t' [$ z8 c& ]  b# b
        pokeVariant[1].bstrVal         = itemStr;, \% w/ l% Q( }7 X
+ X# l; `5 k1 ~/ K" t9 A! X( k
          topicStr                                 = SysAllocString((WCHAR *) L"system");
, Y% S* ]* Q; e: P2 {6 E! V5 P        VariantInit(&pokeVariant[2]);
3 ~% C0 k, H# \5 ^# f        pokeVariant[2].vt                 = VT_BSTR;
$ M2 w$ n; E9 q        pokeVariant[2].bstrVal         = topicStr;
2 O; z* r% J+ S0 J- @: [/ p. S6 ~+ _8 ^3 ?% l: `* t! a- I+ n6 i9 q
//        Set the DISPPARAMS structure that holds the variant.
* b! z2 t0 e8 O1 w, J7 n+ J& D& E* N4 S2 q3 @6 Y
        dp.rgvarg                                         = pokeVariant;! |* ^0 M2 u  X  S+ W8 v% c
        dp.cArgs                                         = 3;+ X8 D( F) U" j4 O5 ~# z" t, \
        dp.rgdispidNamedArgs                 = NULL;; i1 O* ?2 ^9 l: @0 q2 m
        dp.cNamedArgs                                 = 0;# j  @4 T9 @* L, @2 r
  |5 o/ m% K" N! ^  Z  X
//        Call IDispatch::Invoke()( l% J4 e8 D7 x% y3 a

" u! ?( G) S0 O/ f        hr = m_pDisp->Invoke(! [) L1 g/ H7 f  a- ?1 c, a
                pokeID,
# `3 j0 K/ w8 q# V: |                IID_NULL,
$ Z! p8 A1 S+ ]7 Q% o                LOCALE_SYSTEM_DEFAULT,
. o% |" n, `$ _- E/ _$ y* y/ h                DISPATCH_METHOD,0 i7 y" e, U0 I' l$ m1 Q/ h# u
                &dp,
$ a( }( `7 Y! K5 I& _" D" c! u, d                NULL,
# e$ T1 x& f: I% G                &ei,
2 q- x3 B: `8 R6 w& ]7 t" O                &uiErr);0 C' j* k& R- E9 N' B: z7 m

1 m3 y* ~5 J: l  x3 Q9 g' r3 Y, C* K" @- U        SysFreeString(topicStr);* x' u- ~: P8 j6 p# ]4 E. K4 g
        SysFreeString(itemStr);( k6 ^5 B' X. f/ s$ N' n
        SysFreeString(valueStr);8 V: ^: z% T* G# s
  e3 I5 x$ Y% J; n8 f# |9 V# o( l
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
& Y) @: G8 k. I  l此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????) `% t& e4 }1 o& @( V. Q8 y( |

" {; _0 G. ]+ w6 y% F; ^  k) ?+ }" G" r- P+ q/ i8 N, C3 R
2.这是request的程序' {( C6 Z- c2 _# ~4 d
//  Request a value from Extend- I- }1 S5 s4 r' l1 d
//
- \0 p/ ^  E6 I3 {2 w//        Initialize the variant that will hold the BSTR.  Set the variant's# K0 b# M. c: ~2 Q* K* g" p/ x6 s
//        type flag to indicate the fact that this variant holds a BSTR. Place the
% J2 Z" s/ k" @$ u  C. f//        BSTR into the variant structure.. d6 w! T5 ]* m# o% A% p- k

; i$ t( ^# ^& O  C+ z" J        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
1 `" b$ q: h/ Q- ^       
8 H/ U/ c  \9 U  y) G         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
$ k+ F: L2 u1 p        VariantInit(&requestVariant[0]); & P6 x4 O: X( Y
        requestVariant[0].vt                 = VT_BSTR;& w) D+ a, H2 @7 g8 N
        requestVariant[0].bstrVal         = itemStr;8 |# {) e7 E; l5 y3 j) O0 i3 C

& ^/ g  K& F8 x/ j3 t# r          topicStr                                         = SysAllocString((WCHAR *) L"system");$ h! d, r7 t& x8 X% E; {9 k! _& \
        VariantInit(&requestVariant[1]);
0 w, J7 g& d9 g1 n7 @* l6 a! ]        requestVariant[1].vt                 = VT_BSTR;( n7 k4 {$ @$ M/ |8 E) Y$ P
        requestVariant[1].bstrVal         = topicStr;
2 S: j$ {8 {8 N' i3 G- y
8 p$ }) l& ?$ b% E  ^8 C//        Set the DISPPARAMS structure that holds the variant.* r# l* [9 f% J+ k
1 ]$ j- v: p) ?" G" h8 q$ X' d
        dp2.rgvarg                                         = requestVariant;5 k) S$ S4 U! c3 t; u
        dp2.cArgs                                         = 2;$ ?1 i% T: v  j1 P! P6 E" ^+ V( q
        dp2.rgdispidNamedArgs                 = NULL;" K6 J9 R+ ~3 b+ G+ R) ^  ~
        dp2.cNamedArgs                                 = 0;
* Z+ l: o$ j2 x: `8 \% y0 I! _* z& ^" `( y3 O- B9 x- G7 @
        var.vt = VT_EMPTY;* ~  r9 u; q3 K0 q

9 ]% M2 X, L$ T//        Call IDispatch::Invoke()
& f' N9 B3 R* S- d" N
. P+ v4 _4 k! p5 K6 e        hr = m_pDisp->Invoke(
* a) I. b8 N  Y% m, }- C5 O                requestID,7 w' C# N0 A3 ?" _# Y$ E6 f
                IID_NULL,
6 x! P- B# r" u* Q8 M                LOCALE_SYSTEM_DEFAULT," i2 o* c/ h% [" C. z+ w
                DISPATCH_METHOD,
4 l% y/ j8 k+ ~& @) P& `! u                &dp2," E) J8 }* C0 B& q
                &var,& I4 G5 \' |# ]( [8 ~
                &ei,; N: o" b  o; |) j  p, i; K
                &uiErr);
* I9 E- S, i, \7 |7 P0 ~; P) _6 `$ a( {8 t  u
        SysFreeString(topicStr);( b( @/ Q; p8 j
        SysFreeString(itemStr);
; d" f" z1 s# |+ t4 L请问该程序是获得extend里面的哪个值?
* F0 s& C% f* C/ o$ P% l* W如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-25 16:03 , Processed in 0.014273 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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