设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11625|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
  M9 L$ F* Y3 ]6 j, r, VName = (WCHAR *) L"Poke";7 b) i5 e/ @9 n8 D# }
                
# A) W; i5 j+ u- T' N$ a        hr = m_pDisp->GetIDsOfNames (8 t5 @8 U5 ^8 d) h+ U
                IID_NULL,                                // reserved
' w! T9 Y8 x/ A% O5 \1 K                &Name,                                        // Array of names to get IDs for
. N  t) Q% ]% r  k$ t& [                1,                                        // # of names in the array
, E( v3 W" R' s5 A$ _9 l                LOCALE_SYSTEM_DEFAULT,        // System locale
( [. [2 T& `( T' A* P% h                &pokeID);                                // Array of IDs to fill on output% Z9 B; I( R" E4 K! O- [" B/ c
                        $ l& c3 B+ p; r+ q. ], c1 A" R0 i
        if (hr)3 L9 _- W- V- N$ `' C: Q( @& P: h
                {
2 t7 m( `' q# e3 \4 y                MessageBox ("Get Poke Unsuccessful");  k1 D6 X0 q5 j5 M6 s% T" w  c8 Z, N
                return;
  \; S* _& t9 M& M8 w% `                }6 q  {. u8 ]3 ]( u6 s
. g1 \3 N4 a8 ~( O
/**************************传递数据给extend**************************************/8 o8 j; P2 @9 M
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);# Y/ B9 p; C' {3 v. k! g" J
       
$ ~6 g  s4 q0 @- g; F( e         valueStr                                 = SysAllocString((WCHAR *) L"1232");
0 H' p7 A7 q1 J( r& }1 y        VariantInit(&pokeVariant[0]);
; J" H3 q; l/ m( O6 [        pokeVariant[0].vt                 = VT_BSTR;
$ K6 e9 F/ o9 c: Z& E        pokeVariant[0].bstrVal         = valueStr;
/ A0 z. F$ y4 c1 G
' H5 O: W, \& P6 N; l! u         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");- L( U; ^2 R- a& M- I; E  d+ Z
        VariantInit(&pokeVariant[1]);
8 }! c9 i; u# V5 w' L& U        pokeVariant[1].vt                 = VT_BSTR;
" Y  ]% y  s9 b  p! V        pokeVariant[1].bstrVal         = itemStr;
2 n5 i' I6 N% i. m0 N1 a  {) K/ h; X: Z+ [; g! U4 @: z& `  f" M
          topicStr                                 = SysAllocString((WCHAR *) L"system");
( M% {# [4 V3 F7 n  D7 u6 @        VariantInit(&pokeVariant[2]); 6 y0 b- `: O% Y. v6 k& I$ f  e% D; D
        pokeVariant[2].vt                 = VT_BSTR;
6 {3 K8 K& M/ @2 E" L        pokeVariant[2].bstrVal         = topicStr;& O: p0 i) B  m+ I$ h

. n0 Y% X1 K. |# w//        Set the DISPPARAMS structure that holds the variant.6 ?1 [  T7 W1 ^1 M  A  r6 O

& _) n# s- W9 g  E4 h# m        dp.rgvarg                                         = pokeVariant;
) D& B, A8 Y3 f- @9 Z        dp.cArgs                                         = 3;
$ m- P) q- ~0 [% P1 x; t# p        dp.rgdispidNamedArgs                 = NULL;! W; Q6 @) B7 v0 e& i
        dp.cNamedArgs                                 = 0;
7 Y8 v* e# B5 t: y
+ F# a+ ]- p  x7 {, d$ l8 v9 b//        Call IDispatch::Invoke()3 g# ~1 y$ k% f" w: L3 |! r- k

' I/ p" j6 E. f6 k, P0 A% i1 ^) J        hr = m_pDisp->Invoke(0 Y( U7 z! L# Z# A) R
                pokeID,: k2 m7 U; W8 E5 @
                IID_NULL,5 a" E8 D, t5 a7 h) I
                LOCALE_SYSTEM_DEFAULT,
8 t1 {$ {' M" T/ ~% a7 e9 j                DISPATCH_METHOD,- f6 d% w% w* Q  O1 A$ D8 C4 M" O
                &dp,! ^" b! G& C' P
                NULL,
9 ?- y+ f; \" v/ a& p                &ei,) c4 C  q- S! F) O
                &uiErr);. \4 `0 p4 W' ^; P! x1 R, i
! l$ B7 u& {& I$ ~3 p; d
        SysFreeString(topicStr);+ a# R+ X9 K+ l) b
        SysFreeString(itemStr);
3 {7 T" p- W& B7 A  N        SysFreeString(valueStr);
1 O9 q  ~; z8 {) D/ q' y* ^
( z, R$ f& I: A现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???2 V1 X7 @3 C) T/ q5 w
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????) E+ Q, G& y, z3 e
# ?7 r( \2 F# G# k
3 @9 E3 I# ~  g/ Z
2.这是request的程序! F% K+ \  i& L+ v
//  Request a value from Extend/ c' P( n' s/ V4 a  p
//
; c+ ~- |# j, Q& W2 d+ u  B//        Initialize the variant that will hold the BSTR.  Set the variant's
+ h$ @+ G$ U3 g7 ~: a//        type flag to indicate the fact that this variant holds a BSTR. Place the$ D9 E/ t+ }. F5 \3 X
//        BSTR into the variant structure.
  O1 G' y' t1 {8 w, O+ [. Y. f4 Y8 a; v( y
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);2 \3 W% I" V7 Y# f! Y/ k- g9 t
       
+ w& i! \. G# f2 [         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");. u# n- j- W5 ?( m; g
        VariantInit(&requestVariant[0]);
4 N- V  o' @& j% v: {+ D        requestVariant[0].vt                 = VT_BSTR;
2 X: e' P, v. j; X3 Q& ^; z; G  Q        requestVariant[0].bstrVal         = itemStr;
: l) t* _' O' h$ d8 p7 U1 G& }* h, m0 m$ l1 d: Q9 i
          topicStr                                         = SysAllocString((WCHAR *) L"system");/ l# c$ D" z/ \) Y
        VariantInit(&requestVariant[1]); 2 B0 s$ e, v: J! H5 M6 c
        requestVariant[1].vt                 = VT_BSTR;
- S: G. j' Z. i  {; D) F% [; e        requestVariant[1].bstrVal         = topicStr;& @' Y; w' @" S5 q/ l# B- V
0 M. S+ A* h: \4 |+ c
//        Set the DISPPARAMS structure that holds the variant.( U% `! ?! Q; P) G4 F

5 [+ m8 Z6 a- I; d        dp2.rgvarg                                         = requestVariant;( i& D3 _+ T" |- U* i9 n4 F
        dp2.cArgs                                         = 2;* J1 l9 n" y( w  X/ c
        dp2.rgdispidNamedArgs                 = NULL;' \& g7 F- w: v& ~: \, w7 V
        dp2.cNamedArgs                                 = 0;
- R* S& p, H( C3 a) Z5 v9 X3 U$ [6 D4 v% s
# u% p7 ]  o) f! J7 Q         var.vt = VT_EMPTY;
( E% q1 {2 Z) A+ F9 s% }
# l; G; M6 V+ a. C/ b3 F//        Call IDispatch::Invoke()% Z; i& G- ~& F8 |, z/ l- `

' r3 m' T5 [3 F) C3 ~' L        hr = m_pDisp->Invoke(5 ]; S  p5 w. A' e
                requestID,
( W6 M, O4 m! O8 }( x, e                IID_NULL,& w7 z! p+ C+ v4 ?; d6 k3 B6 k. G
                LOCALE_SYSTEM_DEFAULT,* o9 B( E( Y. B. u
                DISPATCH_METHOD,
9 v% F* |- Y5 l8 B8 S, P) S                &dp2,
  Z/ h% P5 i1 v) ]6 |4 h# k                &var," P& x( `% d0 Y' l9 Y2 }1 o
                &ei,# q1 }- P9 @9 ]
                &uiErr);/ \5 g- h: v% ^& [
0 v! O5 {: d" _1 T. p/ W$ j
        SysFreeString(topicStr);
: h6 F, ?8 V0 C1 U! E        SysFreeString(itemStr);$ e5 M, c: ?$ P* {( e1 c
请问该程序是获得extend里面的哪个值?
% f1 _, |0 w3 Q如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-15 23:34 , Processed in 0.012134 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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