设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7856|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
! F; t: ?% }' }) QName = (WCHAR *) L"Poke";( s+ j6 e' Y" D% U; t" p0 ?4 S
                
# ^: R( g5 S- t, y6 i$ _        hr = m_pDisp->GetIDsOfNames (
% i+ S! H  G- g  G9 M. I" [, V                IID_NULL,                                // reserved
; }+ J6 A! [1 }5 U1 E. B1 Z( ~                &Name,                                        // Array of names to get IDs for
" T  \, Z1 ^  @, Z5 C                1,                                        // # of names in the array  @; T& `$ _9 ]. o. |+ o
                LOCALE_SYSTEM_DEFAULT,        // System locale8 {# R5 d/ \7 c* B1 v& }' y
                &pokeID);                                // Array of IDs to fill on output- W& b; A7 P, M! u9 f# h1 i
                        . V* p  E( N2 e) J5 \' `
        if (hr)
# d8 |/ o8 g8 q( t# |: ^                {% g9 D5 }% }- {' O! W; v' H
                MessageBox ("Get Poke Unsuccessful");
: K# K+ b/ @6 ^$ B/ v; J                return;
5 w7 N8 E+ |6 e3 ^* j                }8 l9 Z' s! x) [4 q/ z  t2 L

9 X* ~) J% _3 Q+ v1 }5 ]# i/**************************传递数据给extend**************************************/
  I$ A7 N# a" ]# v        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);6 h8 v' i, Y% p7 Q. @# Q; ]
        ' s5 U: {  V+ x. G! W1 V
        valueStr                                 = SysAllocString((WCHAR *) L"1232");. R- W& E8 d! U( s$ c
        VariantInit(&pokeVariant[0]);
+ @0 @  X6 y  U3 G: F2 v7 B        pokeVariant[0].vt                 = VT_BSTR;
& [" P% Y. ^$ i" C# Z) P5 K1 S        pokeVariant[0].bstrVal         = valueStr;
2 ]( m0 K" n7 @# P( j$ e$ @# P1 [, q% K6 [# a2 P1 i: a, X
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
! X: x, C/ d0 @5 N0 o& c        VariantInit(&pokeVariant[1]);
% {8 _1 @( k9 d. }" S/ _* N$ O4 J        pokeVariant[1].vt                 = VT_BSTR;6 f1 I! c2 U. V4 \0 G# F
        pokeVariant[1].bstrVal         = itemStr;
, G& l' R' x+ |( c- N8 b; {7 M* A! e" i
          topicStr                                 = SysAllocString((WCHAR *) L"system");. [! z% o: y7 i$ X. v; ?8 a
        VariantInit(&pokeVariant[2]); # e' D& L  \) a) i9 @" g
        pokeVariant[2].vt                 = VT_BSTR;
2 C# f, b# O+ }! E0 T        pokeVariant[2].bstrVal         = topicStr;
# w2 [# S1 o) s2 p+ A
/ J0 I/ e3 ?* {0 w# Q% ~4 W//        Set the DISPPARAMS structure that holds the variant.
8 s6 C. }" @) k) _4 c4 ^+ B# G! J( g1 }7 i/ E
        dp.rgvarg                                         = pokeVariant;
4 _+ F% [# ?( q! ]        dp.cArgs                                         = 3;
, c: W: ~. U' T        dp.rgdispidNamedArgs                 = NULL;
: K( Z5 r0 J9 a( H7 T  G        dp.cNamedArgs                                 = 0;
- w. \( F9 _7 |3 V) Q. l, [( z
. `2 |" ~! t' w: F7 q//        Call IDispatch::Invoke()- {; a- \2 B: M- D7 u% x+ c! w

3 d- Y2 R+ @5 T+ x) G        hr = m_pDisp->Invoke(" `' J. K, G5 |. E/ C$ m% a
                pokeID,
! W3 E: g/ e9 u                IID_NULL,
# ]2 N- `$ }7 U* S                LOCALE_SYSTEM_DEFAULT,
9 ^/ i$ c( y# ^$ t. B                DISPATCH_METHOD,
9 ]) K, I8 l: R: G/ a; h                &dp,
1 D: R1 j' x" A* j' r                NULL," d# r) m  j) z4 b& j" X
                &ei,) X- H; ~6 A) {, b2 m  Y4 a* Y
                &uiErr);
0 J! X8 O; C, e$ ^" S( v" T7 E! Y. s* t( D' ^8 g
        SysFreeString(topicStr);
0 d, o3 q9 A+ Q5 V3 G        SysFreeString(itemStr);6 x7 k* [* \5 t) z
        SysFreeString(valueStr);
# a5 C. n0 ?: q) r- B% L% P8 A  M% R7 g( A
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???( l5 f1 t: L& k* z5 j% M
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????# W2 X4 H  z; v' D7 q
9 ~1 \2 T' C# N$ k& d2 @# n- }1 v' E

2 F2 T, j5 n# p  \! m3 I2.这是request的程序
0 U9 k. ^+ v, ~6 ^$ S# |' V: r' e//  Request a value from Extend2 J5 g9 |  T" H- S* D0 }
//
; L" `5 Z+ V$ d9 C//        Initialize the variant that will hold the BSTR.  Set the variant's& p' Z/ a% s0 g
//        type flag to indicate the fact that this variant holds a BSTR. Place the
6 v1 c2 n. j. B' u" ~, y, O, X! f//        BSTR into the variant structure.
: o1 V! Y" w% e) ^, k! s0 k; |: g+ n6 I
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
* N. ~0 _0 ]# W2 a9 i0 x$ V: W2 t" m       
# ^$ O1 g4 k- z1 L+ _3 k         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
# d, W4 `2 N* }. S  R        VariantInit(&requestVariant[0]);
& D! l) _# J& k0 N- m, C: z3 g        requestVariant[0].vt                 = VT_BSTR;
, D; X6 X7 w0 h5 k6 `        requestVariant[0].bstrVal         = itemStr;, A4 ]9 Y7 Y( N9 n

8 |3 I% Y- ~1 z- Y          topicStr                                         = SysAllocString((WCHAR *) L"system");
# U4 Y8 J% U5 s, U2 q+ Q- j  }        VariantInit(&requestVariant[1]); ! w0 U: W( l& f$ @
        requestVariant[1].vt                 = VT_BSTR;
( B1 [3 h' A7 a% j" i        requestVariant[1].bstrVal         = topicStr;2 ~- e1 l6 Z& ?  D* r* }& P8 X( w

6 B8 F$ S) {) h! k4 h5 R  Z) p//        Set the DISPPARAMS structure that holds the variant.
: c& b, c0 u  ^7 T" y9 o% J0 H, H& G4 H0 e8 A' z
        dp2.rgvarg                                         = requestVariant;8 A9 P0 u1 L, {4 \
        dp2.cArgs                                         = 2;
9 e9 `! h/ V, A4 H        dp2.rgdispidNamedArgs                 = NULL;
7 w1 n2 |0 G6 T+ W! f6 B        dp2.cNamedArgs                                 = 0;
2 Q, q1 s% P5 f" W. Y  X
0 g* v- N# |' P- B% j3 ]0 E/ Z         var.vt = VT_EMPTY;) w- O$ S$ }" F( _: ]# _

0 |  _' \, `; V7 r//        Call IDispatch::Invoke(). U9 C5 Q# n0 Z; n6 S! M5 l

, C, N6 I& j, j6 ]        hr = m_pDisp->Invoke(9 s. z1 t! `" I1 X6 Y9 K
                requestID,$ k( k! n; O; B
                IID_NULL,, A/ o0 P6 e( h6 m4 x' m6 x! X
                LOCALE_SYSTEM_DEFAULT,
' j0 h( X% ~$ m9 D                DISPATCH_METHOD,. w. ]) b5 U  L- L
                &dp2,
! X) u- V+ p% C                &var,7 x, d: \' y9 R* i! j
                &ei,
; G) h, d: r, y' V                &uiErr);
; g: E) v8 [' X3 ~1 P
+ Q7 i' @& u( \# m4 W( i. A9 B* w        SysFreeString(topicStr);
* ~( ]/ ^; f( P: G5 T8 {$ W) i        SysFreeString(itemStr);
$ G! ^- b2 |6 R: w6 ^' q/ ]请问该程序是获得extend里面的哪个值?8 ^& U7 }5 h, l/ h; I
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-5 08:04 , Processed in 0.015396 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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