设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7646|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
/ r1 P" T7 w, {Name = (WCHAR *) L"Poke";
" M. Q: y* T. L7 s9 j& ^1 {                
2 P$ m0 r9 e# p; x6 N        hr = m_pDisp->GetIDsOfNames (
0 v- }$ |  X6 l' ~+ v6 v                IID_NULL,                                // reserved
" R& r% j; i; Y3 D                &Name,                                        // Array of names to get IDs for
! i" |1 M+ x/ W( F) p1 _  e                1,                                        // # of names in the array
  {" _1 w- n. `* i$ D                LOCALE_SYSTEM_DEFAULT,        // System locale
  H1 I8 H  `, ^; R, ?                &pokeID);                                // Array of IDs to fill on output( S/ `. R9 a- \1 V; w- g
                       
  }5 X* R4 r' ^! }$ S$ q        if (hr)
3 R  C# [# Z% |! y                {  m$ A+ U: \" {4 j
                MessageBox ("Get Poke Unsuccessful");
- C  @& B/ K# a                return;9 y/ p$ `/ Y) E3 Z6 i
                }+ g4 ~( @/ }; g! u) C
/ i7 f, m* }7 S! l# E$ e; B
/**************************传递数据给extend**************************************/
1 }2 q2 D6 R5 l- l4 u1 j0 @        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);! K/ l7 U1 c- K- k1 Z. i
       
( _3 D) Q0 c; G( `/ k4 m) O6 u         valueStr                                 = SysAllocString((WCHAR *) L"1232");; v. P( p1 t' N! J5 O
        VariantInit(&pokeVariant[0]); " ?7 D, P* J9 w" i' g
        pokeVariant[0].vt                 = VT_BSTR;
. s% _9 v2 S0 O; @, k! p$ U4 q        pokeVariant[0].bstrVal         = valueStr;
# B- N# S! L. P  D6 ~
+ n4 _* \0 y# D6 J" j3 |         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
% B/ `7 C5 `/ B* N        VariantInit(&pokeVariant[1]);
! R' g1 |. S# e9 i: c        pokeVariant[1].vt                 = VT_BSTR;
1 d, U, p- d$ r3 q* s; y8 y3 N' N        pokeVariant[1].bstrVal         = itemStr;% H0 S% l* N, q1 x

2 }6 P+ I$ q+ }9 U. X; }* A1 T7 ~: ?' w          topicStr                                 = SysAllocString((WCHAR *) L"system");$ E4 `" W5 B7 L- i7 ]1 ~8 [1 ?1 A
        VariantInit(&pokeVariant[2]);
' N$ O1 B5 l& i2 E# T        pokeVariant[2].vt                 = VT_BSTR;7 }) O" e4 C8 d! z9 F; L* [: r
        pokeVariant[2].bstrVal         = topicStr;
# k7 c& ]! I9 G2 B6 \$ F
* x& p* W- Y  O: d: z# @7 d3 O* H//        Set the DISPPARAMS structure that holds the variant.
5 J9 u3 s3 l/ ?9 c* z
9 }6 f3 o" ~/ `) o+ O) e1 e0 b5 L        dp.rgvarg                                         = pokeVariant;) D) q& `" |. v$ h2 R0 M) R6 [
        dp.cArgs                                         = 3;: m  A7 |  m* |9 c* n
        dp.rgdispidNamedArgs                 = NULL;% D4 k% @3 s1 @! }1 j) s$ z# Q
        dp.cNamedArgs                                 = 0;
7 q8 s" K0 f2 c0 q5 T" o( B! g7 D+ v0 U4 X
//        Call IDispatch::Invoke()+ |6 X! w" H7 {  H) V5 O: i
4 o, T( H9 Q3 r/ D! F4 i- {! W3 i, Z3 \
        hr = m_pDisp->Invoke(
& h1 \9 |5 n1 V7 e& Y                pokeID,
: H6 O. N' v( I                IID_NULL,
( ]$ L# H7 _% H/ ^                LOCALE_SYSTEM_DEFAULT,. u, b9 @- U) {* l) k
                DISPATCH_METHOD,
3 O4 e, Y! \0 G  E                &dp,
, f' j7 w# l$ ^, \                NULL,
' r* K6 J7 I1 G9 ^. ^9 h2 ~& ]' u                &ei,
, o' V8 r/ R" V5 E3 I4 w                &uiErr);9 t7 C! r1 r8 Y+ m- }& M: f  H
- W! J' h; W8 t; w2 @' }
        SysFreeString(topicStr);
$ f+ J& f, V7 @, ^        SysFreeString(itemStr);
3 p0 p! @& ]) k, @- q# [) I        SysFreeString(valueStr);8 W3 t( J+ M: U* V
. ~9 c2 _- ]2 i' f3 l
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
. t  b, u0 e2 v$ E* P/ g此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????9 X. z- t- p0 ~1 \4 p* ^) H
% C) G" R8 I* [6 i

9 W5 B( @2 s# S, f3 H2.这是request的程序
& b9 D9 o) N" C2 B8 R2 K( Z4 e+ @4 x//  Request a value from Extend3 q! D; J) q3 e( n; q5 R1 {
//
4 @/ _3 @" y; Y. C& l//        Initialize the variant that will hold the BSTR.  Set the variant's
1 x4 v; s. G$ G& Q* k//        type flag to indicate the fact that this variant holds a BSTR. Place the7 c+ V/ z! Y% \) Q& z( ?: p
//        BSTR into the variant structure.
1 X: x7 E0 h/ F4 x0 i6 b
; o4 @* {+ D4 K; i; I& G        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);4 a2 r( B+ H" U. T
       
' R7 ?2 d& B6 Z) S         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
' g3 |9 \! R. F        VariantInit(&requestVariant[0]);
' |- X1 i. N& t! S        requestVariant[0].vt                 = VT_BSTR;
7 F, @' d, M0 n# a. R  i2 T        requestVariant[0].bstrVal         = itemStr;3 @# b4 O' `2 F( v/ Y6 I
! b- u) d6 y! ]' u6 N  k1 ^! [
          topicStr                                         = SysAllocString((WCHAR *) L"system");
$ O/ O1 D% v4 m" m        VariantInit(&requestVariant[1]); 3 g& i/ x$ @' T2 l
        requestVariant[1].vt                 = VT_BSTR;
# l! N8 h- O( s7 u        requestVariant[1].bstrVal         = topicStr;
- ]6 T$ O1 o9 T, ]( r* l
6 D$ C, W5 b+ G1 z, m; D- P//        Set the DISPPARAMS structure that holds the variant.
/ i3 Z& |6 s( u) W, }8 |) n4 e2 O- x1 w  u# l' x4 O$ k
        dp2.rgvarg                                         = requestVariant;* X3 S# h* z6 Y/ {2 ?2 ^) s
        dp2.cArgs                                         = 2;  E2 V2 x1 E! }) O0 s1 q: y
        dp2.rgdispidNamedArgs                 = NULL;' A) D* |6 F, W: Y& I
        dp2.cNamedArgs                                 = 0;. }# M4 E: a9 T/ ?4 G" I
! p3 z. \* e( N) }9 c
        var.vt = VT_EMPTY;
5 A) H8 F) x' h9 @; F) R/ j1 n: `- ]! G
//        Call IDispatch::Invoke()6 [) {  D+ `8 d4 s; n

! y4 @0 W. g. ^+ z# _! i; F9 U9 M        hr = m_pDisp->Invoke(
- J* ?# \  p: c" g' W% x                requestID,! d- I8 [9 \( h& _8 g' i
                IID_NULL,& y2 k1 g( L: q
                LOCALE_SYSTEM_DEFAULT,
# d# M0 Q: |9 e) f, }                DISPATCH_METHOD,: |+ N1 V6 j! h0 ^9 p# V
                &dp2,
  G$ M, l" p$ l                &var,0 r& \4 t2 n* Z# H/ O) _$ ]
                &ei,
' z& @7 g1 B7 H6 _5 a" W/ }; c0 I6 I                &uiErr);
4 s+ g) E0 l) u8 ]+ O* j* |
8 O* X( X  @  v        SysFreeString(topicStr);
' ]" G; _# x6 Y, I) P, U9 N$ Y        SysFreeString(itemStr);
' D! L, L$ j2 i5 o, s  K4 H6 P请问该程序是获得extend里面的哪个值?, Q8 J) o0 }* A
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-28 04:37 , Processed in 0.013711 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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