设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12222|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
, U9 v* s; c2 u- n7 `! l8 rName = (WCHAR *) L"Poke";
5 ~" l' }& Z8 @& ^8 C* d8 h. Y# ]                
# A; T4 u- n$ X1 N        hr = m_pDisp->GetIDsOfNames (' y! w" _  l4 e9 m( }
                IID_NULL,                                // reserved
; T4 {4 k# D5 z7 m' s                &Name,                                        // Array of names to get IDs for( G$ S; x3 g$ B
                1,                                        // # of names in the array
/ @# f0 F* c: u- ~1 ~                LOCALE_SYSTEM_DEFAULT,        // System locale0 B; U7 P- E: K0 m* g- u
                &pokeID);                                // Array of IDs to fill on output( \) N' Z) [. q# ?5 h6 r; n# |
                          R+ X$ w. }4 g6 l1 I
        if (hr): p" A9 F! d$ _
                {
. S) Y/ W% o& f+ W                MessageBox ("Get Poke Unsuccessful");( O( |( t, V' ^9 k" ^% z3 S
                return;; A6 N8 ]/ v5 v: x* r
                }
! S8 f  u; t) g$ N$ a3 [, y: j
: R- {# i) A6 ]/**************************传递数据给extend**************************************/. U; G& c, J1 r: w& N
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);# w  w& }- d% d0 ?1 p& p3 ^7 L
       
; W- ^& s& J0 D         valueStr                                 = SysAllocString((WCHAR *) L"1232");
( D* ~- m+ ]$ `3 K% h* A        VariantInit(&pokeVariant[0]);
  I6 }( t' p& S) Q+ }4 }        pokeVariant[0].vt                 = VT_BSTR;
& _3 p# \0 b# `1 P        pokeVariant[0].bstrVal         = valueStr;) [% d; i, r) |0 Z" n# Z2 |

4 A( W- B# b- A- A4 w         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");  t( y0 M. L8 u3 B2 q) J* d1 f. Z- z
        VariantInit(&pokeVariant[1]);
: }8 ?4 n+ D7 [: `- {- {        pokeVariant[1].vt                 = VT_BSTR;1 F2 W+ i$ ]/ e+ {( j/ m, E2 P
        pokeVariant[1].bstrVal         = itemStr;, H* r+ L, \  e! Y1 ^% ]4 R1 e

- u& V$ n0 \/ `2 P2 }# S2 \          topicStr                                 = SysAllocString((WCHAR *) L"system");
. }0 |; }( V% R# T5 Z& O        VariantInit(&pokeVariant[2]); " c3 z) ?$ `+ Q/ X
        pokeVariant[2].vt                 = VT_BSTR;
" n" m/ Q4 S( s! K1 n- f/ _        pokeVariant[2].bstrVal         = topicStr;
4 a. A. Y- m- l7 @, F/ j2 C' w  d9 K# i# {5 [2 A$ B
//        Set the DISPPARAMS structure that holds the variant.
* J6 u" O- H3 N' p, w$ f5 a4 _4 {% K# M9 C! ?
        dp.rgvarg                                         = pokeVariant;- v! p6 |4 e& m$ w
        dp.cArgs                                         = 3;
% }. @3 R5 U  h9 w/ r        dp.rgdispidNamedArgs                 = NULL;
2 Q$ D. W4 V* a3 T" O- h. \        dp.cNamedArgs                                 = 0;3 {" ?; y! `& F9 U# j8 ^5 N
( `; x) U+ N6 v
//        Call IDispatch::Invoke()) v8 U0 s) F8 U3 ]8 T, p3 i

2 s! f7 g% h1 z: j, }: v& C        hr = m_pDisp->Invoke(
1 Y4 e3 F& r0 q6 S                pokeID,
# E+ ~0 K9 b5 A2 {; ], a4 G                IID_NULL,
4 a9 L* y) j2 ], e! w                LOCALE_SYSTEM_DEFAULT,# ?% R' Y: j: r0 h
                DISPATCH_METHOD,
$ c) i0 V# t6 S7 R/ }& y                &dp,
  T: w) O! j% K7 j% I& S                NULL,
! _3 J7 _& X  G  }/ U$ t                &ei,
1 f# T& o8 `4 C- U; _$ o- G* @                &uiErr);2 |& c) ^- q; E/ B+ f
' H! S* P  \6 q, q% I
        SysFreeString(topicStr);( W* N4 Z) p1 |7 \9 C' |* S
        SysFreeString(itemStr);
- g" j: x, ~/ ~) [        SysFreeString(valueStr);8 R6 Y- x$ @1 f
2 U% p, J" A) _" H- n
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
; F) \  w+ b  E: _: d6 R此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????. N- _3 I. S; m" u
& H. S5 q; e9 S
. U3 z2 u2 w, K( j+ N* O" u4 Z& S( d& ?
2.这是request的程序
* h; ~/ a. b! ^/ f# }//  Request a value from Extend# b+ C- i* {( Z! f
//4 K0 q, }8 ?2 Z5 U3 I
//        Initialize the variant that will hold the BSTR.  Set the variant's
7 e" W  \7 I, M//        type flag to indicate the fact that this variant holds a BSTR. Place the
/ D% `7 D4 j, m' F8 y# v//        BSTR into the variant structure.
9 ]  D! `, m% _  y' n8 K
$ X3 E3 C+ B0 N0 P3 U7 z        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);, |/ j6 ^7 l* r" k, \/ a
        # ^4 b. p* m: F9 X) ^
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
3 S* \9 H2 u' D. k1 M4 G# _        VariantInit(&requestVariant[0]); # V. a* J( M9 a1 Z4 f
        requestVariant[0].vt                 = VT_BSTR;
7 r) g. \* K0 @: i        requestVariant[0].bstrVal         = itemStr;
* g! }# O6 |" ^- q+ @% C8 {( Q7 A$ T$ q
          topicStr                                         = SysAllocString((WCHAR *) L"system");% Y9 m9 j1 V4 D/ Q# R3 B' ]
        VariantInit(&requestVariant[1]); 2 o( T9 M' H  V+ C9 [" a
        requestVariant[1].vt                 = VT_BSTR;
- @& g# g- p5 A; ~        requestVariant[1].bstrVal         = topicStr;1 Z* @& o4 J3 j5 L! C
; |; `$ |$ n/ A8 o" r$ F
//        Set the DISPPARAMS structure that holds the variant.
( \" w$ ^5 P8 H3 i! Q: z; Y$ K: M# T! Y( P) O5 F
        dp2.rgvarg                                         = requestVariant;* [# k$ k& K9 `+ t6 c9 n2 `4 O( M- A2 e
        dp2.cArgs                                         = 2;
/ ^. X. O2 B# E% @        dp2.rgdispidNamedArgs                 = NULL;
3 Z2 i3 M5 E. o3 f9 {2 c# F. b2 W/ I: |        dp2.cNamedArgs                                 = 0;
1 c( I6 p  m. `! G* _2 H
1 A0 j$ y' b1 y! q$ u$ l+ ?         var.vt = VT_EMPTY;
( U5 O: P5 e( g, G1 t
6 V+ e; O: ~4 Y  J//        Call IDispatch::Invoke()8 a+ n6 x) A* }( }

* ~$ ~% z/ A' s8 u) b        hr = m_pDisp->Invoke(0 r+ ~, v: T4 K! g) @
                requestID,& {6 U/ @! t' ]8 Z' l6 R
                IID_NULL,  ~1 B; a4 w4 d  s
                LOCALE_SYSTEM_DEFAULT,- D0 @( x/ w& b0 p& I# z
                DISPATCH_METHOD,1 Z. @+ Y) p% B! v
                &dp2,
3 Y3 a/ E0 c/ {9 Y& Z: {- Z0 V* ?                &var,
% [9 j3 f3 ?% e0 M                &ei,$ D+ Z9 X, i7 `2 _' M2 }& }+ N9 n! u
                &uiErr);
$ _5 d3 |8 |4 _% t4 k7 q5 g
9 T% `8 v. o6 h        SysFreeString(topicStr);
# a. |- t! I; I+ U        SysFreeString(itemStr);% n& v- j; o- r$ T+ M& O
请问该程序是获得extend里面的哪个值?9 l) b: `" p$ `' _' i
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-3 13:38 , Processed in 0.016586 second(s), 11 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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