设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7628|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:! z' o3 |+ H3 K8 W5 k4 s
Name = (WCHAR *) L"Poke";
' n" Y3 j, b3 v. Z0 f' v                 3 o( T3 u& U5 I4 [( L
        hr = m_pDisp->GetIDsOfNames (2 ?$ `4 ^- X! q6 D3 t
                IID_NULL,                                // reserved
. |: A" m' g0 A9 ]  R                &Name,                                        // Array of names to get IDs for
' d) N% r+ H3 u$ k6 ]                1,                                        // # of names in the array! E7 y1 z' H6 V; G8 H. o. y5 y6 B- r
                LOCALE_SYSTEM_DEFAULT,        // System locale
# ~4 r! Y1 ?  Z' L6 w                &pokeID);                                // Array of IDs to fill on output
, f# M; X- g% }0 ^8 s* \: p: O                        9 y  P2 C! p, P. B
        if (hr), \$ e( f9 t, w8 I. F7 {
                {2 k- [/ |4 N$ @& n( s
                MessageBox ("Get Poke Unsuccessful");
* c) F1 I( }& ~# v                return;2 z* {2 v! U! r2 P# v
                }
8 M" A4 T7 n2 y% d, ]. }& f# v$ X" f7 a/ I
/**************************传递数据给extend**************************************/
4 m! Y1 z. Z4 C" c- d) j1 V        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);! m3 W9 L6 T" J5 i
       
/ l7 w, M4 m3 \9 D! ?$ r         valueStr                                 = SysAllocString((WCHAR *) L"1232");
0 Y$ n! X  W* I* W* O% \        VariantInit(&pokeVariant[0]);
  y7 g4 P+ b1 x; S7 }( U% K        pokeVariant[0].vt                 = VT_BSTR;( M( D7 y/ ^) F; Y0 C
        pokeVariant[0].bstrVal         = valueStr;  G4 C  L. U' H' K' y9 I

8 R, P" A/ ~7 o! G# I& f$ p         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");7 T& T: o% m' G" W7 i) d
        VariantInit(&pokeVariant[1]); * |  f2 o3 a; H" H
        pokeVariant[1].vt                 = VT_BSTR;
6 n* u/ m# u6 {% `/ k        pokeVariant[1].bstrVal         = itemStr;2 F* B8 G; L5 L$ o; Y
* w' @2 u  f" a
          topicStr                                 = SysAllocString((WCHAR *) L"system");
1 g% Q9 ^6 k  x3 U7 L: F        VariantInit(&pokeVariant[2]);
: {0 A* ]7 N) {5 }( L& C+ D        pokeVariant[2].vt                 = VT_BSTR;
; k" o- _) Q5 ]* b9 F' N# A5 p1 f        pokeVariant[2].bstrVal         = topicStr;8 b  \/ h2 ]) X

1 A4 _0 \2 f* d* C! X' x% X  A//        Set the DISPPARAMS structure that holds the variant.
& M. W/ j9 X9 ~; S, ?: ]* V5 V3 I0 p5 ?+ f$ t+ q
        dp.rgvarg                                         = pokeVariant;
5 j  y: i* l# B        dp.cArgs                                         = 3;
* T. i& ?2 F: ~        dp.rgdispidNamedArgs                 = NULL;) e- C, x! ~4 l( W
        dp.cNamedArgs                                 = 0;" r* v; q- ^7 J* Z
9 j, ^, R! T! o" m6 d1 O
//        Call IDispatch::Invoke()7 K' i  t8 z; Q' A

9 ?4 F2 ~) \# v) i6 S) T9 x* v        hr = m_pDisp->Invoke(
/ q4 O$ T& |4 ^5 Z                pokeID,
1 K2 I2 d* G/ Z9 b% c) h                IID_NULL,: g  L; ^- g9 d$ ?/ E
                LOCALE_SYSTEM_DEFAULT,
. ~+ Y6 H& `  n/ G9 z' \+ w                DISPATCH_METHOD,1 J( Z. X1 F% l, g/ X4 I/ H2 H
                &dp,' D, S+ c7 [3 f2 M
                NULL,
, j: Z# V2 d" w% H* `                &ei,* }; @/ a/ B4 f% C( \
                &uiErr);
$ N0 C. D3 _1 W3 M0 k1 ?7 g% ?( ?! O3 A, ^0 I) c! k* q+ W
        SysFreeString(topicStr);7 Q: E/ N- n+ r, y/ o
        SysFreeString(itemStr);) t# B2 N& f6 z
        SysFreeString(valueStr);4 U1 v" A8 h$ \/ ]! |
  u; K% l+ ^+ m: L
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
; y. y0 ]/ I6 B3 o此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????0 V+ |& X4 H# H7 q7 B. {
) Q- b+ R! F" F. t4 t8 D

3 @, f& D) f. H* M/ x& g2.这是request的程序% x4 \7 t: g- G
//  Request a value from Extend1 Q. b+ O6 [, Z2 g& \
//
- ~" Y& w& ?7 K( D. _# b6 _9 D//        Initialize the variant that will hold the BSTR.  Set the variant's
1 y' q; K, k: q- E6 b& ?) p0 [//        type flag to indicate the fact that this variant holds a BSTR. Place the7 R% f1 e5 E& ^" p' c
//        BSTR into the variant structure.
6 w% ?7 i& \4 a$ N3 ]: Q8 {  `2 A; ?
" G* r6 X% A, `" i        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
4 R. L" e& F, _, c2 \) G6 w       
! _5 a, V+ y% `8 S9 d4 L3 _         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
# P+ t7 e* Y6 {3 O0 k6 l3 c* y# k        VariantInit(&requestVariant[0]);
7 \: a% k: f$ r4 l8 d, E  R9 `        requestVariant[0].vt                 = VT_BSTR;
0 X; \) i6 r% h# _+ n        requestVariant[0].bstrVal         = itemStr;
1 R* t1 U4 Z+ d. e
: j+ W0 T4 l: J3 |* c" Y# o          topicStr                                         = SysAllocString((WCHAR *) L"system");
, V# \- B, d+ ]        VariantInit(&requestVariant[1]);
* g4 L  U3 i  R, }0 N, k( Q( X8 F        requestVariant[1].vt                 = VT_BSTR;* T2 ]9 z2 _, b2 c4 d, k" m" e: a/ e
        requestVariant[1].bstrVal         = topicStr;
( |$ J9 h+ v8 X# f/ D8 n% ^) h3 G- Z
4 j- c% }7 t4 P! q! b//        Set the DISPPARAMS structure that holds the variant.: d" u" H. H0 o3 x/ n3 b$ E$ x

, t) @0 G9 |1 U7 {0 Z% ]        dp2.rgvarg                                         = requestVariant;0 `8 k4 J2 g: y- s4 e
        dp2.cArgs                                         = 2;
- d3 X- U% Q5 W. a        dp2.rgdispidNamedArgs                 = NULL;) l9 Q# ^7 e  z+ _
        dp2.cNamedArgs                                 = 0;; {3 S4 p9 A( b" T- e8 w; F6 N2 k

* S* L/ L" ]+ h3 E# k, |5 M) H, r; c         var.vt = VT_EMPTY;
) L; q: e/ n# C& V" H) A) @5 r
' p; L% X. g" L3 z% x. K' _2 F5 ~' m% m//        Call IDispatch::Invoke()& w5 b) E- x4 _5 ~0 s6 M) G0 g
/ M$ z9 r: S& ^  K
        hr = m_pDisp->Invoke(: V, I! P' D& V+ w. g- p; ~
                requestID,/ m# E1 o: _) P* v5 e( d) v# d
                IID_NULL,
- Q0 I6 f- I+ A% u4 P! F                LOCALE_SYSTEM_DEFAULT,+ I1 W- @% Q8 D( S% d
                DISPATCH_METHOD,$ I0 X! o( h$ R$ h& b- `) q- C$ ^6 `2 j
                &dp2,
. u; m) ~0 g) Z0 F7 N. y, }, T                &var,; y* p& f* o6 P& u
                &ei,
6 L. J0 O6 Q: u& {* T2 a                &uiErr);: Y4 _! J' X7 @7 P5 l6 ^  f

/ E1 G% V" Y3 O        SysFreeString(topicStr);0 X  N/ R8 O, K$ H; W* l% s) w! v
        SysFreeString(itemStr);
, `6 `0 {6 u0 u4 U  b2 }请问该程序是获得extend里面的哪个值?
, M  R! G+ t9 R  j) `如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-27 12:44 , Processed in 0.024276 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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