设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13277|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:- r+ e4 x9 H0 N8 }8 I7 K# w
Name = (WCHAR *) L"Poke";
2 Q5 Z/ b: n& j7 p" g. m7 b0 O+ D                
! O8 `- G8 D% q4 R        hr = m_pDisp->GetIDsOfNames (
! E. A! A, t/ m- W                IID_NULL,                                // reserved2 Y/ D# n# H, J
                &Name,                                        // Array of names to get IDs for
0 o( s2 U" P: k. c6 k& ]1 S+ s                1,                                        // # of names in the array
2 f6 U5 K( I" t# N" V                LOCALE_SYSTEM_DEFAULT,        // System locale& h& m( O% p4 z" J
                &pokeID);                                // Array of IDs to fill on output
' x9 B) f1 q" i) N                        # k2 |3 w( X, }. h. g. c
        if (hr)
# k* ]7 i+ i1 {2 M' @                {
. g9 _" F. K( K8 u. D                MessageBox ("Get Poke Unsuccessful");& A+ m* j9 l' Y- F1 [2 Q
                return;
* |; P- z# v$ a" [. a) `/ y* e8 I                }
4 R/ k2 s1 P" G( [$ Y
8 i1 C1 L( ?& l' o/**************************传递数据给extend**************************************/
& _0 V3 V3 D$ V7 x/ }        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);) Z1 s8 W% Q. O% J, `$ {
       
# C2 ^2 X, c" h1 G' }         valueStr                                 = SysAllocString((WCHAR *) L"1232");
6 `5 T) L( P7 c% X0 q$ h        VariantInit(&pokeVariant[0]); 6 I; h6 K" X( c8 c' n5 w: d( K4 M
        pokeVariant[0].vt                 = VT_BSTR;
* E) p% k+ ]! M. Q% f: L9 n: g        pokeVariant[0].bstrVal         = valueStr;! W0 K* g% H7 p& E* n* H: }
& p  J) O" @6 _$ s0 Q( G
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");& e7 ?& F0 m7 A2 j
        VariantInit(&pokeVariant[1]); : ^- C9 ]% o9 a( ?1 v( M
        pokeVariant[1].vt                 = VT_BSTR;
% H4 g( B  r8 h+ s        pokeVariant[1].bstrVal         = itemStr;
* T& ?- {$ O1 |1 y! c' }
& K/ x, Q! Y4 h# a0 O1 |* x          topicStr                                 = SysAllocString((WCHAR *) L"system");
  ]9 Q  t+ {1 |+ e7 P# j" n8 B        VariantInit(&pokeVariant[2]); 8 a8 t7 X) d$ I
        pokeVariant[2].vt                 = VT_BSTR;
, H) @- @4 W5 k) t" H4 O( ^        pokeVariant[2].bstrVal         = topicStr;% x0 \5 r, u+ P( t1 C

( ?8 t7 i, v& v7 m) R7 z3 G//        Set the DISPPARAMS structure that holds the variant.4 N1 Q6 G& O9 c" f6 k

$ \7 i# A7 K; D& S3 C, p        dp.rgvarg                                         = pokeVariant;
8 f: V( Q6 o9 C% O1 b2 s/ s7 z        dp.cArgs                                         = 3;
. X' ]. O4 M" ^        dp.rgdispidNamedArgs                 = NULL;+ w$ }/ m/ m, R  \4 C
        dp.cNamedArgs                                 = 0;
0 V' U! A8 n" M6 _6 P# Z3 M
2 J; R' T: B4 S& C; Y//        Call IDispatch::Invoke()2 F8 M( _$ V* J' n9 ^1 }4 b% j
6 V& z& t. _& I& y6 P
        hr = m_pDisp->Invoke(
( F5 p' [, {' I# D: m7 V& s6 U                pokeID,
4 C2 w5 O+ {! {, y                IID_NULL,
( Z, c! X  ?- @. V! M3 E/ W                LOCALE_SYSTEM_DEFAULT,; q2 p- s4 |# P/ Q# Z, ]
                DISPATCH_METHOD,' s! U* d! y  h8 Q. k
                &dp,
( e* E) I8 c4 E2 w! V1 b7 x5 h' z8 m                NULL,
6 ?6 o7 u8 X& T* @5 n+ z. X                &ei,% R; _: n" R% Z- D2 _& j
                &uiErr);
3 w4 G' h, h  P' J, t' I/ C; V. ~9 ^; y7 c8 @4 t; O
        SysFreeString(topicStr);
% z- U! B# p2 |& \9 A7 s5 h) s        SysFreeString(itemStr);' a8 j/ }" O7 L* i
        SysFreeString(valueStr);
% v, E! }0 y- v6 M) p" E) u0 n& P/ X" O
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
' P! M; R/ k5 R& Z) y9 d  F& Y# z* Z此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
7 x$ x& ^+ G5 L0 D7 J) B* Z
8 l9 }: P* R, l& Q4 W) l; t( u0 E( ?! p+ b- b
2.这是request的程序, I) a) c1 `0 X, e; U
//  Request a value from Extend1 k$ i! K3 Z( V% F3 r$ m8 r
//5 g2 v; @: V' E
//        Initialize the variant that will hold the BSTR.  Set the variant's
  s) Z# A2 f1 y/ ~( F//        type flag to indicate the fact that this variant holds a BSTR. Place the; ]  Q" h& C: M# D3 ]9 Z' C* S$ g
//        BSTR into the variant structure.
; W# t: s6 R, M7 v" f
/ V  x% v. W( S  N$ R0 {        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
* c7 o2 u# X8 W! I( G/ N        & O3 c2 u5 x  R3 L6 z- t$ }
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");- q9 M. E0 u/ q. n" a
        VariantInit(&requestVariant[0]);
# P8 T2 O& S- B/ H        requestVariant[0].vt                 = VT_BSTR;
% U! }  g6 z6 G% i: \' W; [        requestVariant[0].bstrVal         = itemStr;' R4 ~% r) H3 Y! P. k" E0 x

8 `7 F! w7 V( z7 R3 h- E          topicStr                                         = SysAllocString((WCHAR *) L"system");7 M4 K3 p! M& j4 K8 z) J
        VariantInit(&requestVariant[1]); $ X3 Q: H, s7 e( ?4 L+ _; e* h+ U
        requestVariant[1].vt                 = VT_BSTR;" P3 [# n& z5 a1 ]. U
        requestVariant[1].bstrVal         = topicStr;
5 o3 i; J" c. P' ^1 {0 V0 K  @- f9 O% o4 ]8 D- C/ Z+ X& |  y3 ?
//        Set the DISPPARAMS structure that holds the variant." _( g  o2 `6 i" X# b

. S" U8 Z# r+ j2 H        dp2.rgvarg                                         = requestVariant;, g8 `1 U5 C# @# e: l% q3 j
        dp2.cArgs                                         = 2;  S4 J! Y& ]+ k
        dp2.rgdispidNamedArgs                 = NULL;
2 D& ?0 k* i& e, Q        dp2.cNamedArgs                                 = 0;
# ]0 W9 s3 H) R8 ]
! L+ Y1 |: x2 `) \  J         var.vt = VT_EMPTY;" }( T* D! S  M, J) z8 M# P

4 {  \( p: t6 l+ T' E//        Call IDispatch::Invoke()& T+ t9 U8 y# E" y

6 P& N: D' r0 B: ~" `. w        hr = m_pDisp->Invoke(
  f, }) b* L6 b                requestID,! u0 y" K' Z% l
                IID_NULL,
5 L/ [2 P; l6 i7 g# A                LOCALE_SYSTEM_DEFAULT,
. C$ C6 C' A5 c$ a1 u. o* w                DISPATCH_METHOD,
; r, C  w2 Z% }# t0 j2 e                &dp2,1 c: G- x% @+ P" Y" k, v8 P
                &var,8 Q9 {( h* Q( U6 f# D+ u
                &ei,
4 c5 p- L8 }  a, g4 ?) U                &uiErr);
% r* @  G' H& m4 N
& @& l  s, K9 E5 W$ k  Z6 x        SysFreeString(topicStr);
7 I6 g" x7 ?  @; m0 b) k4 P        SysFreeString(itemStr);
2 E$ U- d4 Z( M/ n; b: s请问该程序是获得extend里面的哪个值?
) ^; k* @" ~; ^9 V. c如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-20 12:09 , Processed in 0.017453 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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