设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7533|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:, y( n8 f0 q0 T( p
Name = (WCHAR *) L"Poke";6 L4 N9 J9 x6 C
                 , z6 b3 |$ e- D: H* v0 E
        hr = m_pDisp->GetIDsOfNames (/ x6 w6 n/ D9 ?% k  s) x. n
                IID_NULL,                                // reserved
4 _. ^! ]2 k7 ]  T' e7 e0 k0 V                &Name,                                        // Array of names to get IDs for
0 p2 D5 b3 b) {4 V. w                1,                                        // # of names in the array
$ e) v: r$ s3 r) ]+ _* t5 V                LOCALE_SYSTEM_DEFAULT,        // System locale
% j: _9 m+ C. d; P- Q# d* v! j                &pokeID);                                // Array of IDs to fill on output8 U7 }  C7 Z. b6 t6 B+ S2 p) Q6 [
                        $ |& G9 t( b4 T# i; P
        if (hr)
# y  B: I+ q0 Y                {
; f0 M8 u8 L! C  O7 J) \; P! X                MessageBox ("Get Poke Unsuccessful");/ v% P% P  h, a& n4 D3 u; s8 U
                return;
) u6 n" F0 d, u, p0 q$ B/ R                }! t& x4 ^6 \6 ~  w4 Y

8 l2 W7 ]3 S1 I: h, P, q7 x/**************************传递数据给extend**************************************/
6 y/ @& [+ y2 _. b2 X( w$ c        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
: g5 M' \' ^9 `       
- ^& u! G8 k! a4 `& }5 Y0 _% y         valueStr                                 = SysAllocString((WCHAR *) L"1232");9 F7 F( _: g3 W4 n$ z
        VariantInit(&pokeVariant[0]); - O, g3 t$ z3 }/ |3 G1 p7 @3 m% [
        pokeVariant[0].vt                 = VT_BSTR;# N$ r5 o8 C( E1 c* t* P0 }
        pokeVariant[0].bstrVal         = valueStr;
; _' {: o% |  I( N! L
- j5 e2 s4 I; a2 \7 H         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
- T) u+ `$ q# q& {5 [2 T( M        VariantInit(&pokeVariant[1]);
+ z7 O; n* _9 f; y- q        pokeVariant[1].vt                 = VT_BSTR;
# M. [: @' F2 r. k! G0 M, H1 B$ @        pokeVariant[1].bstrVal         = itemStr;
9 L5 f2 y! k1 b: H! Q$ g% S5 j4 s' B% f1 V; x
          topicStr                                 = SysAllocString((WCHAR *) L"system");5 j+ E$ ^. P6 }" s# D: }5 `
        VariantInit(&pokeVariant[2]);
) U, P. Y. W- f( h! z, i4 {        pokeVariant[2].vt                 = VT_BSTR;
# C4 |) M1 _0 k3 l+ b        pokeVariant[2].bstrVal         = topicStr;0 @# H0 M$ u4 p' v+ y
& U6 |8 u' J" z  {- T/ \' f
//        Set the DISPPARAMS structure that holds the variant.: R) B. [) r4 n$ w! X
+ f9 E/ W2 @9 y4 @+ e
        dp.rgvarg                                         = pokeVariant;& Y6 E- W9 a* ?2 B6 `0 z" Q3 Z" T
        dp.cArgs                                         = 3;
4 s; M2 d) h$ R5 s9 a        dp.rgdispidNamedArgs                 = NULL;
( e0 D) `9 V, T& h! u( s        dp.cNamedArgs                                 = 0;6 T3 p( C$ ~8 k

' G$ k/ v% e1 d& B, x, D: f//        Call IDispatch::Invoke()) q. D2 x" T- M/ M

) W9 P9 f- a0 q$ J; p7 T* M        hr = m_pDisp->Invoke(1 J- f7 m( ?! q6 |4 d4 u. `
                pokeID,3 L& S7 S' d- S, ~3 J  Z. B
                IID_NULL,. f. \! O" z) p9 ]& J+ e0 O
                LOCALE_SYSTEM_DEFAULT,
8 V9 _1 r% v5 n8 P3 k5 `+ P; y                DISPATCH_METHOD,
6 S, J8 L! N( S- T                &dp,
) A5 c+ l( n, ^7 |- N( Y                NULL,9 Z& L$ [* U8 E& V# C6 f! G5 B5 f
                &ei,
1 s1 j0 h3 _* _) X* w% ~                &uiErr);2 b4 ]  W9 q) v5 b

2 V! Z8 H5 \& u0 J        SysFreeString(topicStr);6 J* K: H1 W! |0 d1 J4 y
        SysFreeString(itemStr);7 J- h' ~" ~8 ?# K3 {0 h9 \, w
        SysFreeString(valueStr);
8 J6 y) v! {% w3 ]- V8 N% S1 x$ H1 M% B) S2 b
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???1 D; v6 [) D2 l) t
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????+ A! Z3 f4 p3 m7 u

1 d- ^9 F! f3 `3 Y+ x7 ?/ A: U& w$ `# e/ {4 i& v' x2 F
2.这是request的程序8 _6 b/ a5 a0 e% W4 [2 O
//  Request a value from Extend# o1 B8 W4 S& T+ ?/ s- s
/// V' p' `! s* e. k
//        Initialize the variant that will hold the BSTR.  Set the variant's
  l0 [6 u! `  \2 L/ q//        type flag to indicate the fact that this variant holds a BSTR. Place the
! z2 u0 Q6 @. R& B8 L) u; u3 b//        BSTR into the variant structure.4 Q9 k' |# t2 v1 M, o: I
9 e/ Z5 O, R7 _3 U: ?
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);) E9 j/ U+ V$ @5 b" J3 a2 c' a' J, v
        $ R& r0 p0 z% L5 Z5 _+ V$ z- _
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
7 Z( P4 ?4 P" w1 `# M        VariantInit(&requestVariant[0]); 0 G' Z. {: ~( s) {+ F7 v) @4 K
        requestVariant[0].vt                 = VT_BSTR;
" ~* S. z+ f' T6 g  U. _( w        requestVariant[0].bstrVal         = itemStr;
4 g- p( q: t8 C9 d
: w  j0 q& }- ^          topicStr                                         = SysAllocString((WCHAR *) L"system");
7 g* n0 l5 L4 B$ \        VariantInit(&requestVariant[1]); 9 J& o/ o7 m+ }5 r- x6 Z
        requestVariant[1].vt                 = VT_BSTR;
% N7 P7 D2 |$ q% m3 K( v9 g/ s3 X        requestVariant[1].bstrVal         = topicStr;! S4 `# C$ ~( B! \: F! d- _

+ H0 M- m+ q+ s4 l//        Set the DISPPARAMS structure that holds the variant.) _( Z1 J6 J1 Q( M: u0 C% D; G
+ e' [3 T1 n$ J# ^
        dp2.rgvarg                                         = requestVariant;2 L+ s# J" P1 O( Y; A: G  C
        dp2.cArgs                                         = 2;2 J. J, S3 x- d
        dp2.rgdispidNamedArgs                 = NULL;$ D8 q, K% H( R
        dp2.cNamedArgs                                 = 0;
0 _/ \$ Q# O4 v2 _5 x  v% b, S& `0 D# J/ Y: l
        var.vt = VT_EMPTY;1 V4 G; E' V. M/ j' Q4 j
9 t* J. O" U6 Y1 e6 T6 a
//        Call IDispatch::Invoke()
% g9 E  [/ l7 N- X, ?: M0 B9 f* [, |6 i( s6 o
        hr = m_pDisp->Invoke(* H! a( G& M1 L  n
                requestID," m6 c- W- B2 |- o" }
                IID_NULL,
: P4 U, p7 b6 m                LOCALE_SYSTEM_DEFAULT,
* K2 O2 j: N; l* ?9 t9 X                DISPATCH_METHOD,
3 O. p% @7 J; q# k                &dp2,
1 P* h: B0 e! G7 ?4 ?4 l                &var,: H# f/ r! \+ ]: B8 F2 x8 D, S
                &ei,
4 |8 a1 c% b+ L) m                &uiErr);  ]( H/ X+ l# o: x1 x. P+ a* @

2 N" e0 v% j' }& r8 E& u        SysFreeString(topicStr);' a& v$ k2 H6 t3 b1 Y  K8 i# C
        SysFreeString(itemStr);
( A! h6 V* c, q! x  V$ ?  Z请问该程序是获得extend里面的哪个值?
0 |$ H! W' D) j" h$ F) s如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-23 14:33 , Processed in 0.013587 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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