设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12691|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:! e; g- f$ B/ c" b9 G2 {
Name = (WCHAR *) L"Poke";
7 g( ?0 |* U  N. G2 `1 x' b                 8 t( `) ?- Y3 v2 ], p
        hr = m_pDisp->GetIDsOfNames (
# l" b- @3 K5 x# C! J                IID_NULL,                                // reserved
+ }1 i/ Q+ k2 P; F) ?! t                &Name,                                        // Array of names to get IDs for  Z  }) [5 M% x7 B, X
                1,                                        // # of names in the array
8 p" g4 M$ e# {3 |$ `2 d                LOCALE_SYSTEM_DEFAULT,        // System locale/ z6 Y% l- F5 V9 l2 j* _& W
                &pokeID);                                // Array of IDs to fill on output; s0 J. f" c! d0 P$ J
                        2 Z! [! |% G* `8 _% v
        if (hr)  z+ L3 I( U( q8 u
                {! w0 g% g1 e: }0 F! E* i! p. a
                MessageBox ("Get Poke Unsuccessful");5 K$ o4 z$ t  V* N8 z1 O
                return;% }, j0 j& J$ b) j- `6 b1 v9 s
                }: f+ b; k% I1 |1 {0 |6 ~3 G

  k8 p' r1 f8 _2 E/**************************传递数据给extend**************************************/% W* O6 Y8 s) b7 S( N  ~
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
# ^! B1 D6 i1 C$ k. @; Q4 p; U       
9 p( \/ E  y) A/ Q4 H+ P$ W         valueStr                                 = SysAllocString((WCHAR *) L"1232");& z. g) v: m# q. F( e
        VariantInit(&pokeVariant[0]); 9 b* V+ z! p$ b3 i0 A; ~/ g$ K
        pokeVariant[0].vt                 = VT_BSTR;
0 N4 N1 w' Z' z# n* o0 v        pokeVariant[0].bstrVal         = valueStr;  g0 h$ {' O. l( q  h
% F! \* g1 N. r! q. o8 J3 b
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
$ ~& f8 B& G5 R, k7 ?        VariantInit(&pokeVariant[1]);
1 b2 b$ Y1 @0 L/ Y2 m3 U        pokeVariant[1].vt                 = VT_BSTR;
! x4 c5 S! K  g* }+ D8 i        pokeVariant[1].bstrVal         = itemStr;0 y( s* k) u' E

3 R* t1 z2 m  N8 K          topicStr                                 = SysAllocString((WCHAR *) L"system");
! e/ `7 Q0 @9 U- L        VariantInit(&pokeVariant[2]); + C1 q$ O. ]8 o
        pokeVariant[2].vt                 = VT_BSTR;
3 q, |, q) ~. m& ]+ B2 e# ^- a        pokeVariant[2].bstrVal         = topicStr;* }0 {8 _: u) r0 c+ w1 }8 p9 a

) Y! s6 q  j/ l. }/ }//        Set the DISPPARAMS structure that holds the variant.
/ E: `' T4 t, I" c7 n) \0 C
6 s0 O7 v4 d, a0 o        dp.rgvarg                                         = pokeVariant;
6 o! T2 M. S8 j6 a" t        dp.cArgs                                         = 3;
4 E! m# B. `7 E  A        dp.rgdispidNamedArgs                 = NULL;) L/ v' p8 N% b( B- c* k
        dp.cNamedArgs                                 = 0;" M7 J" k6 l# j  W- B' Y8 j

+ \& j) G6 D$ b//        Call IDispatch::Invoke()3 ]* Z- Y: ?) v6 v9 k2 ^' \; M; y

; x. {* i- h- L2 h        hr = m_pDisp->Invoke(" x3 i. B* k7 ?- Z
                pokeID,
6 g: B% ?& O: _5 Y+ d                IID_NULL," x% r+ m! J& q$ ]( a
                LOCALE_SYSTEM_DEFAULT,
% f7 m5 Z1 }9 N  y                DISPATCH_METHOD,
% [6 X( u* F8 W" ]. ]' ?                &dp,$ W: n2 m& v3 o: @' e7 @& f) j
                NULL,- @8 t( Y2 n/ j2 G+ ?) Y7 `3 m3 J) A" U
                &ei,
5 _7 Q5 B/ ~( l+ A! E                &uiErr);
' U$ a$ E  A' M+ V( r5 P, W7 r! I7 F; E# ]
% `# {9 n4 T# K0 q- L' A        SysFreeString(topicStr);
  g9 x3 h  T' [' D5 n% W: Q, G* M( l        SysFreeString(itemStr);% i1 W4 }# ]  g$ H1 M
        SysFreeString(valueStr);4 J( [9 d  s& \. ]
" b( x- \0 z; r& |: Q
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???' ]! y' r/ ^/ V8 `* ~. x
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
( N7 m5 R2 G0 P
$ n$ i$ L, i. S* O
+ |8 {9 y  o) X) |2.这是request的程序6 S4 y0 s5 g. A6 |9 l% `& A! n
//  Request a value from Extend0 Y% G  }3 w! D" S1 C
//# Z% L3 d3 h6 U6 n6 b5 Z
//        Initialize the variant that will hold the BSTR.  Set the variant's% Q) ]4 o8 @( g. h7 K- ~
//        type flag to indicate the fact that this variant holds a BSTR. Place the. c/ w( e, \- D
//        BSTR into the variant structure.
5 d: s# y! L  u9 |4 c; Z* d( n5 M& C4 k7 X7 j4 {9 i  G  P4 ?
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
, z. i! y9 {3 v: L3 a- O       
, _3 n+ r3 x2 t8 ?& D) T         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
3 {5 H# P( m/ X& \1 O: v        VariantInit(&requestVariant[0]);
: y! P0 L: B: _        requestVariant[0].vt                 = VT_BSTR;5 q  n# m& X. G/ N* B, ~4 j
        requestVariant[0].bstrVal         = itemStr;( U6 U! G0 A6 O/ f

/ I( |$ M& p8 f+ ^7 S" u          topicStr                                         = SysAllocString((WCHAR *) L"system");
$ b- S# m1 u) U: [        VariantInit(&requestVariant[1]); : M0 |: D% D5 g
        requestVariant[1].vt                 = VT_BSTR;
/ U* I' t* }2 s5 I  s5 X, D        requestVariant[1].bstrVal         = topicStr;( D2 `" q2 }+ P( D! J

; n0 G- w6 e& e, R2 [/ c+ G//        Set the DISPPARAMS structure that holds the variant.
! i& Z. U+ `, B
; r  s" P* K' Y1 A        dp2.rgvarg                                         = requestVariant;
3 h/ S. r/ x) R  |        dp2.cArgs                                         = 2;7 G4 V) d2 |% ]" ^" a
        dp2.rgdispidNamedArgs                 = NULL;* l( }' q4 M' z
        dp2.cNamedArgs                                 = 0;
5 b8 D+ t8 [( v' Z  c- G1 K  \8 w9 R5 T; w$ F
        var.vt = VT_EMPTY;  C. T- s4 y- m9 Z$ n; ^3 }. z
: J; o) z& b0 s3 `- \% ~* Z/ Q
//        Call IDispatch::Invoke()9 W9 ~- K/ I% M" S6 g3 X( Q
) @- f; w: [. c6 s
        hr = m_pDisp->Invoke(6 e' X3 |; h$ @! P" |
                requestID,
5 S- X0 z! _2 u' r* i7 d, q                IID_NULL,. X8 Z) c7 ?/ G2 m, O! N, n+ `" S7 U
                LOCALE_SYSTEM_DEFAULT,( A4 m) J) x& r* {! c$ n6 S1 O
                DISPATCH_METHOD,
9 I! J. Z; [3 @                &dp2,
4 h% ~2 x$ G. Q8 ~                &var,+ Q6 ?$ u# e9 X) N& o# J. W4 p
                &ei,
0 Z% [' }1 y/ T6 I( i4 m                &uiErr);
, w5 O( {6 C+ X. c* R, m7 k% M) c  ~; @2 C; l( t; y
        SysFreeString(topicStr);# L* |  A. o" w) |
        SysFreeString(itemStr);
  G4 _- `2 r% r' c请问该程序是获得extend里面的哪个值?
4 S1 r! H, \. ^1 {如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-25 05:41 , Processed in 0.019052 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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