设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11610|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:2 h& m' u% o( \
Name = (WCHAR *) L"Poke";
7 q, h1 M4 f0 @8 W                
2 B7 t# _* y: N5 \6 U        hr = m_pDisp->GetIDsOfNames (
! C& W1 @5 J1 u, y                IID_NULL,                                // reserved
5 P9 z3 _6 C3 [$ y5 y6 }  U5 y. p) M( Q                &Name,                                        // Array of names to get IDs for
. A2 d* n8 t- g                1,                                        // # of names in the array
8 U( g. b, t/ m2 Q$ G- v/ ~* k+ Y                LOCALE_SYSTEM_DEFAULT,        // System locale3 j5 X* F# y! k" L: r) f1 J
                &pokeID);                                // Array of IDs to fill on output5 _& @  v$ C  Q6 i4 U( I
                        1 \7 D+ v8 H& X' b' r$ t8 U
        if (hr)
9 v4 N; H" [! _# M# p  _$ G+ C                {
+ V8 Q/ U6 j- F$ T, B' N                MessageBox ("Get Poke Unsuccessful");5 G3 _# h, Q' h3 m  r
                return;
+ Z9 ?- q/ ]4 Y- w. Z6 K9 O                }
; o3 ]8 Y* R4 a. a8 V" p3 ?; d% y5 R& v( G! Y
/**************************传递数据给extend**************************************/2 s( [' s7 a1 e/ U8 d* P2 M& |
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
) p- T0 i7 J/ I        + @, {) P: o3 i% T
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
& ]2 r) V, M( V( S        VariantInit(&pokeVariant[0]); $ ^- f: r( m, Z" I1 |6 d5 c
        pokeVariant[0].vt                 = VT_BSTR;
9 Y. ^) P( N  u        pokeVariant[0].bstrVal         = valueStr;
/ t3 {+ z2 s! F. c' h- E7 J
' u3 y4 [6 F  G* t         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
, ]& w7 k1 N3 q5 s- G        VariantInit(&pokeVariant[1]); , l0 p( N# X0 W
        pokeVariant[1].vt                 = VT_BSTR;4 p# j, {7 Z& p6 j9 m/ H: X% h  y
        pokeVariant[1].bstrVal         = itemStr;( N/ d% [" o+ n% y8 C: _5 f4 f; ?
) B- B3 k9 U6 {& l7 I* S& ~
          topicStr                                 = SysAllocString((WCHAR *) L"system");
1 o& t# y4 X( W        VariantInit(&pokeVariant[2]);
2 S$ O$ W1 [6 \0 y# n; O3 f0 n. w% _! X        pokeVariant[2].vt                 = VT_BSTR;
/ n$ ~2 p9 t! I$ U' A% s7 A  t        pokeVariant[2].bstrVal         = topicStr;2 ]7 S6 w: E( R* r, o% |. F

; M6 P. y3 G) A# q& Z# n//        Set the DISPPARAMS structure that holds the variant.
: T# ^  }8 ]: `5 B! X( l) V1 x1 T; ~7 W2 p) M& U1 [
        dp.rgvarg                                         = pokeVariant;
9 |+ b6 V. f* M3 ?9 M" T, {0 k  @        dp.cArgs                                         = 3;. [: P: T# I7 ]2 e2 K1 E7 o/ y3 X
        dp.rgdispidNamedArgs                 = NULL;
8 K0 F- C; z; {) n        dp.cNamedArgs                                 = 0;5 K7 v, [* D. S3 H' _4 q

+ H# A, a: ~4 F$ T. ]" j//        Call IDispatch::Invoke()
- z- y1 J8 Y1 K7 p$ E6 f6 i  `% `- x: x& d" X6 m1 `& G
        hr = m_pDisp->Invoke(1 D5 p: o$ ~% q" C
                pokeID,' V: E  W& b: F8 `
                IID_NULL,6 e( ?. M  {& _) h: Q4 A4 P, b% f  a
                LOCALE_SYSTEM_DEFAULT," e: F3 [7 J  ?, S) `
                DISPATCH_METHOD,
' G9 t* V2 w0 q                &dp,
7 b6 N; x) ^! O" Y5 i2 l1 C) A- q. T" Z                NULL,
+ i$ y' ^' W4 p1 i# }                &ei,
' X  c: x) l, z# q1 |: }                &uiErr);0 }) ~! o: ?0 b7 i7 N: s) [9 g" A
' _. e% `  F. `/ }& V3 V3 P, _2 l
        SysFreeString(topicStr);& g. l& S4 ^( \  _7 Q
        SysFreeString(itemStr);
! p, R' W0 `& u. C1 h# [: T% Q        SysFreeString(valueStr);
+ v. c6 {6 F1 X( Y% w: w0 E# g, E+ L9 t7 m6 n% s9 v9 D
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???: h0 ^  \, r; ^: m
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????  d" ?" S/ |, Q+ c3 E7 v( `, I
& O# h  K% e4 F2 m' @

/ J. }+ r3 ~0 @- M( b2.这是request的程序6 j' b1 N+ [' W7 N% j/ C9 U" K
//  Request a value from Extend7 T8 X! ~1 Y# \" z. {4 L7 G
//0 }+ Z) J, l  d5 q, X( {" R3 Y
//        Initialize the variant that will hold the BSTR.  Set the variant's
  t2 i, }- ~9 A* [- \/ x7 ^4 p//        type flag to indicate the fact that this variant holds a BSTR. Place the2 T5 H9 ?' A# Z* a4 P; c
//        BSTR into the variant structure.
# S( O" v0 Z6 {0 N1 r0 w0 t: Q  m" g
* [, E' Z# C9 q& C; m        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
% y$ ]# m' W. G  G- y6 l# P/ V       
/ k* O, y1 v4 i8 [  V2 B: D3 V         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
$ p8 A% U( H  z. ?7 Z% J! m2 l2 |        VariantInit(&requestVariant[0]);
; g2 `1 U  N3 B6 C0 y* u        requestVariant[0].vt                 = VT_BSTR;
/ O7 v) B& M; Q        requestVariant[0].bstrVal         = itemStr;! A( S4 Q5 i' @9 X6 I: L

3 N+ B% A$ o5 [          topicStr                                         = SysAllocString((WCHAR *) L"system");
. z9 m; \) l* k  U2 K        VariantInit(&requestVariant[1]);
/ V+ [7 m, I2 j& Q' T$ L: u2 K        requestVariant[1].vt                 = VT_BSTR;
9 ?8 a9 I& w  R: b. Z$ h8 y        requestVariant[1].bstrVal         = topicStr;7 G: D7 c5 }- {9 P( s7 Y5 }$ W2 f

) I' T( i# [! ]9 V9 |) N//        Set the DISPPARAMS structure that holds the variant.+ v4 {. J- D0 m1 s2 C' k& M) S
& {0 x1 r0 Q, s# }, f
        dp2.rgvarg                                         = requestVariant;/ X1 F6 @9 O( _8 ]3 t# }
        dp2.cArgs                                         = 2;" F7 q3 m: J- E( N3 N) {
        dp2.rgdispidNamedArgs                 = NULL;0 I1 f# M0 }# i$ d% x: V
        dp2.cNamedArgs                                 = 0;
9 \3 ~; H0 {  u  b/ M% y+ y* ~2 `# E9 m0 ^
        var.vt = VT_EMPTY;
9 X) [: L) f1 N6 u2 \2 {
; _) L6 ~# j/ _5 C* D; M//        Call IDispatch::Invoke()
9 w3 @0 V) [) x1 w. Z
, R  Y, @& |4 N+ O, D7 U        hr = m_pDisp->Invoke(. @* ?" l# ]) i+ e9 M0 j
                requestID,8 y) B5 X/ ~* q& g2 u- r7 @
                IID_NULL,& k: l* e  J/ O  W- V
                LOCALE_SYSTEM_DEFAULT,) w$ ~- i4 t9 `- n* x
                DISPATCH_METHOD,& n# U1 H0 T( L& P/ ?
                &dp2," P- O/ E0 y  B8 n, Z  ~
                &var,+ c9 b. r) g7 q3 E% I$ {
                &ei,
* |/ ?  ~- v5 u( X0 ^. Z                &uiErr);
$ F3 }+ C' L% P  Y) D
! e& c: g, u# ~1 N+ x        SysFreeString(topicStr);. b. I; L. `: t# y5 Z; k
        SysFreeString(itemStr);
/ D) z5 ?1 j) o' D" g6 u2 A6 J请问该程序是获得extend里面的哪个值?
& Q; ?  \: g; \1 u如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-15 04:46 , Processed in 0.013592 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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