设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7704|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:! j1 H) w. o' E5 w+ D# p2 i
Name = (WCHAR *) L"Poke";
: V0 j+ s$ ^; x- f8 k                 " V; x. D# s4 J) ]+ A. N1 {
        hr = m_pDisp->GetIDsOfNames (
/ K1 m  w; p& I8 \9 Y                IID_NULL,                                // reserved, k1 f& A$ N  u) n/ J) \# v
                &Name,                                        // Array of names to get IDs for4 F7 p9 O9 Z" n" j
                1,                                        // # of names in the array3 G; _/ Q* Q5 u! P8 y: e
                LOCALE_SYSTEM_DEFAULT,        // System locale! r' \. \* `1 D  L7 D  |: V
                &pokeID);                                // Array of IDs to fill on output: f  a' r0 G, ~5 ?
                       
5 i8 [% z( }' f$ h1 E; m4 k        if (hr)4 Y" Y( V- J; y- S
                {
' d4 ?4 ^' {+ b/ j1 N! ?                MessageBox ("Get Poke Unsuccessful");, V% S+ L5 Y5 R6 V# J
                return;( U1 y& i7 A- e4 T9 f* t
                }  x  i2 }1 o# D6 h6 f. k0 S

' S& S+ Z  w8 s4 I4 ?/**************************传递数据给extend**************************************/4 Y* b) S, H* I
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);; l7 F. Y# c0 b; k! s
       
: G8 r4 b, _# K) F         valueStr                                 = SysAllocString((WCHAR *) L"1232");
8 [& A/ V2 O2 w" v# D/ j% X/ F        VariantInit(&pokeVariant[0]);
4 t# v) {0 c; J  f+ x: t        pokeVariant[0].vt                 = VT_BSTR;
6 X9 t+ S% E: c' \! ^$ q        pokeVariant[0].bstrVal         = valueStr;
; R$ v. J8 T0 X, `0 b7 B4 n5 {; M4 k) W; A& k2 E
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
8 W- d; i& ?* s' j3 z) o1 S        VariantInit(&pokeVariant[1]);
' J+ ~" N, R, U! E. `, _        pokeVariant[1].vt                 = VT_BSTR;7 E3 J3 u0 l, T. b+ G: t
        pokeVariant[1].bstrVal         = itemStr;
/ B$ L- K" O% q2 c4 g! Y: m
6 m5 L5 P  O% ]; e& o. R          topicStr                                 = SysAllocString((WCHAR *) L"system");( T8 c$ }) Y; w  Z4 D' @
        VariantInit(&pokeVariant[2]);
& b) l3 r/ l5 H' T* N# L3 o- X; T1 b        pokeVariant[2].vt                 = VT_BSTR;; m; n. ^( T6 _9 m
        pokeVariant[2].bstrVal         = topicStr;6 e% ]2 l5 b7 O* i
& |, g* V: F  [) w* @
//        Set the DISPPARAMS structure that holds the variant.% z( w. ^) p# r  f+ s

* T) u3 \) N# k* N        dp.rgvarg                                         = pokeVariant;
& [+ e& p; v+ Q( f        dp.cArgs                                         = 3;: C& W8 ~% V1 U% D/ n& j1 j2 {
        dp.rgdispidNamedArgs                 = NULL;& X2 ^3 n; e% a+ `7 i1 c
        dp.cNamedArgs                                 = 0;( w; q9 j2 E8 Q% t+ H# {: I4 a

+ H& m. Q3 G% w//        Call IDispatch::Invoke()
. E* m; o3 k6 T, o/ {: }+ T* W* L( W$ M
        hr = m_pDisp->Invoke(
! N4 O' W2 i6 x% h& t                pokeID,
: f7 y0 G+ `2 @5 Y; G                IID_NULL," o: `3 w0 r; }2 I- b/ }6 F
                LOCALE_SYSTEM_DEFAULT,
; t& ?  i/ M  I$ t& G1 D                DISPATCH_METHOD,; T/ G$ z7 X- b/ \% c) I
                &dp,
4 W. y; |" Z) I+ ~# t                NULL,' \6 {. F  M  n" x& h
                &ei,  V1 r2 @3 w5 d* w0 u
                &uiErr);& F! e" n! h4 g8 q
2 [' \9 T. B# J( z
        SysFreeString(topicStr);
. R; y" i3 g4 F$ {        SysFreeString(itemStr);6 `- q1 J% d- F9 X5 d
        SysFreeString(valueStr);
% W( R* r/ x$ V# I$ B( K7 O# o/ A$ Z  g- R% h4 |
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???% e$ S% V' U) {3 I' w
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????6 f, c5 Y5 m. s1 `0 }. O& R% a4 e: {

( k5 j! a/ Z4 d& M* N- N  ^: j1 q; p0 f" b) i# a7 W
2.这是request的程序
1 U+ k# {9 i# v! }" g4 B' _//  Request a value from Extend
2 f1 V/ m" p! H. T//
' v- z: g7 |- ?* M) I//        Initialize the variant that will hold the BSTR.  Set the variant's! {; [! {, q/ S8 Z- [7 }
//        type flag to indicate the fact that this variant holds a BSTR. Place the
: n2 m! J6 \* M# v6 D$ n//        BSTR into the variant structure.
; v9 I$ T( t: {( B! j9 f  S: p
8 U; R1 s* k3 P. ~# G        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);. d8 j3 }9 ?- W4 l& g8 q. R& Z
        . M* e2 M8 O( z6 U& J
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");& i' p. t& S8 Z( l
        VariantInit(&requestVariant[0]); & j- K7 ~( i* W# E: P! p
        requestVariant[0].vt                 = VT_BSTR;
0 F- `' j4 t* {% F+ c- z/ f& r! b* r$ o        requestVariant[0].bstrVal         = itemStr;
6 m8 j/ a2 t  d" e# S) z0 C
1 `' j0 M' c8 v5 u" Z3 w! `          topicStr                                         = SysAllocString((WCHAR *) L"system");
2 m; K3 f3 d+ i9 e2 ?$ a" }        VariantInit(&requestVariant[1]); / }% ^4 n. m9 K* W
        requestVariant[1].vt                 = VT_BSTR;
. B3 L5 d5 i- r1 l# h        requestVariant[1].bstrVal         = topicStr;
4 C* `" g: }  B; w; ?$ g+ `- X' W- t
8 P8 S4 Z* l6 Y1 c8 ?//        Set the DISPPARAMS structure that holds the variant.
: ~* K  s1 H0 n1 u2 a/ Y8 ~; ^4 n  ]' J- H, n/ q
        dp2.rgvarg                                         = requestVariant;1 V9 C2 l& w! C$ f5 c1 t: e' V7 e8 H* Q
        dp2.cArgs                                         = 2;
( M( G+ h# W* p: Y0 x$ Y        dp2.rgdispidNamedArgs                 = NULL;
1 H, r8 ^( |, y  k9 j" c) S        dp2.cNamedArgs                                 = 0;
; i! x/ ^/ J* O
# W2 p. I: f1 [" m1 N         var.vt = VT_EMPTY;
  f; O8 I8 r1 Y1 {; ~6 N
5 J6 [7 w0 P; U# `9 x- `% C# e& c- N) k  H; p//        Call IDispatch::Invoke(), i" D! `9 G' C2 R+ c) \

  x, F8 r% G' r8 V: a9 ^! _        hr = m_pDisp->Invoke(+ l% V8 N+ z5 f7 w2 `  I( Z1 D
                requestID,
/ b# ~+ m0 `) x' M8 q, q                IID_NULL,
0 o" l0 D" E4 i5 x; c" G$ Y                LOCALE_SYSTEM_DEFAULT,
( S+ B' W  V, z. q. h% S# o, f8 y                DISPATCH_METHOD,2 M' Y) R$ p; f2 h5 Y2 V  M! t
                &dp2,1 k, W+ t% w, e, K, J3 i
                &var,7 u3 s. x9 `0 Z( e
                &ei,0 b' i: n% X" z. |% x
                &uiErr);" Z! }& \" p% V+ F, A" _

2 N* e6 ^( l! {7 O; }% Q* N9 X; X        SysFreeString(topicStr);& f% C; C) W/ I" b3 T8 F
        SysFreeString(itemStr);! q2 i; {) f& S! V
请问该程序是获得extend里面的哪个值?
% D$ S  ~- g0 k, e  I2 j如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-30 05:29 , Processed in 0.015619 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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