设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9472|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:3 V% \9 A5 e+ q, v7 t* p
Name = (WCHAR *) L"Poke";2 w: {% q+ v2 y+ M# S
                 ) z1 o6 i6 u5 `/ W: E( ?7 ^
        hr = m_pDisp->GetIDsOfNames (1 G% l1 H' [, q  Q2 F! G5 n
                IID_NULL,                                // reserved7 F/ q% O. D% ?) ^& h
                &Name,                                        // Array of names to get IDs for1 ~- B( u* O: P3 U  q$ M8 ?
                1,                                        // # of names in the array
2 R8 n9 _; K- f" s1 `                LOCALE_SYSTEM_DEFAULT,        // System locale8 Q1 y1 v& ^/ O' c1 {: k7 Q, X
                &pokeID);                                // Array of IDs to fill on output. D7 C" F: o& B' y: W
                       
$ e" T2 A, J# }6 P1 ]. y        if (hr)
! r4 _) ]1 m  ?, F3 |/ w% k                {7 U2 L- X: n2 n
                MessageBox ("Get Poke Unsuccessful");* w) v, L, V% g, V2 _. _8 L
                return;+ j, B2 R  U1 ]. F4 d7 L! J
                }
0 ~1 e$ \( a! i  X$ M$ j) G) q. U6 J& @" b( Q+ L
/**************************传递数据给extend**************************************// D6 M( K) B7 j. F
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
/ F- @! k% w' F/ ]/ }        . ?9 P& T$ h2 x* o  s- {" q
        valueStr                                 = SysAllocString((WCHAR *) L"1232");; y* h7 Y# i5 w& K3 m" n
        VariantInit(&pokeVariant[0]);
2 Y" u4 W6 B) b        pokeVariant[0].vt                 = VT_BSTR;0 Q5 ^) ~/ @/ X: o  e2 H, w
        pokeVariant[0].bstrVal         = valueStr;; Y2 T+ K: ^2 `" f
6 V) x" ~0 S3 [: n
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
6 G) f7 X9 V6 @* D* K2 m. y, |        VariantInit(&pokeVariant[1]); $ V; N6 R& o7 r; ]+ z4 C5 `
        pokeVariant[1].vt                 = VT_BSTR;0 Y; O* p3 u/ s( s8 G5 e
        pokeVariant[1].bstrVal         = itemStr;
3 v3 [0 J  g' w. V/ ?: U! Q- \
: H* L. U( M0 Y; h5 r$ n$ a          topicStr                                 = SysAllocString((WCHAR *) L"system");% K: ]  e4 j1 B  c. n2 j8 V; E" a- O
        VariantInit(&pokeVariant[2]);
3 A5 i3 m/ Q; q0 n  g7 U) C        pokeVariant[2].vt                 = VT_BSTR;6 Q9 w6 E; v/ T# g! v  D
        pokeVariant[2].bstrVal         = topicStr;3 C  T% _7 O- w* X$ t5 A

( Y, |& k8 F& X5 P//        Set the DISPPARAMS structure that holds the variant.0 B) F. U( w& E9 A/ p
8 d/ ^) X4 a" T1 X) x3 {
        dp.rgvarg                                         = pokeVariant;) G6 z/ D) s: Y1 E: `
        dp.cArgs                                         = 3;
% K# b3 M) b6 y, J- i' D        dp.rgdispidNamedArgs                 = NULL;
* `7 Y4 v* I7 N) ^% ]+ M        dp.cNamedArgs                                 = 0;
8 O9 J! k* }5 }2 n
* O( N, q1 k8 ]6 Y1 l//        Call IDispatch::Invoke()  p, C3 ]1 k4 `, _) B: m
2 p  W$ w# c" R: ?, ~
        hr = m_pDisp->Invoke(" L) _- Q7 a" D4 M7 \3 D
                pokeID,+ A& f$ z1 h! @: p) \1 ]
                IID_NULL,( R' K. P4 U7 B" ~
                LOCALE_SYSTEM_DEFAULT,8 n  Y- s0 _) K4 j% W9 i9 z$ u
                DISPATCH_METHOD,; T$ g1 V! G8 P$ X- ~
                &dp,; j/ W  y# r$ C) x5 }! `
                NULL,1 J. C. l# n! M8 T0 }% V7 G
                &ei,
  `5 _6 B# n; k2 w9 O* ~                &uiErr);) n5 Y' T# S- c  l3 h

) Q0 Q8 g" E% O: [+ `* `  c        SysFreeString(topicStr);
3 x* [$ l* Z' F" H( x! |* {& J        SysFreeString(itemStr);
; M$ y# ~7 _% r, M0 x3 L- q        SysFreeString(valueStr);
, H$ ~- X5 _* S/ _1 @4 j
9 I5 r/ b: U$ e8 x8 O: _, P& C9 Z, X4 F现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???/ W5 t6 z: Z' I! n8 T. ~8 A, K, y
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????6 d9 H, O1 H4 Y5 a9 H. a/ y

. Q8 [5 w: X( [. r$ c
8 o. X" u/ f% h& t: ~$ L2.这是request的程序8 I0 s' N2 _: c7 K
//  Request a value from Extend
* \4 y9 N3 K/ c//
% c' p& o  ]- L/ W( `0 S1 |//        Initialize the variant that will hold the BSTR.  Set the variant's3 c4 C# \" z* h! t; X
//        type flag to indicate the fact that this variant holds a BSTR. Place the) d" D; D- q$ m8 M
//        BSTR into the variant structure.! e5 Z7 C9 V) M0 E
7 `4 m: y5 s+ J1 d
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);; d9 ~! a9 S: _3 N; X+ z2 @  K$ \
       
& F, E  V% r# J, G3 O8 G/ G         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
- a' _  r4 O$ v& b- E( l' ^        VariantInit(&requestVariant[0]);
/ k1 t+ {( Y3 K# C; M) t        requestVariant[0].vt                 = VT_BSTR;
  V9 W8 a3 z' Q& t" s        requestVariant[0].bstrVal         = itemStr;
9 _) r- c# z% Z! y' f: C" U) @
/ A4 X: p0 F0 k4 h6 s5 X          topicStr                                         = SysAllocString((WCHAR *) L"system");
1 h! p3 X1 m; D# u9 o0 V4 }- w3 X        VariantInit(&requestVariant[1]); / i5 O& Z# j0 p# {; U8 S
        requestVariant[1].vt                 = VT_BSTR;
: v) Q: n: r/ D6 W. B  N        requestVariant[1].bstrVal         = topicStr;
" {5 m7 U9 ~) J0 B9 c+ ]$ Q5 g" C! b) a4 J! U7 n5 y
//        Set the DISPPARAMS structure that holds the variant.+ B8 v1 \! L% ~3 C. g
/ S0 q, R  ~9 y3 M# u7 @
        dp2.rgvarg                                         = requestVariant;
7 i3 V& G# r! r6 A, q: ?        dp2.cArgs                                         = 2;% _1 @% a: l9 }& u6 @
        dp2.rgdispidNamedArgs                 = NULL;$ V' ?7 u1 R( i; x" r( b$ y/ y
        dp2.cNamedArgs                                 = 0;
% j0 n: s1 y& j2 n8 c% ?' q1 t4 m& f' U/ @% J9 q+ L
        var.vt = VT_EMPTY;
- G: `6 B# A. n  p
. ]6 S/ H2 k$ E  ?//        Call IDispatch::Invoke(): l/ {( h: N; v# [1 b

, [8 j6 C+ c1 D$ \) ~% H' S: r        hr = m_pDisp->Invoke(1 N" a- \2 {1 G) U6 f. ]
                requestID,$ |* P- m/ W' [: S
                IID_NULL,& Z+ z7 I- b' A) Z; M
                LOCALE_SYSTEM_DEFAULT,2 ^8 r0 o+ a! d
                DISPATCH_METHOD,
8 f8 ?/ U& p, D) t                &dp2,0 c' k0 H) z2 H3 x. _8 w
                &var,
7 i* J% p+ d2 `; g) K1 N. t  B                &ei,! ]# c+ F8 D0 W( b: Z
                &uiErr);
$ K6 h  ~5 M4 ]6 j* c8 [( I- I5 i* _+ p+ z9 b8 X4 q
        SysFreeString(topicStr);: Y/ a! Y1 W" }  k6 J
        SysFreeString(itemStr);5 O5 S1 J6 @8 z. d( X
请问该程序是获得extend里面的哪个值?! m3 h( e2 C0 l7 ]9 Z: l' j8 n6 s+ q
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-4-19 01:01 , Processed in 0.012572 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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