设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7467|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:* `/ Y$ ~1 K7 J4 P; d9 v; v) C
Name = (WCHAR *) L"Poke";
( G8 o5 i! C6 j5 I                 3 k: J& Y2 v2 v( b. z) ?
        hr = m_pDisp->GetIDsOfNames (9 v( P0 A7 a( N; X# W
                IID_NULL,                                // reserved8 ]- L- v+ s, Z( H9 W0 W
                &Name,                                        // Array of names to get IDs for
2 j: E$ I: D+ }                1,                                        // # of names in the array
0 r9 ^7 g! g9 u7 @# r0 j2 {( ^                LOCALE_SYSTEM_DEFAULT,        // System locale+ a$ \6 P: D: _' J% G
                &pokeID);                                // Array of IDs to fill on output
, [9 h; Z' }/ I, n9 l) R% q. Z                        % s" Y: R- H+ z2 n5 e( e
        if (hr)0 d3 R1 d, S$ [4 W7 w1 I
                {
) D7 Y2 F! _( k& T! j& w                MessageBox ("Get Poke Unsuccessful");
! O) p9 L4 B  W                return;
! _. o( D  `% C8 ]                }
9 Q3 o/ I- z# I* n0 [
. I" m4 ^5 ]; J' z- a$ m" i/**************************传递数据给extend**************************************/5 f$ B0 l, t/ }0 w( o0 j' |3 i
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);# X) m; E, @' q1 \" e( N
       
7 h& V! t* p& q         valueStr                                 = SysAllocString((WCHAR *) L"1232");
6 A; h. y& P* |        VariantInit(&pokeVariant[0]); ; y3 g4 z8 l+ v  N* _5 t% a
        pokeVariant[0].vt                 = VT_BSTR;
& Z8 j( J* @. l& G7 o% }        pokeVariant[0].bstrVal         = valueStr;3 b% u6 S% u& u& m

4 a: w0 C' b1 Z: \& K         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");0 d9 n# k6 D9 ^: e  I9 `
        VariantInit(&pokeVariant[1]); ) @3 {6 |. E% ]- S4 n. x9 a
        pokeVariant[1].vt                 = VT_BSTR;" k+ B3 n1 [2 I- f) S9 `' H
        pokeVariant[1].bstrVal         = itemStr;
% O% i0 o0 W5 @: B; V
6 c3 r7 V. j: [. L          topicStr                                 = SysAllocString((WCHAR *) L"system");) D, U/ p) [. a: `3 _9 F
        VariantInit(&pokeVariant[2]); # W4 }% E! v- ~& f4 R6 |
        pokeVariant[2].vt                 = VT_BSTR;
4 C% F' J. [6 I( F. W" ?7 W: G3 {        pokeVariant[2].bstrVal         = topicStr;% A+ j. V9 k- |0 a% D* z
, ^- z' m0 M$ M7 E' a0 N3 |
//        Set the DISPPARAMS structure that holds the variant.
# K& W& A5 T5 H, j% _2 K8 g  g0 `) Y, x/ D/ m$ `
        dp.rgvarg                                         = pokeVariant;8 x2 o' x4 P5 T" J
        dp.cArgs                                         = 3;: b5 e! i. T1 Y1 j/ Y
        dp.rgdispidNamedArgs                 = NULL;
$ c$ n% F% x5 D. c& s/ t4 M        dp.cNamedArgs                                 = 0;7 Y+ M' s/ y6 L& _9 z$ |
! t" z1 s4 r: m& O' K
//        Call IDispatch::Invoke()7 V* ]* [+ Z" G+ k% h! e

4 W7 {: f) Z5 Y' F0 A        hr = m_pDisp->Invoke(! O1 ?- g+ R/ I1 b6 J9 z( }4 {
                pokeID,
  H3 s5 Y$ q! Z" P$ _( o! f% k                IID_NULL,
9 z" \: Z7 ?, t+ R                LOCALE_SYSTEM_DEFAULT,
" M# B5 p1 G$ g                DISPATCH_METHOD," o1 o; s$ }; g0 t# c
                &dp,1 e0 F4 P$ m2 h2 \: `: ]4 `+ T
                NULL,
' A0 C. a+ r$ g8 ?; v                &ei,
  Z5 ?5 z: L& K/ X( o& f! w                &uiErr);
+ b: K  }. [* \* K$ R; T1 A; B! E
        SysFreeString(topicStr);
+ w5 Q  M4 Q! [, ^- S3 ^1 n  a        SysFreeString(itemStr);4 b2 s+ d4 d9 I0 j+ e( Y; C
        SysFreeString(valueStr);# Z, U3 }' J; q0 o$ D2 e

7 f% u# F" W( v, }: H; w/ b* _# d现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???9 O8 V/ r, T6 A" Z
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
7 }- B" M5 z) E: e; i, Z6 M! d/ |5 @) I8 t5 J

/ |/ e  B9 j9 N+ `2.这是request的程序! o1 ~( t( b) y/ l( Z# N
//  Request a value from Extend5 j6 T/ b! t; C, v
//
8 R5 V# w4 T# c& G//        Initialize the variant that will hold the BSTR.  Set the variant's  p( b" Q: k' k4 m
//        type flag to indicate the fact that this variant holds a BSTR. Place the
! a& }7 Z# t1 P; `* t' d% c) C//        BSTR into the variant structure.6 [$ s. z- C: X; q- i6 I

+ |3 \5 z8 _7 R  w( N, f        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);8 J3 m! @+ `3 d  S( A6 t- U
       
5 S2 U9 j9 J. N0 P# [4 |( |# A         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");  F, W2 _. s: S& R1 v
        VariantInit(&requestVariant[0]);
( [+ ^3 E$ d0 I! w        requestVariant[0].vt                 = VT_BSTR;
! R, s6 d" D: V: \& {% Q. |$ U        requestVariant[0].bstrVal         = itemStr;/ ~! y2 g8 R5 f9 T
) u% R! V9 p* f( A, m/ P2 r' a
          topicStr                                         = SysAllocString((WCHAR *) L"system");
/ j2 {* P" _. I- S2 \$ b, ^, y        VariantInit(&requestVariant[1]);
; r! _+ X9 g3 Z' Z        requestVariant[1].vt                 = VT_BSTR;6 X& {0 B) [6 f: \# u
        requestVariant[1].bstrVal         = topicStr;
, Z5 J8 Q' t) i+ ]$ A) L7 z. l& x: ?5 Y1 v6 x
//        Set the DISPPARAMS structure that holds the variant.$ o6 H# A' C, S7 E$ j5 j1 y* s+ Y7 }- c

3 ~0 e3 V( V+ ^        dp2.rgvarg                                         = requestVariant;
% y  X. ~; o7 m        dp2.cArgs                                         = 2;
& L$ c+ x: M/ x: F, J1 \; C9 {        dp2.rgdispidNamedArgs                 = NULL;( I+ s' @6 j2 v6 U, C3 |
        dp2.cNamedArgs                                 = 0;
- D1 b3 Q  N, a; u- R; M: G3 A( x$ L; G) y/ h( Y
        var.vt = VT_EMPTY;
7 u( G  F* B3 A6 B5 o/ J% \
9 G- D; Y5 @2 V4 C- h6 {0 a; c//        Call IDispatch::Invoke()- ?. @% C5 ~/ j& H- W; r! v

  S) M3 K2 n% M/ l+ K- W        hr = m_pDisp->Invoke(
: w. i% }1 y& \! F                requestID,7 a" @# U5 J- s; R, T$ ]& A
                IID_NULL,
! o. `* \$ h+ y, L4 M/ @8 l                LOCALE_SYSTEM_DEFAULT,
, @2 ]/ _8 ^; |+ {0 k: L                DISPATCH_METHOD,& z0 N4 h2 {, [+ O* Z# B: @
                &dp2,
7 u& }, X$ w# Q+ l  \                &var,
. j, T6 D3 ~' y                &ei,
8 Q- B! o$ i0 w# T& a4 L                &uiErr);
1 h! X3 ^4 H4 R$ S! T: q% @. G) O' G
1 ]) K4 j+ V7 k        SysFreeString(topicStr);1 U3 o4 D* G/ f' o' }& N3 [* g( R
        SysFreeString(itemStr);
& d- m. l9 @/ m0 `' h/ W. @, d) L3 e请问该程序是获得extend里面的哪个值?, |6 f$ T  m- w+ T
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-21 04:36 , Processed in 0.016902 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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