设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12120|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:, r  k/ o  {, I0 d; C+ s" T5 P0 y% M
Name = (WCHAR *) L"Poke";
  _' H4 I. a* A( ?                 3 v8 Y1 [- s9 u
        hr = m_pDisp->GetIDsOfNames (
( L" G  P0 E0 x) w1 y# t                IID_NULL,                                // reserved
: S  R* X% N: S- Q1 d8 m. r                &Name,                                        // Array of names to get IDs for
. e0 l! B8 P- y' `) w                1,                                        // # of names in the array
; z1 Z7 c. H/ b                LOCALE_SYSTEM_DEFAULT,        // System locale
& N5 }6 g5 I7 v+ x: j& t: Q/ O8 R' v                &pokeID);                                // Array of IDs to fill on output2 ]( }2 v7 p, x/ }: q. b. Z  |! b( X
                       
  Q: c* [, L: c        if (hr)1 w- m8 D, M; z6 P7 S# o
                {3 L( O" J1 C! g7 Y, E0 o
                MessageBox ("Get Poke Unsuccessful");( w1 c( n* \+ e! W1 Z+ y  m
                return;# C* K) i" e) B3 j7 ^7 d! q
                }$ {% N9 r  H" O

! f* z# a8 p' i- u' P/**************************传递数据给extend**************************************/
$ X# y" }0 w: P4 w9 N        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);  q9 h. y  `+ T' g
       
  y* f1 c( O( r) `6 v+ v8 @         valueStr                                 = SysAllocString((WCHAR *) L"1232");8 W, R! H5 s: P  Z9 r4 K( `
        VariantInit(&pokeVariant[0]);
) ]6 m! n6 J9 v% M4 `; g        pokeVariant[0].vt                 = VT_BSTR;
  [3 X9 [1 e& A! S  h3 {/ t        pokeVariant[0].bstrVal         = valueStr;
7 ?7 J  l( ~6 z5 v9 F. g' G4 @
8 c) o8 s1 e5 t         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
& V- I" W. k; G' l- ?        VariantInit(&pokeVariant[1]);
/ e3 K8 l$ k+ Z& p0 x6 y        pokeVariant[1].vt                 = VT_BSTR;
0 D/ x: W" w- N        pokeVariant[1].bstrVal         = itemStr;0 u- ], ~, i: c* f1 o1 ]

! Y9 ~1 i. L2 m' c3 r; H0 S0 R          topicStr                                 = SysAllocString((WCHAR *) L"system");8 W: G( N$ O+ B7 @
        VariantInit(&pokeVariant[2]); 3 q+ f# O' C3 h* Z' S
        pokeVariant[2].vt                 = VT_BSTR;) m6 c% c4 j1 [( A6 ?1 n1 C
        pokeVariant[2].bstrVal         = topicStr;9 a- }1 s9 L6 D4 r: h) S

( f" }. B* o) {+ `//        Set the DISPPARAMS structure that holds the variant." ?( }( G. h2 Q! @1 b3 r, u1 ~
, A& d$ ~0 i' t) u6 x  t% v
        dp.rgvarg                                         = pokeVariant;4 a% t, Q9 i5 K
        dp.cArgs                                         = 3;2 _) b& T/ f" q2 n" M
        dp.rgdispidNamedArgs                 = NULL;
7 {4 V3 |1 e( Q' t7 H, G        dp.cNamedArgs                                 = 0;1 D. B' E& j& k# f& J

/ E; z: `: k  J- k! D9 z//        Call IDispatch::Invoke()) W; H4 [9 [2 R+ z+ z; Z
1 s4 a+ Q& J1 N) O  m4 \
        hr = m_pDisp->Invoke(1 U4 }/ d4 D$ b3 u4 @5 R5 j7 @% K$ V
                pokeID,% K+ `  }9 U6 p/ \
                IID_NULL,
- j+ z& o( F# n. r                LOCALE_SYSTEM_DEFAULT,
1 ]$ D6 L7 o3 T                DISPATCH_METHOD,
$ E+ O3 g% f6 A7 {                &dp,
9 s% e4 Q& W6 C                NULL,
" v# Y* D/ }4 o- n; A3 |                &ei,/ V5 u# [5 |0 H$ J
                &uiErr);
: F2 t* Y1 m! J9 G
0 D! S) T  u/ r9 k1 M/ P        SysFreeString(topicStr);
, u8 U7 `5 H* Y- F* ?1 J$ T( O        SysFreeString(itemStr);3 r% h2 a0 ~9 D) S& M! ^( T% z# H
        SysFreeString(valueStr);
# k* ?% P" y/ t) p5 D' Y( _& d
/ D" T/ e' U; B6 T现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???  ^# {  Z8 n' ]
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
+ E! m  f6 G+ m' S4 \4 I4 K1 [1 D% j# O# E: U

3 u: L9 w6 f! U( B: c" W2.这是request的程序
3 m3 s, ]' _% \! k& }//  Request a value from Extend' x4 v: A( @; b2 M0 B) P# \
//
. s0 w3 h8 g. D//        Initialize the variant that will hold the BSTR.  Set the variant's
( C, v" U. ?: e6 L5 |//        type flag to indicate the fact that this variant holds a BSTR. Place the  \& T5 @& F! N% G
//        BSTR into the variant structure.9 @& Z* [+ S8 k, b/ ?
0 W' L7 Q. n* }; k# m* v( ~3 V, r3 H
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
2 \0 a% a7 D1 `' X7 \9 |! |" w       
9 {6 n& K$ n8 s2 o8 b, l         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");6 ^* L$ B4 l. F  `. l# T( K* h
        VariantInit(&requestVariant[0]); # |* a8 B; g* A
        requestVariant[0].vt                 = VT_BSTR;
- d  F$ x' k% O5 U0 y6 q        requestVariant[0].bstrVal         = itemStr;- _8 i& p; |  o1 M0 W# h9 C0 X9 v. l

* l; q% I+ U) e' G9 G          topicStr                                         = SysAllocString((WCHAR *) L"system");
4 B# k$ ?4 t$ d3 z: I& H        VariantInit(&requestVariant[1]); 3 F* X; ]; G4 Q# T( W( {
        requestVariant[1].vt                 = VT_BSTR;( d6 |+ I) |  w2 A4 G
        requestVariant[1].bstrVal         = topicStr;6 l7 S# \% V: p) L( u

3 }' W5 f. K- w4 }# Q8 A//        Set the DISPPARAMS structure that holds the variant.
+ \' K6 o4 R/ a$ T& m3 f. x7 |6 M  y/ |) w1 g* {4 R
        dp2.rgvarg                                         = requestVariant;
8 @" P+ G6 p8 Q3 I        dp2.cArgs                                         = 2;
6 M9 ^/ Y' u& m& z- A/ I4 F        dp2.rgdispidNamedArgs                 = NULL;
0 {" c& ]* w' |$ m+ s        dp2.cNamedArgs                                 = 0;
8 V0 a6 X, V% v  f+ y+ |% }% q  ?4 P$ `& I1 i# [# {* v  J* J
        var.vt = VT_EMPTY;$ s4 C2 F9 s4 p
% f! X9 W  O2 f  n8 m
//        Call IDispatch::Invoke()) N  r& c4 r1 `# k- l2 ~
: \: w4 \1 K5 {7 w8 `+ K8 u
        hr = m_pDisp->Invoke(8 A% d2 q4 K# T5 L' d2 m& N
                requestID,
9 ]5 p( M* ^, h" N, P1 r                IID_NULL,  y, H! M$ c" M$ W7 q4 \* y* {) F
                LOCALE_SYSTEM_DEFAULT,( w  z) g7 n+ D4 t
                DISPATCH_METHOD,2 k# z6 T- D9 ?! [
                &dp2,
# h7 J6 u# O- K! Z6 y2 k; {                &var,$ I( [; m- f, b5 t7 O5 f/ F. M
                &ei,$ @4 d2 O4 N( `
                &uiErr);* {4 D. w4 F5 y  w* w9 Y

" J3 [8 r/ T3 r1 h  q        SysFreeString(topicStr);
  z! F6 K* {: ?% L( l; r1 D0 X$ ]        SysFreeString(itemStr);" Z; X: v! x2 P! C8 A) F/ e! ], s
请问该程序是获得extend里面的哪个值?
' C" ]7 k  K" J  B  a" o如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-31 04:31 , Processed in 0.012696 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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