设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13095|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:& q! Y, n# Z9 e; y+ A* p
Name = (WCHAR *) L"Poke";7 A' W( u8 k, w
                
! d0 ~- H' v: T        hr = m_pDisp->GetIDsOfNames (( p; k" L! i. N, w. j1 m3 j
                IID_NULL,                                // reserved
3 J+ q8 R8 T$ N4 Q! @1 H7 u. a                &Name,                                        // Array of names to get IDs for
$ Q! X0 h* Q3 T5 t                1,                                        // # of names in the array
$ q. T/ Z9 a0 X: b, b; D1 G                LOCALE_SYSTEM_DEFAULT,        // System locale
. u- L/ F8 K# Q/ V6 p+ x                &pokeID);                                // Array of IDs to fill on output
5 d8 T" b5 ?" C- C' i4 v( K. V                        0 P) A9 N2 f, x8 A. ?7 N. Z
        if (hr)
0 p$ A% m2 K5 I' u                {
' ?0 D* v6 \' Y- b' O                MessageBox ("Get Poke Unsuccessful");
: d: Q6 j9 _( G5 i$ l% @                return;
0 [" Z7 A# J! Q* a                }
1 _4 G3 j' T6 B" t
5 h% W3 m& @5 n3 k7 h: q: a/**************************传递数据给extend**************************************/' R' l$ \. Z: Y: C' z$ L' h
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);- D+ {$ m' A2 p$ w2 J) U
        2 T9 L; a$ T$ u
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
, A+ F, @6 r$ C0 ^3 S0 {        VariantInit(&pokeVariant[0]);
! P( P: t# G- M        pokeVariant[0].vt                 = VT_BSTR;5 k; x( k) v; s7 s& b6 Y& v
        pokeVariant[0].bstrVal         = valueStr;
+ f! Z* p- Q: _
! l; R; [0 G" w$ N6 c         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
/ h0 j/ \, a+ C2 d/ s) F' @  K+ }        VariantInit(&pokeVariant[1]); % v" _; v5 ~6 o4 i" w( i" |
        pokeVariant[1].vt                 = VT_BSTR;
% V! @3 k2 X6 M4 t" L        pokeVariant[1].bstrVal         = itemStr;
% [: F. r, }1 s' y2 s9 S" Y( Q7 R" V  w
          topicStr                                 = SysAllocString((WCHAR *) L"system");1 w, @6 Q9 |5 H6 F8 O0 j
        VariantInit(&pokeVariant[2]);
2 s* A. I' P/ x/ {9 S: U        pokeVariant[2].vt                 = VT_BSTR;
1 h# d% p" W3 D* b0 K! Z9 |3 D        pokeVariant[2].bstrVal         = topicStr;
5 {6 r; U$ l& w4 u, g6 M( w- ]
/ M) ?/ _/ o; C- c  K* p0 C' F% i9 e//        Set the DISPPARAMS structure that holds the variant.
+ J% g+ I; y  @& k$ m; B0 j% P' d& ^- Q/ m' P# A
        dp.rgvarg                                         = pokeVariant;
: V) F1 c9 Z- \5 O2 s- N        dp.cArgs                                         = 3;. A: `; c4 _5 b: v8 q+ _& P  I
        dp.rgdispidNamedArgs                 = NULL;& B. y: n  [, h( P# C
        dp.cNamedArgs                                 = 0;3 G' O  ~& E1 R# Z9 h: i' J

& O# X7 `# S5 Q8 J# }) b5 w//        Call IDispatch::Invoke()
' a: F- t+ ^6 x/ O
3 F6 ~( `( G6 {1 v. g        hr = m_pDisp->Invoke(
' `4 w  |' X1 r2 u                pokeID,# j5 p( C4 V+ t0 ^
                IID_NULL,
, w5 B# J4 ]4 h: e                LOCALE_SYSTEM_DEFAULT,
+ w; A- a0 X) R6 m0 }6 \& I                DISPATCH_METHOD,
7 w: [8 |  F# |) F                &dp,$ s1 ^; A7 q% m, k
                NULL,! y% C' a6 K; W8 i/ g
                &ei,
) ^% Z. G1 Z) k1 F! j                &uiErr);
+ o- |/ l. r$ k4 j  p
/ I% J/ e6 n) M6 v2 C4 A; C        SysFreeString(topicStr);
$ f& S2 Q. }8 v" f* @        SysFreeString(itemStr);
# m4 j. n" g# T  s; I) F        SysFreeString(valueStr);
2 R+ R9 n1 c! ]5 x6 J- m1 z, ~) I$ E( h. v: t7 @: @  B" N
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???9 C  a* k' a6 D" I: P! X' W
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????: R) q! c- C9 X4 L9 N& W

1 j) b  [% o+ t5 i: r5 l3 c" g7 R( T- c5 H: b7 q3 d. p
2.这是request的程序
( |0 J, w; w. \+ @! \, U3 Z//  Request a value from Extend
% @' {5 i) E: p0 `* n//4 i/ x& _1 L! D
//        Initialize the variant that will hold the BSTR.  Set the variant's* R+ O9 o$ Q/ G3 T
//        type flag to indicate the fact that this variant holds a BSTR. Place the# |1 W9 a& c$ x4 s% F* A
//        BSTR into the variant structure.
) N  |0 G0 q4 l- W' Z9 p( w/ s1 Y1 ]5 i) I; J/ b7 ~: C3 ?
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);8 C7 z% Q: K/ S5 k- o- _/ l
        8 F$ F; W# u; C2 \: W5 Y+ `: b. ^
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
& u% C- {4 h  \& D& T* O8 R        VariantInit(&requestVariant[0]); $ k9 k7 v8 s5 [4 @( A
        requestVariant[0].vt                 = VT_BSTR;& B& l+ V5 g( ^" w
        requestVariant[0].bstrVal         = itemStr;, h' i; h1 N( J" N: \8 O

2 `4 w$ t* y5 K6 V          topicStr                                         = SysAllocString((WCHAR *) L"system");% u1 o# h6 B$ ]& x
        VariantInit(&requestVariant[1]);
* \* I* K7 o& x; u" ~        requestVariant[1].vt                 = VT_BSTR;
: P& F# v$ o5 L        requestVariant[1].bstrVal         = topicStr;) Z+ E* l8 q; i% [# ?
+ Q" p; A+ |6 P
//        Set the DISPPARAMS structure that holds the variant.
( ?  Q7 k/ \+ S# K/ ]! b
; f" `% u  l, R5 \9 x( ?        dp2.rgvarg                                         = requestVariant;. G4 W+ D# o/ r9 T
        dp2.cArgs                                         = 2;
5 T, U) E6 }- z. z        dp2.rgdispidNamedArgs                 = NULL;9 j& T' S6 Z8 g' C. |5 o
        dp2.cNamedArgs                                 = 0;/ E1 h8 ?" u4 X; j, |) w7 m

' u- Y# y( o- f2 n7 c+ h         var.vt = VT_EMPTY;
' ]; g, Q6 Y6 c1 y8 O
" }9 y  ^- K; A! `& C//        Call IDispatch::Invoke()
/ E  t) h5 [" R
) Y1 Q+ n% y8 \+ P  o  L, N        hr = m_pDisp->Invoke(
  o2 s! n0 N) N5 g3 L                requestID,
, Z; D( j7 u0 e  }8 L! I) {9 V                IID_NULL," o* b" F  @1 d3 c; ?  t
                LOCALE_SYSTEM_DEFAULT,
0 _! X) a( y/ I3 T# q( Z! D$ l( i                DISPATCH_METHOD,) ?9 l9 s: a( A1 H* K! m
                &dp2,
/ F' N# N/ Y, Q5 A# @9 G( q                &var,
( O7 M3 o- N5 ?/ ^                &ei,
- w& o% @) X& G: \                &uiErr);
% B9 a1 y$ f! j/ g( f. F& V
9 Y; Y0 y$ L4 B        SysFreeString(topicStr);
2 K; ?- y4 l$ N7 C' _7 C$ M        SysFreeString(itemStr);. {% r7 @- E% D" }( e7 ]
请问该程序是获得extend里面的哪个值?
) p/ E  e5 n  E如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-12 10:45 , Processed in 0.020651 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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