设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10501|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
4 E) f6 N/ v- CName = (WCHAR *) L"Poke";' Z4 F- Z- n, @4 N
                
4 X( G6 X- N  t1 M( S        hr = m_pDisp->GetIDsOfNames (
0 S% u. M  ?% i; O                IID_NULL,                                // reserved
+ X/ t! _& x6 b                &Name,                                        // Array of names to get IDs for5 U% ^+ M: N# Z' o) F" F
                1,                                        // # of names in the array+ R2 T) H! K+ {1 A" n9 _
                LOCALE_SYSTEM_DEFAULT,        // System locale
; p/ _3 x& `9 r( v$ i5 m5 `                &pokeID);                                // Array of IDs to fill on output
6 d+ x8 c7 t6 y5 {; ?7 T0 X                        ! }& Q1 Y. u6 l2 g8 G4 a
        if (hr)
+ M3 m. T) T5 ]. h' o; m* I                {; G' I9 T. D, S( D9 h) @) O
                MessageBox ("Get Poke Unsuccessful");7 L1 ]4 q+ |) C& j% f5 y7 s
                return;
" j0 N1 y5 ?3 z$ G" G- i                }8 `2 i8 W' m/ U
0 F) ~# g# M! @% r
/**************************传递数据给extend**************************************/
* w8 k( k, T! C; u+ r6 t; _" f: k        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
2 _4 X5 X7 }! J4 p! f9 e. s& i8 o1 c       
. p) f7 M* d4 n; g6 p4 T         valueStr                                 = SysAllocString((WCHAR *) L"1232");
- y3 E' |* b- i        VariantInit(&pokeVariant[0]); . L* w. Y! ?4 G1 a: ^
        pokeVariant[0].vt                 = VT_BSTR;
) z; h* x( c/ z0 |0 L2 n- y        pokeVariant[0].bstrVal         = valueStr;7 o$ u4 v. K, ]( M0 B( V- e- S* y
& f, ?8 A( ^+ T' ?) K
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
# P7 e4 ^3 F+ ?& D( e4 V        VariantInit(&pokeVariant[1]);
, |+ x4 S' y5 U        pokeVariant[1].vt                 = VT_BSTR;
, b8 x! o2 s6 o7 c        pokeVariant[1].bstrVal         = itemStr;
  k9 z" m/ \" d( w$ p
+ h' q) j; g! s$ V          topicStr                                 = SysAllocString((WCHAR *) L"system");5 V8 B2 r! T8 m- H3 ^2 A
        VariantInit(&pokeVariant[2]);
" @& O* m$ L6 R. G        pokeVariant[2].vt                 = VT_BSTR;
$ y6 x" S+ o9 C; n1 g- `4 i        pokeVariant[2].bstrVal         = topicStr;$ b6 O2 n3 i# R! M9 c9 f  A

; n) S) i. L4 F8 ~# _//        Set the DISPPARAMS structure that holds the variant.
& Q% N3 ?# O! S( B. R* W# `/ @/ \
) I: N& T7 \0 w4 R        dp.rgvarg                                         = pokeVariant;
: {* y; \% c2 n) l0 l/ E( ?        dp.cArgs                                         = 3;
- B& J% ]& h0 F/ |        dp.rgdispidNamedArgs                 = NULL;5 w, i2 t7 W: w. T  o# e2 \
        dp.cNamedArgs                                 = 0;& I; P/ c' W- i

: c* h; J- M4 T2 K2 M0 J//        Call IDispatch::Invoke()7 G) G* {6 e. Q8 I  A, O$ l

6 \: ?9 g, n! a2 w7 l        hr = m_pDisp->Invoke(
3 M$ j. W7 @7 a1 P% M                pokeID,4 W/ C7 c2 @5 [6 ?
                IID_NULL,
9 l/ G2 a5 j: k4 P  Y  @1 L3 l                LOCALE_SYSTEM_DEFAULT,
" u2 M% J/ v; v                DISPATCH_METHOD,; y: {/ ^, R2 s. R6 Y
                &dp,
* s; ]! r2 Q1 d" g9 {# f" |- x9 g                NULL,  ?" B1 l1 v2 L
                &ei,
/ J1 n. i2 J' w                &uiErr);" y: Q3 u! p: \/ q& s9 A2 X8 i/ R1 J
, W* u2 c4 m# Y3 N& _8 x; c
        SysFreeString(topicStr);: a* S) d! S4 g- R3 K
        SysFreeString(itemStr);
' E1 m8 ~! N# y. v. j        SysFreeString(valueStr);4 c8 U3 q* e" q0 V

% I# p8 c/ L5 \# q* F3 M现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
' g% t3 m# V0 x/ E; U; O- b5 Q! G此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
1 _% e  n4 u) u' I4 [+ r0 c) i
1 g- u1 M% U( L& {; n% B7 b/ {/ M" z- n
2.这是request的程序" {# ^( b6 {1 l: d! \
//  Request a value from Extend8 |. b4 H" A5 B& R
//
8 v* z4 I* Q6 }( c7 ~: `' x//        Initialize the variant that will hold the BSTR.  Set the variant's
1 w/ K5 F0 B" X* d' u% \//        type flag to indicate the fact that this variant holds a BSTR. Place the
* p! v, g2 J. c& c! H//        BSTR into the variant structure.
+ X2 U6 i/ h/ i9 b" G* M- D/ n. d  e! x+ j8 `# {% [0 x/ ^) j
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
2 q/ p8 U' o) w' `        5 B/ W9 M% x) S: z/ \
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
0 S! N9 _8 j# ^; i        VariantInit(&requestVariant[0]);
8 ?  h9 s! C9 B0 a4 q        requestVariant[0].vt                 = VT_BSTR;# @! S  @/ E% [% q- H2 X
        requestVariant[0].bstrVal         = itemStr;
- y$ s9 @  I, H' ~, x* I* m* @2 z/ g6 Y
          topicStr                                         = SysAllocString((WCHAR *) L"system");
6 f6 Z: I- Z7 b) ~        VariantInit(&requestVariant[1]);
7 ?8 ?( `$ N7 Q$ r        requestVariant[1].vt                 = VT_BSTR;' N1 m6 \3 p6 W+ z. P3 r0 n$ ^1 m
        requestVariant[1].bstrVal         = topicStr;8 ~8 A. F: c1 j, t: a
' c" v& f9 r# l0 T# c# K
//        Set the DISPPARAMS structure that holds the variant.
+ U/ p0 m  f6 w( j9 r# L2 ]3 t/ s* ~2 D5 m
        dp2.rgvarg                                         = requestVariant;
8 a3 k& W& i- }6 b        dp2.cArgs                                         = 2;9 i/ z- y6 {* [0 P, g2 g5 [
        dp2.rgdispidNamedArgs                 = NULL;
8 M% ^  n0 M$ x" y+ u4 b        dp2.cNamedArgs                                 = 0;5 _( p7 b9 {  B! m/ g, x0 o
: X' U0 i, l& h
        var.vt = VT_EMPTY;& m$ t" @; `9 n( @- M9 K
; f$ G+ a, Y+ ?# J9 n! c% A. ]
//        Call IDispatch::Invoke()
5 w, b/ [  ~; d- w
6 N3 a: ^. ]& @6 v& b6 Z        hr = m_pDisp->Invoke(
% O2 _" v1 I( e! j  ^, o) I1 u                requestID,
3 Q! Q$ T4 ?4 F4 d$ c                IID_NULL,6 [8 G" C6 E# F; m8 H
                LOCALE_SYSTEM_DEFAULT,
( \# `+ S& W, h3 R2 }, Y                DISPATCH_METHOD,
) ~) q) j$ |& t2 _3 P5 B, y                &dp2,2 `& Y. A: X) a
                &var,, l+ q( j8 p  H) c2 t
                &ei,
$ y) z3 U) D4 \" A/ g                &uiErr);8 y5 B5 |; M" D+ [/ {! Y
, g7 C* I/ Y$ t0 h9 @
        SysFreeString(topicStr);
0 K" M9 Y, a& l        SysFreeString(itemStr);' W- \2 W+ s9 k) Z
请问该程序是获得extend里面的哪个值?
8 G! m; z% N$ q4 z5 b8 m; ]- j如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-28 07:04 , Processed in 0.014764 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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