设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13097|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
. x* S3 y: H, U* q" X- {* uName = (WCHAR *) L"Poke";
" ^% e# T' D: Z                
' ~/ z( M2 _7 j! }6 E/ F& o        hr = m_pDisp->GetIDsOfNames (
- m7 q% c. x" [                IID_NULL,                                // reserved  N& C" i- Z( [- g# U, i- l* V2 T3 c
                &Name,                                        // Array of names to get IDs for) x* {# e4 j, {6 L5 }) }
                1,                                        // # of names in the array  E' n0 r; q1 j+ t
                LOCALE_SYSTEM_DEFAULT,        // System locale% k: z6 J! A3 m' M5 v
                &pokeID);                                // Array of IDs to fill on output
- {1 g2 P, x1 C2 u                        7 r- g% L# a% @" R# p6 n
        if (hr)
/ z( {( C2 @" _8 W                {/ w2 g4 G" e3 J! J
                MessageBox ("Get Poke Unsuccessful");$ j/ J# _/ q) W* c( D
                return;
  k' b( L5 L" t5 z4 D2 n8 k0 D/ M                }
  f3 ~& L0 ~7 e! W" p+ Z7 |/ _) L2 C
/**************************传递数据给extend**************************************/
; V7 u' ~& ~0 c2 U* y6 A3 Z        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
2 Q! z3 E6 j! `( M. [+ K5 ^! a( l        1 T! |) G& T0 _0 B
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
% E7 y1 ^+ u0 |* P1 s/ t* y/ f        VariantInit(&pokeVariant[0]);
: }+ S% @; A" A( X/ z; F6 i2 D- s        pokeVariant[0].vt                 = VT_BSTR;" J& K+ C# x% A1 F) |8 I0 M, Z
        pokeVariant[0].bstrVal         = valueStr;
1 w& F7 g, d6 I. C+ M0 t6 T
7 E9 X$ i+ K4 l0 E         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");: i) l& c& l/ B! \6 |% _
        VariantInit(&pokeVariant[1]); . j" G& d" v$ ~
        pokeVariant[1].vt                 = VT_BSTR;
2 k5 u  u/ ~! y! q        pokeVariant[1].bstrVal         = itemStr;( e: k# I' G  |. r
- I, @6 b9 ^1 K$ {
          topicStr                                 = SysAllocString((WCHAR *) L"system");
4 @: Y- r$ t5 M1 w/ U% \" J        VariantInit(&pokeVariant[2]); # ?$ K& E: u' M- q4 h0 @
        pokeVariant[2].vt                 = VT_BSTR;
; u1 z; Z% S8 B4 o        pokeVariant[2].bstrVal         = topicStr;
' X3 h  m( A2 O9 ?6 q3 K
* E" S2 ^, {: N; L0 z8 v//        Set the DISPPARAMS structure that holds the variant.& L) f2 l7 |* |4 h+ O

. B+ ]9 C! `" n        dp.rgvarg                                         = pokeVariant;4 S, J- m5 E# i$ d/ e
        dp.cArgs                                         = 3;5 W+ H% b8 g6 a5 o& `7 v# [( c, |
        dp.rgdispidNamedArgs                 = NULL;8 H5 i9 }1 Q& ]6 W; H
        dp.cNamedArgs                                 = 0;1 X% z6 V( F/ y. {2 W2 ^
( V- z; u6 u; _7 Q
//        Call IDispatch::Invoke()
/ C5 j. v6 h2 |* V, m' U! o# o
9 X! Y4 E) `& [9 e) W; `, Z        hr = m_pDisp->Invoke(. J- W  c. S* d+ s
                pokeID,
; ]- I$ S9 i( H& V7 e6 l                IID_NULL,
  c$ o! }$ _8 {7 d+ y                LOCALE_SYSTEM_DEFAULT,5 \" d1 R+ {. X/ f9 W" E
                DISPATCH_METHOD,1 U; X0 ]" N  }' k7 J8 @) `9 P
                &dp,+ |: e: G6 N% Z) Q5 E$ q4 T
                NULL,6 x) b0 @; P. g; h' E" h
                &ei,8 _8 Z# p9 X; ?* X
                &uiErr);
( u& @- D) `6 y1 c/ F+ C% {
+ |, y- Q1 D; Z        SysFreeString(topicStr);
+ O* S/ S/ R" I# N# O6 s& t        SysFreeString(itemStr);
8 S& U. H  {7 C: T1 c; k        SysFreeString(valueStr);
6 t. G5 J: s  h  d. R; ^6 Y, w, p# M9 H5 G6 N3 p
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
& }% M0 Z6 d- ~此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
! m# I/ ~  y- N& ^- d$ q5 s
5 V) a6 P0 |6 I+ H
3 \& E6 @; Z/ ]* ^8 w  j2.这是request的程序
% D8 l' E' W; c  S' s//  Request a value from Extend. J; j- j& {- \
//
0 ^! t. p: Z8 n0 G7 Q5 S3 z5 J//        Initialize the variant that will hold the BSTR.  Set the variant's
# V# L9 r5 B0 Z7 A3 e5 F4 T3 w" `4 r//        type flag to indicate the fact that this variant holds a BSTR. Place the9 Q" F  W2 N4 F7 y
//        BSTR into the variant structure.
% d9 N6 b( r3 Q% Y3 C
: a9 e$ H3 @9 G2 W9 s        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);3 F" a6 x/ l. X0 d- e  j5 Q
        ; [6 r7 L) ^* x% }2 Z7 i
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
! W1 e9 w/ u; @" \# N8 M        VariantInit(&requestVariant[0]); 6 [, w+ R( |  Z6 }5 m# ~6 ]7 ^0 `
        requestVariant[0].vt                 = VT_BSTR;
) T- p7 G# I! r: \! V$ `        requestVariant[0].bstrVal         = itemStr;
+ [2 G8 T1 t% {  I4 A1 G
9 l3 W. Z% A, ^# K, g          topicStr                                         = SysAllocString((WCHAR *) L"system");% {. L2 c' c2 R- U
        VariantInit(&requestVariant[1]); 7 n! f, j4 \3 ~/ ^/ a
        requestVariant[1].vt                 = VT_BSTR;: M- j* G3 v0 W4 m- [
        requestVariant[1].bstrVal         = topicStr;, A1 O% f2 f; O6 B1 E6 F
0 V! V- q6 O1 i' X! u9 S4 _
//        Set the DISPPARAMS structure that holds the variant., ?$ N3 A! |( k& K/ k' R( c
- Y! y/ h' m+ E) S8 Q
        dp2.rgvarg                                         = requestVariant;
) w& `# z: F5 @# C5 M        dp2.cArgs                                         = 2;
# T1 }+ V5 V8 ^- d* _        dp2.rgdispidNamedArgs                 = NULL;' B/ b: K( g% h+ x1 T1 D
        dp2.cNamedArgs                                 = 0;4 D/ `7 P+ q! i6 s% W( Y

2 t# X4 K, D: [         var.vt = VT_EMPTY;5 {" ]6 n- |, h) k, `3 b

1 X' _! j( A. n//        Call IDispatch::Invoke()
  ?' H2 T" q4 e$ B6 K
+ x$ R& s& i. I3 Z        hr = m_pDisp->Invoke(3 k9 V+ [) _8 c2 n
                requestID,
' r9 b3 x5 \" j2 e' V. b/ m                IID_NULL,
& z* D0 J5 u6 _, \: r                LOCALE_SYSTEM_DEFAULT,
+ Y4 Z/ E% T2 ~/ [4 {                DISPATCH_METHOD,1 f8 r! R5 b) @1 M9 g2 [. H
                &dp2,9 g4 H# W& G6 _- l* [
                &var,3 ]# T6 [9 }' P! o2 Y. L
                &ei,! p5 Y. I. ]9 A# D: R
                &uiErr);
# k, F$ x; e8 I0 I& `/ a2 X! b% i5 p1 [  [5 O# O2 j! v
        SysFreeString(topicStr);2 n( H) P; d4 E( ~: M2 ?) a, D( d
        SysFreeString(itemStr);
7 T* v3 H9 a6 I' ~& h* r" \. ?, x请问该程序是获得extend里面的哪个值?% N# ?. d+ W! J; }: ~; G  c, u
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-12 11:09 , Processed in 0.018947 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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