设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5948|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:( p) I# w; f# T( ]+ t
Name = (WCHAR *) L"Poke";
- v4 O* O. j: \1 C, }                   w7 x" H. z: R3 y
        hr = m_pDisp->GetIDsOfNames (4 g; _0 ~) k3 j, M& w; ^+ f
                IID_NULL,                                // reserved5 I) O& \" f$ y* h: D' n
                &Name,                                        // Array of names to get IDs for3 _# L% ]5 H3 I5 \5 G' U) q4 y1 \
                1,                                        // # of names in the array9 C) A1 v9 e9 f8 s: w- t8 R
                LOCALE_SYSTEM_DEFAULT,        // System locale# z6 ]* d; x$ m0 _) h4 I7 D
                &pokeID);                                // Array of IDs to fill on output
) Z7 u" s; ~6 k3 s7 v                        ! o. S$ F2 ^0 e; ]- `
        if (hr)
7 t# I$ v3 t9 m/ l                {' x& }( O: S1 d2 p. m8 v& G
                MessageBox ("Get Poke Unsuccessful");( f& U0 c6 c* V/ w  H
                return;7 T) x8 d  B4 z2 \3 v
                }
- S9 w+ _' e& \- H% y( y) p+ g! E! I4 i
/**************************传递数据给extend**************************************/! J, t& N5 O& P  k( X; n
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
7 A$ |/ `9 s$ b+ c1 ]/ O8 G/ v       
( W% b, O* {, P2 \$ i# G: h         valueStr                                 = SysAllocString((WCHAR *) L"1232");1 g+ ?3 Z7 S* z
        VariantInit(&pokeVariant[0]); 9 P% k' A0 N1 j) Q- `- E
        pokeVariant[0].vt                 = VT_BSTR;6 b9 }. a" B5 z7 c8 Y9 i, J; e. V
        pokeVariant[0].bstrVal         = valueStr;& U; A' F7 O& E& M! S: N
2 c8 P* }3 f( C
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
9 j( A- e5 j5 X7 C) Q        VariantInit(&pokeVariant[1]); 6 P! g' F6 |) R$ H5 {
        pokeVariant[1].vt                 = VT_BSTR;5 q: H& o$ `7 G- p, B
        pokeVariant[1].bstrVal         = itemStr;
: B; s) [& i; l2 R$ |
' g$ i' m5 V8 H5 H          topicStr                                 = SysAllocString((WCHAR *) L"system");, {8 U( K- E3 F
        VariantInit(&pokeVariant[2]);
& f( C( K; u2 [" H  w        pokeVariant[2].vt                 = VT_BSTR;
1 G% p8 W  U" q& ]        pokeVariant[2].bstrVal         = topicStr;
% N1 y: I0 m2 }1 Q; _- t: w
' v5 R5 L/ t/ u4 V1 G/ \& ?//        Set the DISPPARAMS structure that holds the variant.6 @7 V& E6 k2 ~4 j

9 @7 L; h. f1 B' ?, K        dp.rgvarg                                         = pokeVariant;2 ]" R% b) ^( c% {& @7 e
        dp.cArgs                                         = 3;7 \  ]% [7 v: \. A. [
        dp.rgdispidNamedArgs                 = NULL;
9 |; w; |0 R5 a! k* B        dp.cNamedArgs                                 = 0;4 }* h) C( s+ {1 R- G$ l

9 ~- u' L  f) D//        Call IDispatch::Invoke()
% ^$ t" H! }" C
7 _% e' e1 ^$ \/ O0 g% X        hr = m_pDisp->Invoke(
6 L7 X4 r2 W- T4 ~, {# v, K& V. R                pokeID,4 |" h* {  Z0 n: r# [5 `' S
                IID_NULL,) |' Z% ?1 e/ P5 q4 H5 ]
                LOCALE_SYSTEM_DEFAULT,
8 ^  X, R( T# i* F! R                DISPATCH_METHOD,
3 Q$ n# I7 K8 C* M) ^  H' o                &dp,( P. z& i& H# |) n4 y* _9 v  Z
                NULL,
" F5 ^  J% D9 k& x. e1 w                &ei,6 U. p" J/ A4 K* D1 [1 l) n
                &uiErr);- f8 B5 \% @8 A6 X$ R) K
& C& Q5 z* ^6 q9 P
        SysFreeString(topicStr);
; i! _# O0 T% Q5 z/ }        SysFreeString(itemStr);
. x- H6 i. m, r( Y$ j. U  W        SysFreeString(valueStr);
/ j3 I9 `5 K. m8 k4 R3 v9 X/ J2 w6 ~
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
3 N1 Z- F4 T" {( G, v7 [" X此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
* [4 O3 y0 a! C! l6 E" M' W7 ^1 z' j! c# y' h9 I1 d7 l$ M7 \

* o. a, v$ X4 X; W1 ]  h0 L2.这是request的程序8 D/ Y2 M4 _5 F( N0 g; p0 h
//  Request a value from Extend6 \3 ?& e  j$ T0 g2 n2 ]
//
  D  |- W0 E; i0 G//        Initialize the variant that will hold the BSTR.  Set the variant's
2 i4 a! R% a& G7 s! F' Z//        type flag to indicate the fact that this variant holds a BSTR. Place the
% o& m4 g- H. y//        BSTR into the variant structure.4 {0 e) R) {, k; r# G+ G& C" W

$ `; o3 l" D2 m% I" d        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
# x& J0 @% [4 H7 I' D- @% m4 f) w9 t       
+ ?2 F6 P: |& p3 e; G         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");: j! u2 U' M" v3 j# A& z+ H
        VariantInit(&requestVariant[0]);
; D3 k; j8 H$ N        requestVariant[0].vt                 = VT_BSTR;& ?; R+ A6 X' Y( y+ W1 z4 I
        requestVariant[0].bstrVal         = itemStr;9 S- f9 r  a7 w; W" y# p  ]
5 _6 m" A( |' e
          topicStr                                         = SysAllocString((WCHAR *) L"system");
- b" Q9 i( l5 _3 s, S% I        VariantInit(&requestVariant[1]); : I* f& s0 S) f( w) }
        requestVariant[1].vt                 = VT_BSTR;. W# |# G' v( B2 g" R, a
        requestVariant[1].bstrVal         = topicStr;
' N8 ~" s# e+ }# Q1 G8 w# u: Q/ h3 Z9 r
//        Set the DISPPARAMS structure that holds the variant.  @' ?- @$ F4 {4 H7 \+ a

0 N7 t6 \% s: {% E. E6 L        dp2.rgvarg                                         = requestVariant;, U& @7 s7 |7 p: C& x+ R
        dp2.cArgs                                         = 2;; U8 l2 Q2 p% S$ l4 q& @
        dp2.rgdispidNamedArgs                 = NULL;/ p0 ~3 z1 W3 E3 j5 h5 ?( l
        dp2.cNamedArgs                                 = 0;
$ i! J% H5 G0 ]- P! P4 I8 g; @! h+ M, R4 G; |. F3 p
        var.vt = VT_EMPTY;
! V. d/ U+ \  _* ~! [  q: V/ e$ m1 ^2 `8 m( y1 j/ q9 D( v
//        Call IDispatch::Invoke()
# |3 O% F( ~, n$ ?+ Z+ ?% r' V$ x
5 J6 h/ j/ u5 O5 k+ ^        hr = m_pDisp->Invoke(7 \( r* N! p5 F' E6 c
                requestID,) g& m6 `1 B" K+ l1 P2 R+ I
                IID_NULL,/ g& ^+ g- ~) n7 a2 J0 z& Q/ R" E
                LOCALE_SYSTEM_DEFAULT,7 `6 k$ c4 t$ ]! X% p
                DISPATCH_METHOD,% b; @3 u$ I8 R4 B
                &dp2,; z" P3 x$ Y- ^. z$ O& k. k: f% W
                &var,
6 K3 B+ l2 q# d5 D. n  W$ Z                &ei,
% _# [7 W# o8 K3 b4 F; L* A# Y2 J8 v7 e                &uiErr);
2 D/ ?! {1 y; Q
! a2 X3 o( M# m        SysFreeString(topicStr);
; X- v6 Y/ P9 c) x) F$ b1 X        SysFreeString(itemStr);
5 v" B7 p3 Q* _, ^. P9 D% F请问该程序是获得extend里面的哪个值?
5 ^, f. ]4 M. p如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2025-7-4 11:48 , Processed in 0.013124 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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