设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10646|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
" k0 ?1 A% J& H7 BName = (WCHAR *) L"Poke";: J% B0 Q. \8 z
                 $ h8 o! I' f- Z! J
        hr = m_pDisp->GetIDsOfNames (
3 ]0 A7 i" D% G: m- e0 P" s6 F                IID_NULL,                                // reserved
3 D  Y) T  l$ X, u& i3 C                &Name,                                        // Array of names to get IDs for
. n, H' `; `) `6 ]1 ^                1,                                        // # of names in the array
  h$ X' h5 C6 H                LOCALE_SYSTEM_DEFAULT,        // System locale& D8 j7 E  I. x# g- d8 _" \. s
                &pokeID);                                // Array of IDs to fill on output
" ?# x! f3 c' }( z* W9 G+ Q; t                        " a/ d* g7 T. v# z* q; H1 H# m
        if (hr), g9 G' s8 e  f; _" z9 R+ N
                {# g, h+ M8 g! M- X+ Q6 Y; x
                MessageBox ("Get Poke Unsuccessful");
4 Q2 o) z4 A. W4 p6 \3 e5 e                return;
2 D/ m+ o1 ^9 F                }
  V) [3 F3 E) p) V3 S5 P! ]9 I8 t7 D) p4 f2 M3 `
/**************************传递数据给extend**************************************/
' d% {6 L, Y. ^% e* x6 P3 |        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
9 I) Q3 K+ ?3 P/ |. [       
4 e8 q# D6 A! j5 d$ R' k         valueStr                                 = SysAllocString((WCHAR *) L"1232");" ?* I# R# D/ W: R4 ~% G8 w" i
        VariantInit(&pokeVariant[0]); + o9 o# r! D5 l: M' W
        pokeVariant[0].vt                 = VT_BSTR;
0 w! Q4 D" M6 E        pokeVariant[0].bstrVal         = valueStr;
% w0 f( F( c0 y# J8 T* Q, A/ u  [- T* _8 O3 X; T
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");! q. L2 O& |' g% O: o4 V% s
        VariantInit(&pokeVariant[1]);
+ d3 ~9 A# u5 V: J5 A$ L0 z0 i        pokeVariant[1].vt                 = VT_BSTR;
5 Q3 Z% K/ z* _        pokeVariant[1].bstrVal         = itemStr;
) w& w+ h+ W. y& P$ p6 l/ Q6 d4 `6 [6 l
          topicStr                                 = SysAllocString((WCHAR *) L"system");2 `. Y2 x9 O4 U) w$ e: D# F
        VariantInit(&pokeVariant[2]); ' M9 f( A' y8 |  E
        pokeVariant[2].vt                 = VT_BSTR;
# }" F" p$ J2 g        pokeVariant[2].bstrVal         = topicStr;
, }% W( ^& V+ K
; L6 x  U% Y, r4 P0 R- |//        Set the DISPPARAMS structure that holds the variant.
  J) Q) T6 M+ ^  C* s5 [- f
' K* G# H: M1 \2 L2 G, A( E        dp.rgvarg                                         = pokeVariant;/ V, h* |/ c# T) s9 y& b  r" o& Y2 t
        dp.cArgs                                         = 3;/ ?+ L& T6 V3 T$ f
        dp.rgdispidNamedArgs                 = NULL;
' T* p6 ?3 V: {7 G2 W        dp.cNamedArgs                                 = 0;
& W4 V+ c) n- n* ?5 S5 A5 X' A
1 p  j- m5 H6 Z8 n4 d! g+ V, R; e( r//        Call IDispatch::Invoke()
# K) `. b$ a* Z
8 ~5 D; n9 b7 ]: A        hr = m_pDisp->Invoke(+ a4 ~8 Y' W. c9 f/ c/ x4 B
                pokeID,
, i6 ]) W# G3 t                IID_NULL,
" k) D" q) X9 ?8 [  |! v                LOCALE_SYSTEM_DEFAULT,
1 G3 w1 K0 g. h+ `                DISPATCH_METHOD,
/ t; N8 C8 U' e) M( ~, B, Z# b8 d                &dp,
- N1 g3 T8 ~) Y! K                NULL,
, h9 Q; [, G( u: z                &ei,
) J+ A" d( ]5 ~8 J; C3 R. F                &uiErr);' _8 J5 m8 K- ?, M6 v3 o" B8 {/ @+ y
( i; q, ~0 ]$ Y7 _- c$ s
        SysFreeString(topicStr);
; g& X$ j7 w9 J) \        SysFreeString(itemStr);
. E; `, d2 C2 Q; u- ~0 ~% a7 e        SysFreeString(valueStr);5 ~, S* G4 q( c  f

7 Q* `. v+ n. h6 |, i现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
8 k" s5 T1 |) u, O/ T此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????. d+ h9 v2 U, Q2 L# T1 n0 n
: b( H, H9 b4 j( @1 N% M; t
+ ~8 t9 F2 t: E* s9 t$ x
2.这是request的程序% c4 \3 G. S2 E0 u6 v1 o
//  Request a value from Extend4 C7 D1 F8 r5 S
//  w4 |2 o$ t+ Z0 _) Q1 \( g! r8 p, n2 ^
//        Initialize the variant that will hold the BSTR.  Set the variant's8 z" M2 X- Y" Q$ o
//        type flag to indicate the fact that this variant holds a BSTR. Place the" _: q' d6 C3 Q  i. e. t
//        BSTR into the variant structure.: c% X% {/ k' j5 W* l' \" \

2 a. ]  w7 }9 U9 G1 s        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);4 j& ~1 |+ _/ s2 K5 R
       
7 e- n( o6 S* G3 O5 l         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");3 _- g/ e. N( W: u) y9 @- k$ C
        VariantInit(&requestVariant[0]); 6 C0 `8 b% w; Y- k
        requestVariant[0].vt                 = VT_BSTR;  q; k$ c7 s- s/ }0 R0 F
        requestVariant[0].bstrVal         = itemStr;
) [+ l& c) K. ]  v
  P5 K: T8 {4 B          topicStr                                         = SysAllocString((WCHAR *) L"system");
( s6 i7 ~6 g8 n1 f. T, Z) Q        VariantInit(&requestVariant[1]); 8 u+ @5 k9 ~$ R2 }4 v2 B: n  p( \5 t% L
        requestVariant[1].vt                 = VT_BSTR;8 H$ V7 C. K# Z2 f: T1 v/ N
        requestVariant[1].bstrVal         = topicStr;
2 J9 J/ l! f1 z# L; A
( z3 |& A  {) Q- i, C4 U* X/ f! o//        Set the DISPPARAMS structure that holds the variant.+ n4 {9 E/ {& p; v( [4 I. Q# B
3 H4 g- t0 r% Y* Y
        dp2.rgvarg                                         = requestVariant;
) N+ K! N1 L/ S        dp2.cArgs                                         = 2;7 F; w1 L) e% u  i  c9 P
        dp2.rgdispidNamedArgs                 = NULL;; s0 S4 c, F) M  w
        dp2.cNamedArgs                                 = 0;( m8 ?4 _/ N; C; e

) O& N: B% `( L         var.vt = VT_EMPTY;8 m9 C  e6 }0 G, z8 s5 B
) b/ d4 s, v5 Z3 E( v! Z
//        Call IDispatch::Invoke()
2 R! D! m- n+ E6 G  E7 \1 C; ~
. ?, a& I: E# U7 C2 A        hr = m_pDisp->Invoke(
! H* U5 X6 W0 A0 m8 \! V                requestID," k, |7 ^  r  F4 K+ F$ g
                IID_NULL,6 f6 q0 d5 j3 c  W. A0 K& J  G
                LOCALE_SYSTEM_DEFAULT,
: h! p% b* ^: E9 P+ }                DISPATCH_METHOD,
2 P2 s0 K4 M- y5 U* R, W& D! R                &dp2,
1 w( h0 G5 L- @. W                &var,
) `9 Y/ L9 m- c9 U                &ei,; m% Y& G0 t4 t; ~$ j! n4 D
                &uiErr);
6 @8 {1 F$ P, \8 ]$ U0 v+ X% q8 @1 _  u3 @" T& L9 P
        SysFreeString(topicStr);0 F6 T* b, F& d$ o# h6 F  J! M3 J6 Z
        SysFreeString(itemStr);
3 ?  U2 j* ~% A/ s请问该程序是获得extend里面的哪个值?
3 f% I! }- Y/ k  v8 I如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-6-5 08:18 , Processed in 0.016220 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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