设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11888|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
0 d! S) ^) V. N  j6 x/ g7 QName = (WCHAR *) L"Poke";
9 S. w# R* ~# g8 P                 8 X3 ~3 d6 T% k
        hr = m_pDisp->GetIDsOfNames (
# g4 B6 ^  ]. j; @                IID_NULL,                                // reserved2 [5 b# ]# T. l0 Y0 E
                &Name,                                        // Array of names to get IDs for+ M/ i( z( M7 w- V
                1,                                        // # of names in the array6 \2 m  S& |8 n. j0 W! p; n4 J
                LOCALE_SYSTEM_DEFAULT,        // System locale
9 @' ~/ ?4 c5 u" j4 {                &pokeID);                                // Array of IDs to fill on output( T! l/ p- f6 T5 T  D9 }
                       
" i3 q- ?+ S' \! o$ d* G) D        if (hr)
3 S  v6 l. f+ ]* d1 Y                {6 Z! p( U3 ?) P! i/ ]% B+ P% G
                MessageBox ("Get Poke Unsuccessful");
; H1 m9 L, X: `& j                return;
6 S1 |# w- ^0 E" o) u0 G                }/ ]5 Y( U5 k5 \; g/ _% j# y

2 _8 n5 d% O$ o4 f! a! E/**************************传递数据给extend**************************************/
( N2 w/ M, N$ ]# M2 {, s3 {2 j/ @        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);$ Q, b1 J- Z( C0 f" K) |# c
       
" N+ ~4 B0 l+ n6 m1 H         valueStr                                 = SysAllocString((WCHAR *) L"1232");; O6 H4 e4 D1 i# e* z) i
        VariantInit(&pokeVariant[0]);
' T8 h- @! v9 s! N  }/ `( [) n5 c& @$ P        pokeVariant[0].vt                 = VT_BSTR;
2 y7 K, W! K0 c* ?        pokeVariant[0].bstrVal         = valueStr;
+ b& x: N6 L( m) Q; n. w( x
! ?- |- S. h* L. J  l2 o* h* G4 n         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");5 u" [( M- H, V" I
        VariantInit(&pokeVariant[1]); % A0 i3 m( x* ^, z# f" \
        pokeVariant[1].vt                 = VT_BSTR;# G2 h8 t0 K% Y7 `7 q
        pokeVariant[1].bstrVal         = itemStr;
& m, W3 D# w% X& `' V4 N+ M. g' Y5 I8 F( ^% o  R, A( x
          topicStr                                 = SysAllocString((WCHAR *) L"system");, C2 J, Q+ i4 j4 z! w7 o4 V
        VariantInit(&pokeVariant[2]);
4 I! V* W& P# o6 \, L6 S        pokeVariant[2].vt                 = VT_BSTR;# t/ o% y' y6 F7 E2 O0 j
        pokeVariant[2].bstrVal         = topicStr;
. W* Q9 ]* U. b
* B( [1 p+ ]; h' n5 q. K/ ?1 q//        Set the DISPPARAMS structure that holds the variant.1 p, |6 q+ x/ j3 l( O6 F. ^8 u

  @, l6 }9 f! r, [        dp.rgvarg                                         = pokeVariant;
& a7 w; R% _% R$ @' D        dp.cArgs                                         = 3;
; ]8 _: O- a; a- F" V) f* L0 ]! @        dp.rgdispidNamedArgs                 = NULL;# v! j8 Y. k$ Y* g) F7 H4 ~
        dp.cNamedArgs                                 = 0;6 E1 z& T- E2 X0 M4 a  \

9 ]- P, I; k0 t& y( b8 [! t  O//        Call IDispatch::Invoke()
5 ~) e. L9 g8 _# a
' v+ o5 a  B# Q, E  o7 M        hr = m_pDisp->Invoke(6 j- U! ]2 h  D+ a9 m% Z6 e
                pokeID,
) g; d# @$ p7 _9 z+ Z                IID_NULL,
, I- p2 A' P/ j" R1 I9 r/ x9 C                LOCALE_SYSTEM_DEFAULT,6 o3 m3 c8 Y- E. J% H0 x  R
                DISPATCH_METHOD,
" N: u/ z7 u6 i, d. R6 F/ O  P                &dp,
* \+ P3 W4 `  u1 Y1 N                NULL,
! t8 s5 D! d+ y" `: K- L* L                &ei,
  x" C- b' }3 }7 q- X                &uiErr);
) r/ a3 d) Y& l& G: c! z" i2 n; m# p+ Y! K
        SysFreeString(topicStr);
5 @: U* {) p$ s) |5 F4 K/ U: ]        SysFreeString(itemStr);
# [! h: y7 ]  U2 b* P/ I) U9 S        SysFreeString(valueStr);
8 h( u: P& a; B& E- ^0 m3 P% |/ @% E
; e; h# {# o3 O( h$ ?/ B* M' Z现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???; ~5 H& r' g9 G& R
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
+ G% z* _9 t  Z+ q: s  s. f, }6 P1 [) p

1 W) V* |) P! {% {/ O2.这是request的程序
$ K9 F% F9 S; o. g8 o" g//  Request a value from Extend
9 h0 ]  _( o1 k# A0 ~//
; Q4 O$ i# U% `- Z5 L' l//        Initialize the variant that will hold the BSTR.  Set the variant's$ g/ _/ Q7 j5 f
//        type flag to indicate the fact that this variant holds a BSTR. Place the3 l. s: y' m! @" ]- ?0 }' ^
//        BSTR into the variant structure.  b2 @8 C+ k" ^+ R

% p6 X" J& b" X  k% V        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);' P- h- k5 I0 w# J- @6 ^
       
% S8 H# F9 P  b4 J2 v         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");. }" e1 k- N7 i, \6 H: v
        VariantInit(&requestVariant[0]);
* i2 c0 k2 Y+ P2 s" F        requestVariant[0].vt                 = VT_BSTR;/ V/ H, G- @- i( O, s; g5 d# Z
        requestVariant[0].bstrVal         = itemStr;0 i  P  L7 o1 o+ H/ F7 \8 |

( C% Y: v3 ~1 I: r% `8 }! f          topicStr                                         = SysAllocString((WCHAR *) L"system");
3 S: H" S1 R9 F3 H        VariantInit(&requestVariant[1]); 0 h5 }7 }- s2 d0 E$ v) Y8 Y. d
        requestVariant[1].vt                 = VT_BSTR;
4 Q! ]) t4 Y% O: ^& ^        requestVariant[1].bstrVal         = topicStr;
9 z# _6 x" q# a9 A7 u. |# }" x% }# A# o% K  d& {3 t# K) h
//        Set the DISPPARAMS structure that holds the variant." S- A: h& H+ M. e
! C6 D4 D* J! B4 U( v& M% C* M9 A
        dp2.rgvarg                                         = requestVariant;7 C$ ^' p# C# |
        dp2.cArgs                                         = 2;) F1 o. f4 g% @* _
        dp2.rgdispidNamedArgs                 = NULL;
  \' t0 D& g% B) j2 g% `        dp2.cNamedArgs                                 = 0;
) Q% K6 X/ W( f+ E# o1 \4 E- N. L5 u
& s& v& m2 g5 F5 _2 }/ S         var.vt = VT_EMPTY;
2 U* x. J4 }2 L; P9 C2 ^0 o( N. k6 i0 O
//        Call IDispatch::Invoke()5 ]5 R" H4 ^- S

5 @+ X2 e, e; S( ?& U& I5 i# Z        hr = m_pDisp->Invoke(
  k4 i5 J# K4 |9 T$ x( Q                requestID,
: T5 O2 n8 v0 `( b9 S7 `7 i3 m- x                IID_NULL,
/ j& f& s. i7 X, X; ^! e                LOCALE_SYSTEM_DEFAULT,& f( I. Z! }# b& C
                DISPATCH_METHOD,
6 {* k. b1 K: j( X                &dp2,
+ I' N0 Y1 j; j! L- T0 @                &var,, E7 |* P3 c% L
                &ei,
* A; H% H0 B. R2 N                &uiErr);
1 U3 t+ a' s, S2 J4 ?. V# l! b
/ t, b4 g& f8 y        SysFreeString(topicStr);
/ M3 B( b8 p; M3 o& F- }) P) Z        SysFreeString(itemStr);
2 a" I( f: }8 N9 k! P; S2 m$ T% v6 L请问该程序是获得extend里面的哪个值?, E! J  h' b" d& l6 b
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-23 15:33 , Processed in 0.013725 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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