设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11313|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
5 o& V7 L. `  w2 zName = (WCHAR *) L"Poke";
+ _4 b4 S/ k8 {# m( W                
# `) A: M$ ~6 [        hr = m_pDisp->GetIDsOfNames ($ l" o$ J$ c, }1 G7 Q" k
                IID_NULL,                                // reserved
6 ?" x9 t  D6 X                &Name,                                        // Array of names to get IDs for
9 M! C. V" l& J0 u                1,                                        // # of names in the array4 n, i- ]9 J2 m# q; S9 [
                LOCALE_SYSTEM_DEFAULT,        // System locale% s7 F) R. X1 W9 n  |* [' V
                &pokeID);                                // Array of IDs to fill on output  d# L! k0 S( @3 C9 {. |- j& w
                       
9 Y% }. e* O7 v) |2 Q        if (hr)
0 A* O9 X& P% e& [                {
: H6 S- u# j' g% \& u, p                MessageBox ("Get Poke Unsuccessful");
/ E. S7 N2 C2 k  W                return;' }+ O; R* J6 P' Q. }; U
                }
7 F/ Y; v) ?. X& j8 j/ J
) v3 C, u+ K0 U& v2 y/**************************传递数据给extend**************************************/
  V" K$ K5 k$ y+ j/ O        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
' o" R8 l$ l% @/ c6 T- N        # @3 h. Q3 p9 Q; O  a# ]
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
1 U! J: H8 ~- z4 L& L        VariantInit(&pokeVariant[0]); . N8 i' l' I) K/ e
        pokeVariant[0].vt                 = VT_BSTR;
. B* ~( n4 f6 l; \# N1 H% }1 E        pokeVariant[0].bstrVal         = valueStr;
% A1 [8 j% h( p+ r% x' B. H: U% \* {! l9 w0 n% e0 k& Q/ w
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
  m% w! v0 ^8 c/ f' V2 z        VariantInit(&pokeVariant[1]); 2 z  P0 ^7 M3 S( B3 w0 d
        pokeVariant[1].vt                 = VT_BSTR;
1 v' {7 Y+ D) H5 T2 }        pokeVariant[1].bstrVal         = itemStr;' _2 I5 o& Q8 w0 i

7 d# G; c" T! P4 X2 G% @8 |          topicStr                                 = SysAllocString((WCHAR *) L"system");0 b) c* i0 g; _% g; W/ [
        VariantInit(&pokeVariant[2]); ' T! [: m/ Y! u& T- c: |+ w
        pokeVariant[2].vt                 = VT_BSTR;
! Q$ a# ]$ ^! A9 G2 S7 M        pokeVariant[2].bstrVal         = topicStr;* t+ D# A% d$ d  I

! a; ?; [+ P+ n* b% Q! u  L//        Set the DISPPARAMS structure that holds the variant.% q, v* \6 u" d; j/ R

$ J. }' a# k9 q        dp.rgvarg                                         = pokeVariant;
  }7 T% o6 C3 m; Y        dp.cArgs                                         = 3;
% @4 s9 B! T  Y9 u$ `, O        dp.rgdispidNamedArgs                 = NULL;5 h6 W- ]$ Z  H# j# U
        dp.cNamedArgs                                 = 0;, b% L4 n& I, C# ?& |2 p. W
! @  _; ?/ [8 a0 r* l; G- z
//        Call IDispatch::Invoke()) Z/ s5 B% R% x6 |) m) y! e9 M( I6 D
% X" T' H+ N8 |# j$ k# ]# b2 v) d
        hr = m_pDisp->Invoke(
. G. g/ J  b( ~# v  f                pokeID,+ a- D) K3 [' |' Z) }" }. J
                IID_NULL,4 R; H$ w4 c/ [! Y# O
                LOCALE_SYSTEM_DEFAULT,& K% N. J" d$ C
                DISPATCH_METHOD,! r8 {1 t+ Y0 Z* u, e2 f( ?  @
                &dp,
1 v- y8 T2 }$ B1 Y' Y( g                NULL,- i: \( n# G) r5 B6 n
                &ei,
* j+ |8 M: p/ A7 G, q( Y                &uiErr);( j: O$ Z' E: }( K
; q" G5 Z/ Z$ s- O8 m' U9 {
        SysFreeString(topicStr);  M  ]" G3 c& F2 [& G, |# U
        SysFreeString(itemStr);
5 v( f5 o% d0 R( ^6 {        SysFreeString(valueStr);
- A9 |; e! X# ~" J. ~8 E' C* b
% B; H% g" K6 U) y# X现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
$ R/ S/ h; p, J此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
) m7 ?9 {& L5 H+ v$ Y. x/ B9 ?: J! H( i( p9 U0 }2 f
. x5 y3 W# Q' s* L- ]& b! u
2.这是request的程序3 \/ d; q+ d; j; B  i
//  Request a value from Extend' S! b: |6 W* m7 {
//
! V, g& n7 {1 M2 f//        Initialize the variant that will hold the BSTR.  Set the variant's# S+ X# I1 o9 H5 ?+ v
//        type flag to indicate the fact that this variant holds a BSTR. Place the3 L  V8 Y* \' G) ^6 i/ ^4 K. i9 \
//        BSTR into the variant structure.
  X+ b- n3 @4 t# h) M  v4 ^) `& @0 |: C! ?% [1 d
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);7 Y9 }7 t- [: f0 s
        ' O/ f+ W0 t' [8 O& b! \
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
- E7 e- v# V% T% a6 [% x% F        VariantInit(&requestVariant[0]);
' ?( r2 w) @- A; A; g& N" S! n        requestVariant[0].vt                 = VT_BSTR;# t3 d* c* h' I: E
        requestVariant[0].bstrVal         = itemStr;
% _9 E8 e% l& Y8 D7 M" T+ p* X
2 d8 d' r9 e, O) p/ d* }          topicStr                                         = SysAllocString((WCHAR *) L"system");& D2 V% s! h, U/ b' Z
        VariantInit(&requestVariant[1]);
$ }( V9 A: z1 ?* W$ h        requestVariant[1].vt                 = VT_BSTR;
( ]  J" g% E* Q0 s* q( C        requestVariant[1].bstrVal         = topicStr;$ [; J6 y/ A6 H8 T# r

' G. @$ ^4 C# Y! \//        Set the DISPPARAMS structure that holds the variant.
  J7 E0 w! O3 I5 j8 D1 f, d- y1 t- k  u# o9 \& L, C" L% @" R
        dp2.rgvarg                                         = requestVariant;( U& Y% {- d/ x. Q6 X
        dp2.cArgs                                         = 2;
  V, M& l0 K7 f        dp2.rgdispidNamedArgs                 = NULL;# H5 i, b; E& D% c7 c8 E
        dp2.cNamedArgs                                 = 0;& l; l$ L8 N) `. e. p- [
8 W9 S. Z# w/ o4 b- b
        var.vt = VT_EMPTY;
6 N$ P7 A! r% J" a
% I7 V9 _" K: C9 T//        Call IDispatch::Invoke()
8 o4 M. b9 E% Z) g5 q, B( B% k6 b! X* O. P5 @2 d5 Y- [9 n
        hr = m_pDisp->Invoke(
1 W: H0 n5 D- e* a4 C  H                requestID,
" j6 j  F( y2 @/ }3 m7 v                IID_NULL,
' z- H1 c! g  o* j3 [2 @0 j1 e  Z                LOCALE_SYSTEM_DEFAULT,
8 v: u" h2 B- t2 m8 H                DISPATCH_METHOD,
' n) p7 B3 `/ p" D% G% [& E8 @                &dp2,1 e+ z* F+ I3 `  H
                &var,5 @; Z& w1 f, P* Q
                &ei,
$ r5 x, R) k$ K# ~$ F. Q* {- ]                &uiErr);+ S& N. U& y7 U' ?, }

8 o; y: ?) j, @" b        SysFreeString(topicStr);
) W" w+ Z0 M1 I* k' g* X        SysFreeString(itemStr);
. a  F' m- `( y& E! a请问该程序是获得extend里面的哪个值?
  X& S5 n0 t5 B9 m' h如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-6 11:09 , Processed in 0.013394 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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