设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8067|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:4 m9 v& |6 j: M3 s
Name = (WCHAR *) L"Poke";
8 ]8 N. v0 ^% _- ^                
: J% x. }9 {& o        hr = m_pDisp->GetIDsOfNames (2 R/ s/ ]( N6 g0 f
                IID_NULL,                                // reserved0 {! |* D. G! \$ d
                &Name,                                        // Array of names to get IDs for
8 t9 H$ n; Y/ k$ V9 |) N9 ]                1,                                        // # of names in the array
1 N) u; s, P2 Z                LOCALE_SYSTEM_DEFAULT,        // System locale
; @7 h2 U: U. R: w9 |% o  r                &pokeID);                                // Array of IDs to fill on output
/ O3 y- b* E/ U- s& @4 [( z' K                       
) t. A1 [) o! f$ K2 [2 `9 R        if (hr)
; T2 [' d, y6 c                {8 g. \5 V& v+ @& r0 I% w( X# K
                MessageBox ("Get Poke Unsuccessful");1 a3 O; ~, O, K& U
                return;
1 i) {5 y5 |! S, Y  D* `                }8 {/ F6 e: l9 G/ z9 F( K' p' S

! v5 e4 M# ^/ E) r- i( X- u/**************************传递数据给extend**************************************/
6 |5 j9 M, b, `- b& Q8 g4 c        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);) x/ s: R! j6 N5 r7 X
        7 G( L6 V5 h3 Y# I7 L0 A4 d# E
        valueStr                                 = SysAllocString((WCHAR *) L"1232");+ |& N9 }. r4 W! w+ g, G
        VariantInit(&pokeVariant[0]); 5 }+ U9 t5 o! v2 c6 L7 C3 U
        pokeVariant[0].vt                 = VT_BSTR;3 N' K( |' ^6 U9 m# X) X' Y
        pokeVariant[0].bstrVal         = valueStr;) {2 J! o% T1 C. F/ j! f. g
$ h2 b" [7 W: e, Y& P2 G9 @# }
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
% u0 a1 ~/ _% g% K1 L        VariantInit(&pokeVariant[1]);
3 p/ ]0 O; F6 d        pokeVariant[1].vt                 = VT_BSTR;
2 E" X- ?; r! c        pokeVariant[1].bstrVal         = itemStr;, c. S' a# U, f! I! w

" Q' ]. J' ^( W+ s) D          topicStr                                 = SysAllocString((WCHAR *) L"system");
8 W  Z" L# ]) a' ?0 v3 Y        VariantInit(&pokeVariant[2]);
4 ~' F5 H0 X. L' O        pokeVariant[2].vt                 = VT_BSTR;
  ~4 o* @  d  D3 B0 \; W        pokeVariant[2].bstrVal         = topicStr;- ^: w6 N% S2 I! _7 o. s6 _

) ^, h, F9 n, i) Q//        Set the DISPPARAMS structure that holds the variant.
! G, U1 |/ w4 I% u6 {- n
2 r: m  z2 Y- R        dp.rgvarg                                         = pokeVariant;
& @% T( f" N' v! v3 W. N        dp.cArgs                                         = 3;# ^2 m/ D; P6 y# Q1 `7 `
        dp.rgdispidNamedArgs                 = NULL;
# Y$ X; S) b8 a" F' y/ p1 d        dp.cNamedArgs                                 = 0;- G( e8 U2 E- x' ~

2 Y: ~9 V" [, t9 T. t//        Call IDispatch::Invoke()
  A) l8 V# i1 I# y7 {8 L
* a' R  X9 W1 O/ K* O        hr = m_pDisp->Invoke(
0 a* g5 M- b% Q/ t9 n9 T! l                pokeID,
7 R* [% o# [1 i: }" O                IID_NULL,( M* I7 ~8 h% u$ @# a
                LOCALE_SYSTEM_DEFAULT,; Y6 s9 `: S( e3 ~
                DISPATCH_METHOD,7 C' Z1 R3 _# c5 t
                &dp,
& V4 s* u7 Q. F, f; n# t                NULL,
7 B* C0 I* O. K4 ^/ l                &ei,, P0 T2 v, o7 d5 v
                &uiErr);: E4 J+ V" u( p5 ^
! J! d1 g% r2 M& L
        SysFreeString(topicStr);
1 Y$ C/ `' M# N2 L) n* k        SysFreeString(itemStr);
3 ^2 t) p! j2 @1 P6 ~9 N, m. x        SysFreeString(valueStr);
  ^, K2 i. `  w% G# @- p& n$ `) @+ Q3 G! ?
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
5 e, e9 R' ^- v- P6 H3 P; `此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
3 c# A8 _( W& n( f  ?$ }
$ Z1 _5 O# i9 i# T" k  u1 a( v( t" e7 @: {3 H+ Y
2.这是request的程序
) H3 l0 z* l: D9 Y1 m0 M//  Request a value from Extend
+ B) Z& j. l# ]" v$ C% y! ~: L//' R* K# p+ s/ M4 g! \
//        Initialize the variant that will hold the BSTR.  Set the variant's8 x- N6 i  b. y6 P! V4 V# Q
//        type flag to indicate the fact that this variant holds a BSTR. Place the( A8 }- ^& W7 m  w" N
//        BSTR into the variant structure.' R; s  H5 }. [' M6 E. W0 d

# h- S& C" A/ d$ I, ]+ ~  u+ M        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);3 V; q9 H( R/ ^6 s4 q
        ; r8 r4 n# Y9 ]; y. w: y: m# A
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
. o0 P/ |/ ^2 |5 _        VariantInit(&requestVariant[0]);
8 G) O- p& d& k        requestVariant[0].vt                 = VT_BSTR;5 Z  T# }; m1 L: h  O8 Z
        requestVariant[0].bstrVal         = itemStr;  B: M7 l+ l! q$ p6 H
- D  ?  M# h( \: [+ P% |
          topicStr                                         = SysAllocString((WCHAR *) L"system");7 A7 b- E/ ^1 g( c( @! m
        VariantInit(&requestVariant[1]);
0 b  E5 v1 s) U0 U7 R        requestVariant[1].vt                 = VT_BSTR;
% f! d: V* _" r1 l/ o( f# ?        requestVariant[1].bstrVal         = topicStr;$ _( r# a( p) i4 X9 K
6 G- D5 d# Z' ]
//        Set the DISPPARAMS structure that holds the variant.% b; f/ b6 T# j6 {
$ ^6 P' v8 p& ]% u4 ?. j
        dp2.rgvarg                                         = requestVariant;
% A8 j% t9 m4 y  Q9 R% Q        dp2.cArgs                                         = 2;  G9 g. `8 g' U3 \8 ^' K" {) H
        dp2.rgdispidNamedArgs                 = NULL;
& ?- [  D! A$ h9 j; B        dp2.cNamedArgs                                 = 0;) d# W) l4 ]- M+ F) P

' C7 p( K3 m" _$ f         var.vt = VT_EMPTY;: U3 G- c9 D) {9 w& J4 n4 J6 K! F3 c

, K% o/ s3 h+ x& A% ?) n0 I2 V//        Call IDispatch::Invoke()0 @) M. Y; [$ ~  Q

6 O2 @# T' i  d/ b) }        hr = m_pDisp->Invoke(
) u: u/ W7 N8 r( j8 c                requestID,1 J1 M/ y; x6 Z  ]$ q5 j# T: k
                IID_NULL,4 U3 r: M; S: E, R9 `
                LOCALE_SYSTEM_DEFAULT,, f6 z% u+ P; C! e
                DISPATCH_METHOD,
; q3 n) c# ?/ L                &dp2,
! a( C0 c" J; z$ }7 C                &var,
  i1 t! b# W$ y3 T; @5 {% p                &ei,7 w: r' J  A1 q2 t4 R
                &uiErr);
) K% P- U% i; y- m6 e% n) U9 i  y! x7 I* \( T: \/ H
        SysFreeString(topicStr);
1 y9 l% @3 E. {0 s        SysFreeString(itemStr);
$ W- s, v- b4 o( S9 i0 `/ t请问该程序是获得extend里面的哪个值?
6 B# Q( I  V3 U; o" E$ s3 x如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-13 11:39 , Processed in 0.015409 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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