设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8257|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:) K' \( \# A; h6 {, c  V8 |
Name = (WCHAR *) L"Poke";
0 ]# }1 L+ S; H3 A4 s                
8 v7 k2 G% k& w1 |# }% A        hr = m_pDisp->GetIDsOfNames (
' G6 j5 q, M/ \8 C1 Z                IID_NULL,                                // reserved! M8 E2 \* B& |8 Q! N3 i
                &Name,                                        // Array of names to get IDs for( h$ f& Q" O7 }& q; u) B- d8 ~6 ^
                1,                                        // # of names in the array
8 R! k$ `* |+ F! {( q                LOCALE_SYSTEM_DEFAULT,        // System locale
; u% b& d- Z+ c# q' Q7 @9 b6 \1 `* J                &pokeID);                                // Array of IDs to fill on output( c- Y3 u- \# w2 Z
                        ( U, j3 O8 k! z4 h4 d
        if (hr)) a1 |7 p+ Q' D  T6 |3 A4 L# E
                {
/ b  M" Z" `# h: A+ [! b                MessageBox ("Get Poke Unsuccessful");
4 Y6 \3 s8 N% B% }$ M                return;( z# m1 a. O  c0 B6 a
                }) K& H5 W1 S" ]6 n: |

! g+ b2 W) K- r7 w; k1 G/**************************传递数据给extend**************************************/
) x1 j- P0 \1 f9 `5 U        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);" f0 p- {; f% y- i0 S  f7 ?* M" E0 W
        2 ~$ d# X% k8 Q" D: ~
        valueStr                                 = SysAllocString((WCHAR *) L"1232");& J1 ?# t! d, g% A
        VariantInit(&pokeVariant[0]);
% M8 B9 d; {3 [4 P. ?        pokeVariant[0].vt                 = VT_BSTR;/ L3 s. B4 V3 O% Q0 A6 ?1 ]7 f8 i
        pokeVariant[0].bstrVal         = valueStr;
& `. ]5 v7 w/ P0 u. U* j5 F% _( h) x! W/ p: N4 b
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");: G/ W9 G# O+ k' g
        VariantInit(&pokeVariant[1]);
0 \' ]; a- _" [% s% o3 B; @        pokeVariant[1].vt                 = VT_BSTR;" M2 o7 _; C: Y4 B, q8 n
        pokeVariant[1].bstrVal         = itemStr;+ J$ O: y* M& h8 @

& T8 T0 ?: s7 j          topicStr                                 = SysAllocString((WCHAR *) L"system");
! ~0 [; A, {- X$ [6 |# m        VariantInit(&pokeVariant[2]);
# j& W7 I) ?0 R( u: M        pokeVariant[2].vt                 = VT_BSTR;
" |/ i# X- _& a/ s7 l        pokeVariant[2].bstrVal         = topicStr;
2 u: ~9 Y3 V7 u$ {# {/ D2 t
* i, {8 Y5 V. \- ?3 X& `, a3 P//        Set the DISPPARAMS structure that holds the variant.
9 n1 K/ C9 N% R
: N9 P- Y1 {$ x" n. }        dp.rgvarg                                         = pokeVariant;
7 s+ S- \$ S/ c4 {        dp.cArgs                                         = 3;
& u+ ^: K, G: H1 M        dp.rgdispidNamedArgs                 = NULL;
$ ?0 p, @( p6 A  L        dp.cNamedArgs                                 = 0;
' p7 Y& X1 y6 D3 ]- `( }1 I
8 t" I  A9 G3 i7 z% G% @" S- ?- o$ P, [//        Call IDispatch::Invoke(): P8 |9 ~. u9 V* F, ]$ s' h
) F4 e& T" U2 P5 q
        hr = m_pDisp->Invoke(! B2 ~9 K  c! `4 J1 y; {# P
                pokeID,
% |2 W: a  g& o) ?- x: n3 ~                IID_NULL,
5 {" ?- A) L, Q$ K0 X4 n: B                LOCALE_SYSTEM_DEFAULT,/ I3 n. q% ^, F, I( y
                DISPATCH_METHOD,
/ A& p& B7 E7 ^                &dp,, C1 s# {9 s! V7 W7 q5 |. i& j
                NULL,! u. V5 x4 ^* h
                &ei,# a+ A" G0 t3 [2 _
                &uiErr);0 h9 {: x6 W3 S7 u$ M
( Y, H6 E5 j$ g9 A9 m1 I& v
        SysFreeString(topicStr);
; |; o2 n* ~; Z        SysFreeString(itemStr);
) |# K  `% E& ]        SysFreeString(valueStr);
; T" T9 \1 N# }' {, \* c6 A# U  c/ _: X) D0 T
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
6 `. z1 h' K+ h4 ?此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
) U6 U0 u6 h: A* Y6 U) t* a2 j3 A* J- B5 j# r

9 ^/ i7 \1 P/ R3 u2.这是request的程序
" z, T& R, @# R8 K4 v& V//  Request a value from Extend
) i* Y! f" D& D$ w. M  k9 c//5 R# O' i9 Q4 A6 z5 O, u
//        Initialize the variant that will hold the BSTR.  Set the variant's
$ p- b- g) Z* \5 J//        type flag to indicate the fact that this variant holds a BSTR. Place the7 Y% c% e+ S. i! o9 w
//        BSTR into the variant structure., r# H$ s" x9 ?2 n+ P) L# K
3 _1 Z: F6 ?. D" f, |' u0 ~$ N
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
. j& g& _9 V) P" F+ l6 h# a" D       
8 h0 y0 @% A4 v1 f! Y( R         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");1 t' @8 ]' o/ O* q5 r
        VariantInit(&requestVariant[0]);
! V: k$ j; ?5 [; B9 d/ \( S$ T        requestVariant[0].vt                 = VT_BSTR;
: [& p. f" ~7 B0 b0 X8 r' E' P/ q        requestVariant[0].bstrVal         = itemStr;
, I1 Q5 _! O" L) t$ z" H  h6 S0 L3 k4 ?7 f+ C9 P& J
          topicStr                                         = SysAllocString((WCHAR *) L"system");
9 J% V: r" s6 I. F        VariantInit(&requestVariant[1]); ' F" r$ Y3 h$ v# m' O
        requestVariant[1].vt                 = VT_BSTR;  C! X% H$ V3 e8 [+ L
        requestVariant[1].bstrVal         = topicStr;6 j- j: {; F- {% R8 w

- }0 g$ g5 c2 O1 \//        Set the DISPPARAMS structure that holds the variant.
1 r' M3 @; f+ z9 l/ `- e/ U( F3 [+ D
        dp2.rgvarg                                         = requestVariant;
1 j2 G& i/ F+ ^4 G0 ?2 U        dp2.cArgs                                         = 2;
+ f5 Q1 F( x- E1 B) H- K) T        dp2.rgdispidNamedArgs                 = NULL;$ c8 h/ t5 G; z' E
        dp2.cNamedArgs                                 = 0;8 }# ~$ D, d+ a* O0 O! E
( H" c" w/ p, I
        var.vt = VT_EMPTY;' U( Y- E* M* p! W' |; D* j

3 n5 a! O2 P! e1 @8 R3 D  D# u$ ]4 v//        Call IDispatch::Invoke()4 P; \3 p6 z2 ?# }+ W9 G

( H$ ?: d) A) e& c  H        hr = m_pDisp->Invoke(
/ v, a0 Q" R0 O, W/ m; {5 V) \9 ^                requestID," U' b' T, t3 H" r0 G
                IID_NULL,
4 ?1 B) h1 ]) b4 X% `                LOCALE_SYSTEM_DEFAULT,: u! T" t$ ]7 ^3 `  l/ h
                DISPATCH_METHOD,
' ~5 C# b; |4 u' R. c                &dp2,
! _) h- v- m4 [( D                &var,# U, k" o0 U* ]" o) S+ F. `7 M
                &ei,* P, X# _, }0 y/ a  a1 n
                &uiErr);
4 e) _* Y& ?, G8 C6 |8 L+ {7 m( ^8 G# x
        SysFreeString(topicStr);% [  v) Y! [9 u8 v. f! k
        SysFreeString(itemStr);+ c5 G% {  E* l, v6 ~  {
请问该程序是获得extend里面的哪个值?* e/ M. F( V" @8 l/ u
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-21 11:23 , Processed in 0.012906 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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