设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9933|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:7 v% ~, d$ w3 V2 O" k( e
Name = (WCHAR *) L"Poke";' h% j0 B5 w2 ]; H* T; a
                
2 {- z/ {( P# O9 q/ h        hr = m_pDisp->GetIDsOfNames ($ |/ k, S3 @* y( E* z# F
                IID_NULL,                                // reserved- p. ^4 e/ ~2 ~# c% [
                &Name,                                        // Array of names to get IDs for% o  v% l- `/ [* K4 @# N
                1,                                        // # of names in the array
8 F- f2 v. @; Q. R( f' a                LOCALE_SYSTEM_DEFAULT,        // System locale
; g# d6 ^% w1 _" `9 b- z& i+ f                &pokeID);                                // Array of IDs to fill on output7 w% j$ E6 _; ?% j( G
                       
! J/ e& R7 T6 r7 \* _/ j+ r& x5 R        if (hr)0 r( @- L# L9 K( n
                {
/ G1 z8 j- R0 o                MessageBox ("Get Poke Unsuccessful");8 i5 k5 G. h) G5 l$ c
                return;* }' N1 S( W( g+ u/ L
                }3 s4 V5 A& ]" b5 b

  ?/ V/ p% {, B0 n+ D( ^5 b' w/**************************传递数据给extend**************************************/
, f: X9 i' X; C4 v        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
5 I% g* E4 s* N- `& k+ G- {       
5 _1 }1 o% V' ^: H         valueStr                                 = SysAllocString((WCHAR *) L"1232");% P! t1 f- ?7 h$ r. H3 i
        VariantInit(&pokeVariant[0]);
. q* Q7 O' R) }$ f' C0 ]* t        pokeVariant[0].vt                 = VT_BSTR;8 ~- D+ D: }) o- n$ S
        pokeVariant[0].bstrVal         = valueStr;, Y2 v7 w* m, @0 f: T

# r# e' F3 C9 U, |: H$ L% j         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
7 v8 i* d2 L: @% W" [! {2 J; L        VariantInit(&pokeVariant[1]);
, y3 d" C8 a8 [' l6 G        pokeVariant[1].vt                 = VT_BSTR;2 E* I) i0 u. n# S% P% B% J" [
        pokeVariant[1].bstrVal         = itemStr;
$ W6 `. r# n: Z
& m$ w$ l. \3 @' M# _% e          topicStr                                 = SysAllocString((WCHAR *) L"system");1 [. w2 U0 N7 Q! s" `7 P
        VariantInit(&pokeVariant[2]); * x5 [# }. j6 Z
        pokeVariant[2].vt                 = VT_BSTR;& k: j2 P1 T) S6 G( u  i
        pokeVariant[2].bstrVal         = topicStr;2 p/ L3 q3 q4 A7 f% v  _  J

" R  e0 w1 u0 Z$ L7 E1 X//        Set the DISPPARAMS structure that holds the variant.
% ?& J5 Z0 O. j- T* F" i+ E
! t. z1 O9 v9 P# n9 g8 N( @: U        dp.rgvarg                                         = pokeVariant;
% s, I2 u) E% D; ^        dp.cArgs                                         = 3;
: N' R4 s$ u  i4 o        dp.rgdispidNamedArgs                 = NULL;
1 `, a: X+ _8 d6 O2 e3 z6 T        dp.cNamedArgs                                 = 0;: f. \- O! ]5 o( I& h
& b3 A6 X( M8 c8 Z0 V" K, L
//        Call IDispatch::Invoke()
+ [( Z: v9 y/ i( h) C/ i9 h5 k  M
        hr = m_pDisp->Invoke(
) v; S/ Q5 Y8 A9 I                pokeID,' a: s8 a) a" L0 z
                IID_NULL,
4 K. u# a' K$ ^) k                LOCALE_SYSTEM_DEFAULT,
; ]3 Q1 T! [- C0 W1 Z; z7 b                DISPATCH_METHOD,3 [; B6 X+ z  t) z- m. F& _
                &dp,
1 _3 k2 X2 G4 q( B- s# K                NULL,$ w% {/ z! ?; `% q  j% D, k% @
                &ei,. w5 C/ H$ \7 `& `8 C+ G
                &uiErr);1 n8 r. r, R, c+ T5 y

6 ?% D+ d; q4 W7 w  w( @        SysFreeString(topicStr);: T2 b- ]+ ~6 w0 k% l
        SysFreeString(itemStr);
* `9 O9 U6 |. M; G, {6 N        SysFreeString(valueStr);( U! A1 y$ a- b' K
# C5 C9 R" L2 A; ^1 J% Z
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
1 S* T; r( J3 g- W+ d此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????6 ^# m% [+ Q1 Z" L! M( f' _8 }" ~

! I1 v& w5 j8 _. r4 z% V
' v6 O; y0 H2 y# A2.这是request的程序4 H% f' U: M3 ?' G# C0 _
//  Request a value from Extend
; `+ l4 s, r8 Y& q$ P& r//' ]1 \* i& d0 _2 g$ g' Z. n9 n# w
//        Initialize the variant that will hold the BSTR.  Set the variant's
! I/ z4 |. o5 F6 V( w//        type flag to indicate the fact that this variant holds a BSTR. Place the9 E' t. M9 A- N: H. d
//        BSTR into the variant structure.9 B; b7 T5 ]# d* u, f
9 D3 \4 \0 L5 j/ E  J  o# C- E
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
$ \7 Y8 v: z5 ~; ?4 y7 f( V6 b       
  o+ I/ q  h) {9 u  E6 @+ ~; {         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
4 E: m. S  i7 X        VariantInit(&requestVariant[0]); : T  R/ X5 {+ Z2 i0 M2 x( B, d
        requestVariant[0].vt                 = VT_BSTR;) D9 W( Q8 `; N! {5 U1 U+ B
        requestVariant[0].bstrVal         = itemStr;
  K% g: ~7 M; \' o
; f. d, Y0 x/ }8 w- Y) l# b          topicStr                                         = SysAllocString((WCHAR *) L"system");
& K1 x/ V: p9 V' J& M5 C        VariantInit(&requestVariant[1]); " h! g# _  E6 v" ?( X! f6 }
        requestVariant[1].vt                 = VT_BSTR;( X1 h+ b& a9 A- S6 X" ]8 A2 @
        requestVariant[1].bstrVal         = topicStr;
+ ]7 C& @3 }" d& \: p6 {2 }
  @) T$ h# f  ^; n5 t3 b//        Set the DISPPARAMS structure that holds the variant.
! H: l) M0 H- ~/ t* R) J: u) {
9 U+ s# L' L4 w" r1 }        dp2.rgvarg                                         = requestVariant;# a% ^# {, _( A- I6 S
        dp2.cArgs                                         = 2;
0 H6 x( u8 C2 j. u! S  T: a        dp2.rgdispidNamedArgs                 = NULL;
- G3 e6 A7 b1 a        dp2.cNamedArgs                                 = 0;
  o+ r5 r  ?3 u: J+ k: q7 C8 B. Y6 n1 }2 M) G6 N3 [& J+ m; l1 `
        var.vt = VT_EMPTY;
! c+ @, J% J" h. p" o  W" I$ g3 J8 k: [( f/ Q7 M0 [
//        Call IDispatch::Invoke(); E& C$ v$ h; A1 J" {
: F# D* E" O9 P1 b( {6 |; k4 C1 j* G5 L
        hr = m_pDisp->Invoke(- U; y- A% x% a3 ~3 {# o, Q
                requestID,1 L$ @4 M" T7 n3 j! g+ L
                IID_NULL,
! Y% F0 k/ q2 ?" R                LOCALE_SYSTEM_DEFAULT,
) F* @. R3 [. W  r                DISPATCH_METHOD,( p5 K/ I, o4 R5 G
                &dp2,; h2 J! A' f. F" Y, J5 e
                &var,
% U) Q5 p0 o3 P0 }0 ?2 y                &ei,
# `2 t) V5 s+ o8 K5 P9 h) f4 N# v5 d                &uiErr);
8 `5 u/ R( z6 m( b' ^# a: h
. u# L0 A" A! i2 U/ Q) X2 N        SysFreeString(topicStr);. n$ g  s9 x( D
        SysFreeString(itemStr);, E1 N! i/ X0 z" `* N! B
请问该程序是获得extend里面的哪个值?
5 l% H) C$ h3 }* r9 i+ I0 h如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-5 20:19 , Processed in 0.019249 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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