设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11149|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
4 H( b3 {' j5 XName = (WCHAR *) L"Poke";
  p/ e; R; n) a% X9 y1 d! O                
5 E6 b# o. \% L        hr = m_pDisp->GetIDsOfNames (
% X8 u$ A0 k& z( R2 j5 d                IID_NULL,                                // reserved& d7 B, ~; I6 o3 V- n9 y
                &Name,                                        // Array of names to get IDs for
: m; l/ Z" f, U' Y                1,                                        // # of names in the array
6 k* x9 S- N+ `# @, h                LOCALE_SYSTEM_DEFAULT,        // System locale
0 j- n! }, w- I. P                &pokeID);                                // Array of IDs to fill on output9 c/ M8 G  M$ l
                        * f0 x4 \& m$ Z# u
        if (hr)
9 z. I! a( _% [/ z1 q2 U: P( t                {$ L% h4 R4 m# R$ k9 C- }1 C
                MessageBox ("Get Poke Unsuccessful");
7 r) ^  r& @+ b                return;
0 O1 @% N' }* S; a: N                }
1 B" C- n3 _2 R  I
+ X$ h4 O; v/ Q8 x( E" G/ l  @7 Y2 ^! m/**************************传递数据给extend**************************************/! G# [3 v( k- R( @
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);/ t1 l% ~& m! x2 Z: f' q
       
1 M1 \6 M& p- d4 u9 A4 Y; K         valueStr                                 = SysAllocString((WCHAR *) L"1232");) [! f& m4 H: |
        VariantInit(&pokeVariant[0]);
+ v; c5 x  H/ Z) K7 X        pokeVariant[0].vt                 = VT_BSTR;
) h6 l* x6 T+ w) g# |) s        pokeVariant[0].bstrVal         = valueStr;
6 k: x0 q4 P( R' M; p
# G! \9 k0 u* e; b; Y4 z2 a+ s% y         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");: g8 T8 K& a; z5 b! ^7 Q- x
        VariantInit(&pokeVariant[1]);
0 w. v  F7 X7 I        pokeVariant[1].vt                 = VT_BSTR;
5 O! B; s8 H. r- Z/ T% B        pokeVariant[1].bstrVal         = itemStr;4 z, |7 n. s  C

/ ?( e4 I5 n, l( |. A          topicStr                                 = SysAllocString((WCHAR *) L"system");4 A* l0 o0 \, e7 }: H! W# g
        VariantInit(&pokeVariant[2]);
1 }; D/ j1 B0 m' V2 p        pokeVariant[2].vt                 = VT_BSTR;  o( u+ g. K1 T! r. o. f* U
        pokeVariant[2].bstrVal         = topicStr;
; x- f) o- R! n9 E" J
. G+ ~) H- b3 N5 ~. S1 j3 N) c//        Set the DISPPARAMS structure that holds the variant.
4 V: Z2 i6 D+ j6 c# l8 t! q4 r; N# @5 X& b) z
        dp.rgvarg                                         = pokeVariant;
2 v% r* V9 h! ?- Z0 n4 Q7 _- s; M        dp.cArgs                                         = 3;
& g) V0 \2 R6 A! A) a6 d3 {5 E: F        dp.rgdispidNamedArgs                 = NULL;
- g2 @- V/ r5 p' X) f* N7 ^        dp.cNamedArgs                                 = 0;( k+ M  u/ |+ L) u! |, h

+ r9 e1 [* C0 O2 n6 x+ r1 b* m1 x//        Call IDispatch::Invoke()
0 n1 L( Q5 Y, H0 t; ]! M7 h  ~* u0 d% L' g4 Z( \
        hr = m_pDisp->Invoke(/ U, f, e6 X" S1 q$ O* g" ^* y  |' O
                pokeID,  h: v( Q1 }: F, m+ p: `6 L$ k
                IID_NULL,
& K- p8 m% U6 N  a* i/ w, Y                LOCALE_SYSTEM_DEFAULT,
" U7 c% e1 D& W% P! ?& j) g                DISPATCH_METHOD,
* D# y5 V; e, h                &dp,
" A/ c) F) r2 c8 r) h, d                NULL,0 b/ Z9 y) p- C3 M, c7 c
                &ei,, V" }& k0 [- |) f3 v; L
                &uiErr);2 H1 a9 A, {8 Q  @' L

" f+ |1 m9 n7 H. F# J        SysFreeString(topicStr);5 _$ H1 S; \' H
        SysFreeString(itemStr);
! `% J% \1 m- {' G        SysFreeString(valueStr);
0 V9 A4 N" L' y  S% f+ N1 ~" ~
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???/ _% d( Q4 n* E
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
( t: R% N- M& @1 ?* s8 s, R
3 ]# {  x( {: D6 j5 D0 J0 A" a1 k! Z3 O/ k2 H7 k) ]3 A4 P
2.这是request的程序! m; i/ C4 K% h4 |- \  |2 b
//  Request a value from Extend6 X# K2 o9 l- f* N
//2 m* [% g9 B; s/ ?
//        Initialize the variant that will hold the BSTR.  Set the variant's: w( U1 I- I* G0 t+ ]" H) t3 w
//        type flag to indicate the fact that this variant holds a BSTR. Place the4 _0 B! x- W; G- g
//        BSTR into the variant structure.% z; y' Y4 Y- S' i# M! N

# Y9 I# X/ r+ @( ?+ m0 I- e2 }        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
2 ~  U. S: z. X, c/ @9 T" d       
4 A( f/ v' v* e# B6 [% k         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");  W0 z$ f/ }! q, x
        VariantInit(&requestVariant[0]);
9 S4 @! A7 W% {7 H        requestVariant[0].vt                 = VT_BSTR;
& ]+ Z: n" v, _, M" f) A; b        requestVariant[0].bstrVal         = itemStr;2 i7 p6 A* ]5 A: L: H
% e2 a; S# L; F; ]9 M
          topicStr                                         = SysAllocString((WCHAR *) L"system");* H0 g4 @# `  _  z: `3 D1 o
        VariantInit(&requestVariant[1]); 1 Q( Z6 Z- a9 ^; d
        requestVariant[1].vt                 = VT_BSTR;3 z) m5 x, ?0 ?) E* J
        requestVariant[1].bstrVal         = topicStr;
# o5 N& T5 i* X7 f/ y8 `, k$ P. a5 S" k1 d7 s8 d
//        Set the DISPPARAMS structure that holds the variant.
* s$ W1 b+ x' C( K) E8 o4 I- y' U5 N! J, t; ]$ ]
        dp2.rgvarg                                         = requestVariant;
% ^- S# K" V9 _, ]  g7 C0 N2 l        dp2.cArgs                                         = 2;* F7 k% _9 P( ?% {& T
        dp2.rgdispidNamedArgs                 = NULL;
, i) Z6 Z2 O0 I2 C        dp2.cNamedArgs                                 = 0;
9 ^; j- H! p  V+ G. O8 E" a; n* s4 d( U, @& g7 A% l( m
        var.vt = VT_EMPTY;7 F) z; T- v( Y1 [+ I: j
' Q: _( E. E5 e; S, J  R/ K0 m
//        Call IDispatch::Invoke()" T# k) ^" N$ J; f

) ~1 i$ L! U: G0 C) G8 u3 }        hr = m_pDisp->Invoke(8 m; _' W5 r& A% G+ Y
                requestID,
: y- \2 s  c% k$ ?6 \- X2 U                IID_NULL,# |3 \% D8 n. j- B9 `- T
                LOCALE_SYSTEM_DEFAULT,
! y; B9 |6 l) x6 C. |+ n8 k                DISPATCH_METHOD,
2 E, n* `: z7 U) |  s8 v6 o7 m0 a                &dp2,
. ^+ g4 K" [8 k                &var,3 d6 q: t# _& s, d0 e
                &ei,
; z# U3 j2 I6 t2 S% w, I/ S: G7 A) V( f                &uiErr);
- c' t. w$ k( y/ j. D) p2 t* k2 E) q5 a1 l" W1 X6 F
        SysFreeString(topicStr);
* U0 R  H. W9 u        SysFreeString(itemStr);0 D$ F; v8 j) o
请问该程序是获得extend里面的哪个值?; w8 q, e5 \( g  v# ~
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-6-28 18:05 , Processed in 0.017190 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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