设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8111|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:8 K* U7 x0 ~  A* ?' [+ }
Name = (WCHAR *) L"Poke";% @. W, S3 N$ t3 _7 S+ |
                
0 O6 r8 N+ k2 L7 I8 e0 p3 Y' i        hr = m_pDisp->GetIDsOfNames (1 y$ s* w! i% g: K5 B4 [, }
                IID_NULL,                                // reserved
% G  \5 k2 x1 {                &Name,                                        // Array of names to get IDs for) A8 p9 P+ H( Z; e( f- Q
                1,                                        // # of names in the array
# F& H5 J6 L5 m2 h8 c; t                LOCALE_SYSTEM_DEFAULT,        // System locale8 x+ B7 q! L( y! e
                &pokeID);                                // Array of IDs to fill on output
$ Y( Y" _  }8 H                       
! ~# O! c+ z" ]# d$ U; h0 F2 q$ C        if (hr): p2 H+ w0 l" h' j- N* F
                {5 G* V1 H' |8 U
                MessageBox ("Get Poke Unsuccessful");% y9 f/ @% Z  N
                return;7 F1 d0 M) D4 r7 _( r  I+ ~+ I
                }
/ L! u' M- ?- ~. g( z7 @3 H
2 r- [: c8 w* z1 D  N6 u; X/**************************传递数据给extend**************************************/
* M/ @( x$ ?9 U        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
- Y# j9 k: {  j  O+ }       
5 Q9 P/ V! ~2 B7 l, O( X         valueStr                                 = SysAllocString((WCHAR *) L"1232");
$ r# R1 _* W8 P! h4 P/ g        VariantInit(&pokeVariant[0]);
6 b; c' j! _8 x; b. ?! F6 x        pokeVariant[0].vt                 = VT_BSTR;
" D; [4 H9 \5 N" N        pokeVariant[0].bstrVal         = valueStr;
! g1 r" O( @( x7 S( h% N) Q2 o) }' g3 S6 Z$ H
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");5 z/ l) _+ y- t2 e' e# ?: ?
        VariantInit(&pokeVariant[1]);
  s' Z( V- H, ?& l  g% f5 F        pokeVariant[1].vt                 = VT_BSTR;' C% V( g9 `. @5 @
        pokeVariant[1].bstrVal         = itemStr;
% q" K3 n0 Q: t1 e+ K7 E2 P! c) I8 E( h6 R. m/ ^. S, w9 H
          topicStr                                 = SysAllocString((WCHAR *) L"system");2 {' T. S+ }/ [, T' r$ P8 _' K
        VariantInit(&pokeVariant[2]); ; G' A; J- X8 B% m
        pokeVariant[2].vt                 = VT_BSTR;
5 j( _4 C! J1 _" x0 e        pokeVariant[2].bstrVal         = topicStr;! }1 s7 ^* @7 L

) x, V0 o3 Y5 I# h//        Set the DISPPARAMS structure that holds the variant.
; N3 Y) S; E; E$ H- U. r; r( l8 R/ ^1 H+ F2 Q' q& Z
        dp.rgvarg                                         = pokeVariant;/ L8 X9 }, x  J& V1 C* d  w
        dp.cArgs                                         = 3;
1 s! b8 E5 ~1 t; [, \% B        dp.rgdispidNamedArgs                 = NULL;+ S* N( u3 T7 a6 v
        dp.cNamedArgs                                 = 0;
# _8 i; q, R% ~: w3 {& G8 L* f* X: N8 G3 F
//        Call IDispatch::Invoke()
5 i: r/ N) j5 i" i+ V! g9 S: @( Q! T/ d- g# S/ U; v
        hr = m_pDisp->Invoke(
3 P' e: p2 d, p6 @8 G! r; k                pokeID,
4 M: @+ F' m. l                IID_NULL,4 _3 Z; d; w+ h
                LOCALE_SYSTEM_DEFAULT,! r3 r) v' b# ^
                DISPATCH_METHOD,
6 ^, \: @0 p; C( T; O                &dp,
. V2 b/ V; f: n9 i+ R) _                NULL,. a0 X* B1 Y+ q! ?9 m, i
                &ei,
' o0 J- k# q2 G) d" F8 }2 z                &uiErr);& R8 \% |" e+ M

1 I/ t$ ]/ O1 p! v7 q, K2 K/ `4 a        SysFreeString(topicStr);/ b7 Y# l( V0 r$ c' J, P% T2 F. e
        SysFreeString(itemStr);
( A, Q1 B+ t$ L7 Q5 E2 k        SysFreeString(valueStr);
4 V1 Y* D7 O) O5 P: ?( N5 D) e
4 S# Q3 R; a. c+ L现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
5 y* z3 X  E9 H此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????; V& ^7 |9 V- r0 h3 g  k7 d4 f8 S
8 v! `- b5 k2 _1 [0 T, {. V

% Z5 G. s( m* _6 h& c. |: p2.这是request的程序
+ O# ^1 L: W8 G% d6 U4 m  Z//  Request a value from Extend
) d3 T) w9 {& z, |  E//
% i- o5 ~* c: t6 Z: Y4 F" T//        Initialize the variant that will hold the BSTR.  Set the variant's
8 ?5 u* I( T9 R2 S' l+ o* X$ l4 c. @+ k# C//        type flag to indicate the fact that this variant holds a BSTR. Place the
/ J+ W. {# D4 @, ?& g) q//        BSTR into the variant structure.6 g5 H: Y4 m4 H7 L5 L+ Z/ m$ A$ N- K" o
) x) Z0 n( t. o
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
9 p' H* |. r" X+ x( r9 w       
- Y8 M2 K4 J! k3 l6 n. _! e# E1 {         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
1 Q" n+ D1 k4 J  ]8 x( B2 g9 t        VariantInit(&requestVariant[0]); % @; V' E3 s3 V! c$ D. P$ _3 W5 Z
        requestVariant[0].vt                 = VT_BSTR;/ L- y8 S  j, C- _: ?6 N
        requestVariant[0].bstrVal         = itemStr;
5 m2 A6 y3 H6 G; \' K8 Z
1 X  J0 I# y( a+ j" V- f/ K% ]2 s1 H          topicStr                                         = SysAllocString((WCHAR *) L"system");( f0 v6 _8 z0 n$ W
        VariantInit(&requestVariant[1]);
2 V: |5 P, r4 Y- c! k( m6 u        requestVariant[1].vt                 = VT_BSTR;/ K+ M* p$ E" T- B5 m) G5 {+ m
        requestVariant[1].bstrVal         = topicStr;
" T& H) g6 M2 E. T1 r- i# ]% |
//        Set the DISPPARAMS structure that holds the variant.
6 M) U+ l; b, L% Y" a2 M6 \9 {6 S8 j9 r: z5 P: q
        dp2.rgvarg                                         = requestVariant;
: w" j; h* A! w: I        dp2.cArgs                                         = 2;
! j( }0 u; U% e, t" O        dp2.rgdispidNamedArgs                 = NULL;
) c; j' l5 }: D8 l, y        dp2.cNamedArgs                                 = 0;: p3 S' u) Z2 l9 M! p# S" ~

. x5 [! S5 _; J. |. F         var.vt = VT_EMPTY;7 e& X0 H: @% v7 c3 H
, o) s9 k! E# G4 ]1 m
//        Call IDispatch::Invoke(). r6 `8 n& Q$ R9 a# \/ b! x+ ]

( i/ S+ {2 X+ m7 Q7 e        hr = m_pDisp->Invoke(4 h1 B, V- ]7 [" [( l
                requestID,
$ [! E* v! ]+ v* s9 f                IID_NULL,/ t) J% h% T6 b6 n  ^. h
                LOCALE_SYSTEM_DEFAULT,0 F, f, a4 b* @) T! g
                DISPATCH_METHOD,
8 e& i1 z: E: |6 g' e3 B7 v8 @+ U7 ]                &dp2,* R" w5 V1 u9 a& S; x* s- @# n
                &var," ]$ [3 B4 C, q9 |1 d! h% J' ?: V
                &ei,
5 _# o5 G1 Y3 m- p                &uiErr);
# n5 b* o" V2 ~; e& }1 ~' {2 o! j0 @* X
) {4 t5 Q# c) E        SysFreeString(topicStr);
) o, n" }: f+ A        SysFreeString(itemStr);5 F! f7 B$ U% z) O. m. A
请问该程序是获得extend里面的哪个值?
4 w- N0 M0 S5 x7 _7 w如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-15 09:38 , Processed in 0.017431 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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