设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11870|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:! U$ j( ^) [1 U
Name = (WCHAR *) L"Poke";
& I/ x7 k& S* q% I1 l                
! P$ k. \8 H! i5 e2 O2 n        hr = m_pDisp->GetIDsOfNames (4 A: D7 i) q& }( |, Z( d
                IID_NULL,                                // reserved
# R' F) X8 R' X2 r& m6 z                &Name,                                        // Array of names to get IDs for
; y8 f4 F/ u; I                1,                                        // # of names in the array
1 O: R2 {8 |$ Q! U: \. `                LOCALE_SYSTEM_DEFAULT,        // System locale
1 u' f* @% J$ i6 B, Z                &pokeID);                                // Array of IDs to fill on output2 V2 ^8 ]6 h+ Y' V- |1 i$ q/ S; z
                       
2 @6 E! @; C) G* k        if (hr)4 Q  O1 Z. J% S6 I4 {
                {8 ?; Z1 A; V, K2 J5 P3 e
                MessageBox ("Get Poke Unsuccessful");) s  `% Y* j% \0 P; q
                return;
% s2 R3 ^) M5 P- I& g& T                }
4 M- D% p1 v+ ^* `6 [. P/ c7 l: J  U
2 c* N+ z+ U6 u  y( K/**************************传递数据给extend**************************************/
0 K) U7 O, e7 ^9 Z1 z& E        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);. O. D/ m3 P$ U! x. O$ n7 W/ R2 A
        1 T7 t( P8 A7 r. v+ r# [
        valueStr                                 = SysAllocString((WCHAR *) L"1232");0 B, c3 ~+ J# Z; C0 z4 ?
        VariantInit(&pokeVariant[0]);
7 J" M! t( l5 P        pokeVariant[0].vt                 = VT_BSTR;
$ I5 {( o2 C! V/ V/ ^% J+ h, P        pokeVariant[0].bstrVal         = valueStr;
  U" Z) }0 t1 S$ _  t2 U
: S# B) I+ e* C9 i         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");8 v7 L/ |4 ^' s! F1 g& y& p; o: Q
        VariantInit(&pokeVariant[1]);
; I( f: I: n3 k- P6 x; G. `        pokeVariant[1].vt                 = VT_BSTR;+ [& E9 n$ Q+ r' b) d
        pokeVariant[1].bstrVal         = itemStr;
6 q5 ?3 N7 ?" Y+ O% J
6 n' n0 y  V2 O# x- z          topicStr                                 = SysAllocString((WCHAR *) L"system");
. K* L0 u& k1 s& \) f+ _        VariantInit(&pokeVariant[2]); , Y: b4 {0 c5 F+ F) O( n: H
        pokeVariant[2].vt                 = VT_BSTR;
& Q- m; K" f" \. v        pokeVariant[2].bstrVal         = topicStr;
. B* x0 l  r$ u: C' f' C- u: o# b; t# L- v
//        Set the DISPPARAMS structure that holds the variant.
: E: l3 b% d3 U! M3 o
- E6 A! i6 v8 G$ G' \& ?        dp.rgvarg                                         = pokeVariant;
( m  f& n/ f4 r# c        dp.cArgs                                         = 3;( s7 L8 D( w8 ?
        dp.rgdispidNamedArgs                 = NULL;
! a" J# n7 i) B6 P2 E5 w5 h. M        dp.cNamedArgs                                 = 0;. ]! w5 z) `  T) a  g2 ^: L
! X% B3 G7 d( ?6 l6 W/ O3 A
//        Call IDispatch::Invoke()
  v# P- K5 _" c# ^/ f% _  X- y/ z9 c1 V- Y8 t6 W/ a4 k3 R. V7 ?
        hr = m_pDisp->Invoke(
, R0 |+ J4 b% i& ?9 w                pokeID,
5 l# E1 _$ n4 T2 ^. s# g                IID_NULL,
( O8 I% f! j6 f' P. t6 W& u                LOCALE_SYSTEM_DEFAULT,
/ o/ ^0 D$ y' m  ]* D2 }                DISPATCH_METHOD,. E+ I( O1 F1 V0 ~! G
                &dp,
' f* }, q/ M" s. H, e                NULL,
% @1 v3 g! W* T5 ~: v                &ei,! _& J; D7 E3 d+ w; C
                &uiErr);+ q, ^5 z- J8 {
- [. e4 t1 Y4 c# t! S' Z( c, W
        SysFreeString(topicStr);$ m; x# q' C6 @3 [* T
        SysFreeString(itemStr);
5 t: b1 A, b: L  u        SysFreeString(valueStr);6 T# W& O- X0 |, C2 a+ r6 M% `1 R( q( a% E
2 k) a7 u% g) O9 F
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???7 {% D6 {7 ?; Y5 }) o5 L4 G3 a
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????4 P6 Z8 A2 Y/ e* @; a: X( l
! Q$ D3 _2 @) L; |- X/ W' f
: j4 [3 q; j; a3 K( L# D- s1 v3 Y
2.这是request的程序' L4 D/ \1 ~' R/ h9 f5 {- o* w
//  Request a value from Extend
. X  Z9 J$ ^# ~' m' d$ h6 J//
8 c  l7 ]7 F9 b0 T( S) y7 }+ a//        Initialize the variant that will hold the BSTR.  Set the variant's
: c4 ^% g9 p7 ?% x//        type flag to indicate the fact that this variant holds a BSTR. Place the; `% P2 R: @1 [: O
//        BSTR into the variant structure./ d6 v; T$ s/ E6 _9 U3 u. }

' C0 \+ W/ _6 B8 w        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
, k& G& D9 y/ d. O        4 O6 a6 f& t/ Y  H2 _
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
( u* B" p, P2 M% ^& @! I+ G        VariantInit(&requestVariant[0]);
; U$ K( d- w+ p/ W3 X1 ]4 O, P! s        requestVariant[0].vt                 = VT_BSTR;
  r6 @9 E& ~/ E6 x3 W4 r$ x        requestVariant[0].bstrVal         = itemStr;& b0 Q6 h7 n/ Q) _/ p& `

0 ]' g) U5 V* `0 }& \9 U: U& ?+ c          topicStr                                         = SysAllocString((WCHAR *) L"system");* \7 U* u: T4 \' E1 ~
        VariantInit(&requestVariant[1]);
4 ~# o" |3 o. o( e9 F' i: W        requestVariant[1].vt                 = VT_BSTR;
  `" p, B/ j- A/ E        requestVariant[1].bstrVal         = topicStr;! @2 x' Z9 ]# f: ]# q$ u4 n

9 }' A. q1 ]' @& m//        Set the DISPPARAMS structure that holds the variant.7 ?1 W: c8 C, S7 V! a

9 q4 ]3 W7 L% B: ?% W& n( u# g/ a        dp2.rgvarg                                         = requestVariant;0 V( Q# c  y& K2 f- B; }
        dp2.cArgs                                         = 2;
, |7 J- i0 m' g% i4 ?" O( a' n- q        dp2.rgdispidNamedArgs                 = NULL;/ Z4 D/ @/ T* O# l3 l1 @
        dp2.cNamedArgs                                 = 0;: B- H: C( W2 D0 @1 h9 j
+ m. w% S' e+ a& Z3 _- `- Y% w
        var.vt = VT_EMPTY;
& y9 a1 _; \/ D4 D2 @  N& j! D/ O7 `5 `
//        Call IDispatch::Invoke()
4 E, c1 e# R2 L- t& q, j. C/ f0 f  u* e
        hr = m_pDisp->Invoke(
3 Q) i( V4 J1 f$ O                requestID,
* Q! A7 \2 J5 m& Y4 ~4 i1 I4 P                IID_NULL,9 v$ I. \2 {# z% n
                LOCALE_SYSTEM_DEFAULT,, H4 w) V3 p$ e( n
                DISPATCH_METHOD,1 _  V( X3 z% N7 [1 c4 V4 ^: ?
                &dp2,
  r: [7 v+ ?, u                &var,
* C5 j; e  z/ o                &ei,% `: B9 ^/ w/ }1 {* X
                &uiErr);
/ ~2 j* M# s/ E+ v: h# j
1 M/ l$ R  _; l! i        SysFreeString(topicStr);" z' b9 X% I& u* `: e$ G! O
        SysFreeString(itemStr);
1 g; ^% k) T  E请问该程序是获得extend里面的哪个值?
# a+ v/ t6 {" M, C" M" [如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-22 20:43 , Processed in 0.013201 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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