设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7091|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
. t# z6 Z7 w' S- @Name = (WCHAR *) L"Poke";5 g. I# \; }* r/ ~+ X
                 : H0 l" g+ U" {. X) O% c' ~
        hr = m_pDisp->GetIDsOfNames (
0 o5 l# x" \8 R) z5 Y, H1 n! P& R                IID_NULL,                                // reserved
0 j+ N- {9 \7 h# T5 V6 X                &Name,                                        // Array of names to get IDs for
* ~4 o$ C3 Z* F* L                1,                                        // # of names in the array
9 k% [  m5 m* \2 I" k* [                LOCALE_SYSTEM_DEFAULT,        // System locale' T  `1 V% K  H- v9 X
                &pokeID);                                // Array of IDs to fill on output- x6 g8 Q% w1 D& x
                        5 j4 g( l. ^' {6 i' |% L( z1 _
        if (hr)
# ]) @: |' w5 L; d" R                {
6 n2 U- n+ v1 p$ h3 K7 W5 B( A9 b4 f- w                MessageBox ("Get Poke Unsuccessful");
/ o3 n/ e4 J+ \9 y9 b8 j                return;
& ]4 e+ Z0 t2 _0 I- m* M                }
/ I, o$ Z4 B) k$ l' S/ C
7 o- H( A' e+ C3 f  R7 Q  w: U/**************************传递数据给extend**************************************/
% A( T' n- R- M1 ~) O. a        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
4 E, T, X1 ~/ z$ J( y       
& _  R6 ~$ b% `" ^0 I/ L         valueStr                                 = SysAllocString((WCHAR *) L"1232");
. E4 u  e- e! X5 ?7 y4 x, `        VariantInit(&pokeVariant[0]); ' ]; T) n; C' b2 I7 g7 S
        pokeVariant[0].vt                 = VT_BSTR;
: X% N1 O! j3 p5 n  A; i! S8 @% Z        pokeVariant[0].bstrVal         = valueStr;
5 N- i0 _0 c5 E( ^+ j  q1 _4 I3 n
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");8 B7 I/ E3 v- X
        VariantInit(&pokeVariant[1]);
+ f3 X' K5 I" O4 G0 `: `% U% k  U4 _9 [        pokeVariant[1].vt                 = VT_BSTR;& I# S3 D/ E4 n5 U/ F
        pokeVariant[1].bstrVal         = itemStr;% T1 X8 ]4 _7 P0 t
* q2 f' \* \: A; k7 p, K  L6 ?2 E
          topicStr                                 = SysAllocString((WCHAR *) L"system");7 p1 H# \4 `  E6 ~6 Z
        VariantInit(&pokeVariant[2]);
6 C. K1 ~0 d; r7 J+ r) k" B  k        pokeVariant[2].vt                 = VT_BSTR;4 v/ G" R' @: E6 D7 A( o! J2 p' `% D
        pokeVariant[2].bstrVal         = topicStr;
$ {: ?3 W1 h/ e' K7 |; G$ O: F
& P1 w1 L* Q4 S( I$ H- |2 p//        Set the DISPPARAMS structure that holds the variant.
, z) f+ A- |' W/ Z( x  y3 `% ~  [" h0 u+ l; e* X
        dp.rgvarg                                         = pokeVariant;% K! d, o& y& d! K( j' z
        dp.cArgs                                         = 3;
6 ]# ]" ]# Z  c6 p; D, S        dp.rgdispidNamedArgs                 = NULL;
. _3 H9 e: H6 z( Q& C+ }5 j        dp.cNamedArgs                                 = 0;
' H9 {+ Y# V$ i2 w, B
/ D7 ?& U8 b4 y0 \5 x* K//        Call IDispatch::Invoke()
$ m6 |8 s3 j1 w' P3 }) d+ o/ `
- v4 p& |9 j) O% ]6 k; b0 O        hr = m_pDisp->Invoke(
7 h; u8 o! \9 a# e                pokeID,
# z( t6 q5 J' H( F, G$ T                IID_NULL,3 ?  R$ \. q9 h& S" d7 _' b: W
                LOCALE_SYSTEM_DEFAULT,, U" @- ?. N0 \3 [
                DISPATCH_METHOD,. b0 x( j) Z1 M3 n' J- L" R" H
                &dp," D! v! L1 F$ `( \& J# v$ P" q
                NULL,3 G4 Z( r/ U9 ^# j& X5 M# {) j
                &ei,( a+ m3 r" h0 W+ Q8 V, q! `
                &uiErr);
0 F! j. {( b: L9 a" @" T3 B! v- H
$ J  i! x& \6 G  a: ~9 N        SysFreeString(topicStr);5 i. z  z) O1 m7 |
        SysFreeString(itemStr);$ p# W: [5 ^$ c' K* k7 Y% L  n
        SysFreeString(valueStr);( B- g9 h) ^# v2 H# \

  u- ~+ {# Q) W% M现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???" f: `1 w" e* f) G4 B
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
7 t/ Y* d9 M/ s
1 s8 F9 u* j) j8 t
5 X0 u/ w! q3 @1 a2.这是request的程序) Q/ p* W& |& N1 K, {' _
//  Request a value from Extend/ `$ u, d0 z/ [* H9 t/ b5 K
//5 D# }/ i& \* [& M. E: q, o  q2 `
//        Initialize the variant that will hold the BSTR.  Set the variant's1 `8 G$ X! O7 H3 G6 l5 y
//        type flag to indicate the fact that this variant holds a BSTR. Place the
) v  `1 G  u9 H2 j) Z! H//        BSTR into the variant structure.4 M  @1 _' [' o9 M2 ]8 g4 v/ g
' R% Y4 r/ k# v# m: t8 g# E5 ^
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
" N' j3 e- J' H4 p3 V' n        8 G$ j& n* N: h3 u% ?3 n" |
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
, b' b0 L2 F* X8 X8 y        VariantInit(&requestVariant[0]);
" ?& B, Q/ p, d0 ]0 i) R/ l        requestVariant[0].vt                 = VT_BSTR;! y3 t! M' w: }) b
        requestVariant[0].bstrVal         = itemStr;' v2 h* v5 O3 P" @# r! D
2 `/ b# O0 T9 c" R- u. o2 P  P; e
          topicStr                                         = SysAllocString((WCHAR *) L"system");
  e* ^: v* c6 M: c9 V0 m- P" E        VariantInit(&requestVariant[1]);
+ O2 g: R4 O' c  G$ G/ t        requestVariant[1].vt                 = VT_BSTR;
0 r7 \# d- b1 K        requestVariant[1].bstrVal         = topicStr;
( m% a9 W/ n% ]- o  O8 \7 J' D" f. L# b* Q1 s) f8 j- N
//        Set the DISPPARAMS structure that holds the variant.# @  U( M- L4 U$ e! D( M" r1 @
7 q; I5 M9 X" J. A  d4 `
        dp2.rgvarg                                         = requestVariant;, [. N: Z5 n$ n2 g: `) p
        dp2.cArgs                                         = 2;
0 u  S0 W' R) b' y9 z/ l6 n+ g        dp2.rgdispidNamedArgs                 = NULL;
# t) j: ~4 A+ w1 |, f4 J# Q0 }: K        dp2.cNamedArgs                                 = 0;8 w4 Z+ i+ v7 E/ a* x4 [
" E1 v- X$ X) T3 v
        var.vt = VT_EMPTY;
0 S; Y+ f" c! {2 J4 N- y6 {3 u! N& k4 Y# {  W' |
//        Call IDispatch::Invoke()
' Y9 ^3 m. a. K! Q
3 b+ ^, n3 v& w/ f9 J& J- O- j3 s. L        hr = m_pDisp->Invoke(5 _# U& r- \# }" r; o, S# l
                requestID,
( M, \" S5 @, C: n) k% b7 h                IID_NULL,
8 a. k3 @0 k7 v" M; r                LOCALE_SYSTEM_DEFAULT,2 F) M/ ?9 |3 \2 E
                DISPATCH_METHOD,, C. K0 ?) ~% G. m1 S. Q& P
                &dp2,
6 ~/ D( }( {% O" m1 Z& @. I: a                &var,
8 K" z& {$ p7 I. Y                &ei,
% l% D( W+ D1 f                &uiErr);  R4 ^2 [# ?6 D" s' |" j+ F
" G6 z1 ?6 S3 O) X# J- }
        SysFreeString(topicStr);
% J; D( t6 ]4 s; @' Z- m: K/ K        SysFreeString(itemStr);* Y% `( Y7 f  O8 F3 ^0 t3 u
请问该程序是获得extend里面的哪个值?, d4 O$ M  ?+ D6 f
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2025-12-24 16:56 , Processed in 0.014238 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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