设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13229|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
+ t! D5 [" \0 r8 P- X3 QName = (WCHAR *) L"Poke";4 x1 h0 W2 g  c; ?9 B
                
4 N9 U/ f% T' ^$ u! o        hr = m_pDisp->GetIDsOfNames (' h& z$ C% Q4 R1 p
                IID_NULL,                                // reserved
2 r( O% o5 ~# X4 j                &Name,                                        // Array of names to get IDs for
& y- i6 [  Z, A, X& A' }, g                1,                                        // # of names in the array) e1 m# i5 _! F2 G; `
                LOCALE_SYSTEM_DEFAULT,        // System locale
9 H( j/ i9 ?& I                &pokeID);                                // Array of IDs to fill on output8 B4 [7 G  P# w# Y  b; r* p
                        4 c# b: t4 D/ q; d$ r$ d7 c
        if (hr)
- P: A8 Q4 h  K0 J1 L3 ^                {1 f4 P1 Z% D1 }& H3 e! i7 L
                MessageBox ("Get Poke Unsuccessful");
) ~6 j1 W4 _. ]1 _5 W* l( q                return;9 S: t# s6 B( C$ V/ T3 S
                }# s" K; |- |) n; ^6 S9 e6 W  @
# [9 ^; u1 K1 i
/**************************传递数据给extend**************************************/' o0 F# v% O. L7 e# |: @
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
7 Z7 @* g6 w4 K* a2 O       
) c5 J1 Q2 x0 a         valueStr                                 = SysAllocString((WCHAR *) L"1232");$ U( l% c! V8 }
        VariantInit(&pokeVariant[0]);
; ]& q7 d! c' o! v/ Z# @        pokeVariant[0].vt                 = VT_BSTR;* }: L. M1 j- @: B0 R+ U5 \
        pokeVariant[0].bstrVal         = valueStr;/ Y: _' v2 _. M

1 f1 g) F2 E8 ^         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");0 {& }; l3 f0 R9 ?0 F
        VariantInit(&pokeVariant[1]);
& s: a' ?' W: f        pokeVariant[1].vt                 = VT_BSTR;5 z: O- W. c; D2 M( g
        pokeVariant[1].bstrVal         = itemStr;
* f3 e( i8 z$ D7 I7 h/ ~+ J  j, U8 ~4 f
          topicStr                                 = SysAllocString((WCHAR *) L"system");; Q- w# a) Q8 A" U* q) H. T7 N
        VariantInit(&pokeVariant[2]); 6 E& U! I& t6 ^! p7 v, p
        pokeVariant[2].vt                 = VT_BSTR;: v3 ?" R3 |* a4 M% u1 a- K2 h* h: F
        pokeVariant[2].bstrVal         = topicStr;
+ P: v% ^' r- x$ w) w7 ~* Y  I+ A6 x0 _( P; e/ X% [6 r
//        Set the DISPPARAMS structure that holds the variant.+ v% W2 a: p9 b$ a9 J! G: U0 B
8 A4 i& ^' X# m' ~. b
        dp.rgvarg                                         = pokeVariant;
: c, K% e4 |4 N4 l) x2 b- T        dp.cArgs                                         = 3;
* U& M/ f' p5 q: L' y  d5 ]5 R' }        dp.rgdispidNamedArgs                 = NULL;
5 V& \% z5 i" r' ^        dp.cNamedArgs                                 = 0;9 t: q1 O3 H) M- W

8 V3 J6 V. g& P% |& S' f- X//        Call IDispatch::Invoke(). P" m- z# E, M& C

+ e8 K1 j) X' U' M        hr = m_pDisp->Invoke(
$ n& U1 w3 g3 S                pokeID,
1 w* w) e( B3 O8 _+ d% |; v                IID_NULL,
9 E0 H" V( j/ j% O- y, g1 d                LOCALE_SYSTEM_DEFAULT,
9 x$ p3 @. b, T                DISPATCH_METHOD,
- u1 {9 _5 E1 q$ G$ R                &dp,
3 q& ~, C+ x4 `6 Q% I; U4 T7 R5 B1 ^                NULL,6 V+ z5 B3 ^& x
                &ei,
( ]" a$ m2 [& H. u& z, g; B' z                &uiErr);! }5 Q6 E# Z$ P! I& `1 X% a

# l: Q1 j; v, C  T# p        SysFreeString(topicStr);8 _9 N# l4 u: i6 g  O8 J1 Q
        SysFreeString(itemStr);
0 P& p  W. z, m. e! R2 T        SysFreeString(valueStr);
) [3 O( F& _9 E* L* C# l. G! w/ q; F0 S) z( ~; l0 u& P& X
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???$ H; F3 M5 V, `$ P' R) U% J
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????$ J6 [; w* `2 z  ?

0 w6 z) b- v* @0 {. _' V6 f# e: L) [1 _3 L( [5 Q
2.这是request的程序
1 u! C+ E- k& X- Z//  Request a value from Extend
3 c" W7 S1 r( m( W//  M: ^' j7 c* O; T+ G, K7 T, W
//        Initialize the variant that will hold the BSTR.  Set the variant's
# b' F1 j- K2 v% B/ ^4 W6 v+ _//        type flag to indicate the fact that this variant holds a BSTR. Place the
5 L+ _- a, E) y//        BSTR into the variant structure.% H, P- j9 G4 L5 f3 p( I* \; C) \8 j
* C8 x2 C/ h6 P4 ]% A, s
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
) g5 V: c# M; i# \6 o/ {. h0 E        . [0 Z6 L0 a% `) A( a/ v1 i( b
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");4 A6 R3 M. ?! B8 x( H+ x) o* }- f
        VariantInit(&requestVariant[0]); 2 C. t8 d- B9 E( p, P1 v; Q
        requestVariant[0].vt                 = VT_BSTR;4 Q, l" b/ y" K
        requestVariant[0].bstrVal         = itemStr;4 R( n" Q; N8 V5 M8 V4 Z" n; b

/ ^# w- i% q- s/ p8 I7 R7 X  i          topicStr                                         = SysAllocString((WCHAR *) L"system");
3 [' [1 ^% M; x3 m        VariantInit(&requestVariant[1]); 0 B) {8 |9 @1 S" j9 N3 N0 ?
        requestVariant[1].vt                 = VT_BSTR;' K- b; ^6 d# d* A! N" l  @
        requestVariant[1].bstrVal         = topicStr;. I) q) e8 E1 P# i3 k6 w3 g) \' G
6 `9 I9 _* E6 A5 {
//        Set the DISPPARAMS structure that holds the variant.
5 k  B; ~: L- M* Y* g. O2 C) c3 k/ D  u3 v" U6 D
        dp2.rgvarg                                         = requestVariant;
5 c8 K! A0 I$ L1 V        dp2.cArgs                                         = 2;6 f5 ^* y, `- b. V' f
        dp2.rgdispidNamedArgs                 = NULL;
3 z4 M& {! F( {2 T; p$ z        dp2.cNamedArgs                                 = 0;* h: d7 a4 P: l" C7 s

. ^0 \& ?, h: K$ I' w6 U( O- r         var.vt = VT_EMPTY;8 @9 y9 d0 Y* w$ T/ u* T
6 \' C7 B% I: ~1 s* i4 X* }
//        Call IDispatch::Invoke()1 b1 R) H0 a6 _$ n+ a! M% O

. B3 _5 \2 U( P/ ~7 H1 K' g        hr = m_pDisp->Invoke(
7 w. O6 {4 J$ z0 g( l                requestID,
; e3 h- P6 {/ ]3 i                IID_NULL," R/ ~. g2 M1 g' N9 B: s9 H- e
                LOCALE_SYSTEM_DEFAULT,! h/ f0 M0 \) c/ N# c7 O
                DISPATCH_METHOD,9 H% f% G: T* L; U7 L* N! e
                &dp2,; o! x: X( t0 V: v4 g8 H
                &var,4 f1 T; @7 w) `1 h" [+ ^
                &ei,
% U4 ]/ {+ t* I. X$ s                &uiErr);: x3 [1 _$ _) n3 B7 @

4 U* G! w5 b' w) R2 w8 I  T. A        SysFreeString(topicStr);
8 h! v7 t4 Z2 i# \: p        SysFreeString(itemStr);( l1 C7 N2 T2 k) O$ _1 n# O
请问该程序是获得extend里面的哪个值?
. s+ q7 W0 G+ x# P0 M如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-18 05:32 , Processed in 0.020443 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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