设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7636|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
' A6 f$ h" b( L! rName = (WCHAR *) L"Poke";
: v- \1 n8 ?* [& O- V2 O                 - H# z  d8 C7 {/ ?) ~& c  v
        hr = m_pDisp->GetIDsOfNames (0 G; ~8 c3 Q4 D
                IID_NULL,                                // reserved
  C" r  H, `: O2 V# R! I3 c                &Name,                                        // Array of names to get IDs for
/ Z* b) A7 T/ Y3 i4 g$ N                1,                                        // # of names in the array
( u; p. t2 m6 I; p; u0 r                LOCALE_SYSTEM_DEFAULT,        // System locale
2 @% G' G% R, \; D( Q  V. s                &pokeID);                                // Array of IDs to fill on output9 y6 n; \6 w. j" Y
                        & l7 \- d- z3 \, W
        if (hr)
, P8 l% X2 ]6 Q* v) o4 k                {! z( [6 [. c1 {# Y& ?4 R! m) \
                MessageBox ("Get Poke Unsuccessful");
( C  }' V9 B4 g% Y1 n                return;
  P: n" c. @  ]. Y                }6 h* q- ?7 s" j! ~4 `
1 p1 J1 V+ h9 o1 k& [) x; n0 D8 H
/**************************传递数据给extend**************************************/
; W, u# L% M2 b3 y        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);2 a" x2 c! n7 a3 k9 K& W; o' m# p+ a! j
        - S7 J$ o  i0 s' |6 z6 p5 x4 G
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
" ^7 q, z8 ^# w) P" F( y8 d        VariantInit(&pokeVariant[0]);
& s: z$ C( u8 k: J  o        pokeVariant[0].vt                 = VT_BSTR;7 E/ h$ W! L1 ^& C, {  \: S- l
        pokeVariant[0].bstrVal         = valueStr;1 ~1 i( {  d. m) X6 `8 D' E% v

& |% ]$ L& E" I0 q         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");" C2 U8 ?" \% z1 A4 m
        VariantInit(&pokeVariant[1]); . ^0 r# v- {6 w: G2 K
        pokeVariant[1].vt                 = VT_BSTR;
, x- K8 x6 t8 r) X- C1 f        pokeVariant[1].bstrVal         = itemStr;
6 m8 {& p0 E" A. C* C
6 R8 C/ x! S8 n. }# G* m          topicStr                                 = SysAllocString((WCHAR *) L"system");
$ ?. P7 y" @+ @* j( e' C        VariantInit(&pokeVariant[2]); ( S" g. ^2 P  e9 A' D$ P
        pokeVariant[2].vt                 = VT_BSTR;* U. H- T. i$ D6 T- o( S
        pokeVariant[2].bstrVal         = topicStr;
% W/ p; P. C3 E  J% z4 h$ H
. s4 y/ c; Q6 j9 [& T' u- E//        Set the DISPPARAMS structure that holds the variant.- l. C8 R: [( a4 Q
( E# w- n6 m: n8 ~) |
        dp.rgvarg                                         = pokeVariant;
) P" _# p& r( |# f        dp.cArgs                                         = 3;1 N8 b* A0 ]+ n4 `% C8 K9 M. C
        dp.rgdispidNamedArgs                 = NULL;
5 k7 @0 g6 j% m5 W- h        dp.cNamedArgs                                 = 0;
1 P, y, s/ H( k, C- |2 w/ E; G7 j5 z6 P# n4 g7 }9 Z; N
//        Call IDispatch::Invoke()! v& ^: {' W  Y% p4 a% a
' T8 T1 D; k; J. \
        hr = m_pDisp->Invoke(
& _) w$ b6 `5 ?+ c3 j0 E7 z                pokeID,
; A  Z: h, s. M# _6 V# ]) U& B" e) _                IID_NULL,
# {, a* w% g1 f6 i( p  g                LOCALE_SYSTEM_DEFAULT,
* |+ o7 m3 y5 }4 A                DISPATCH_METHOD,
& R. Z" m5 q" E: e' i1 g$ L                &dp,
: r6 J' q: y' ?                NULL,
+ B9 y# k- P4 U                &ei,% f3 B% S2 j+ y3 \+ D
                &uiErr);( w9 W0 D2 R+ w  ]" G
3 j# _7 E) h  y* I- E2 z
        SysFreeString(topicStr);
: D9 o9 R7 `* o6 R' \        SysFreeString(itemStr);
9 G# j8 s; T; F' |* @: l" \        SysFreeString(valueStr);
) ~# b9 e4 s* z( j1 _
% Z" \( i) X8 c现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
  w* H: z2 r/ @9 y$ U9 w* v此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????5 c* w: W% k0 y' Q. X8 J2 x8 x* Y

. K/ b4 d/ _" i1 V( I. L2 f4 f, S* O4 c% N' \# R
2.这是request的程序' l0 B* ?# o; j7 R- {
//  Request a value from Extend( t. o8 y, l( S2 K1 `
//
5 ^9 f, c; c/ g* Y, B% m//        Initialize the variant that will hold the BSTR.  Set the variant's2 e5 U# W3 M# `' g2 i, Q. {6 c% P' c9 w
//        type flag to indicate the fact that this variant holds a BSTR. Place the
0 o$ q. i/ k8 u, Y3 h6 h//        BSTR into the variant structure.
- y( }0 y1 J+ K, q' M, I. s+ Z  N# V. o/ k- M$ |1 T7 O
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);( {0 k- J/ {2 m/ _/ n4 D6 u# W; m
        + e* l5 P8 |; s) Y# T( L/ W" l
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
8 a! P! i" L9 M& e9 p, Z        VariantInit(&requestVariant[0]);
8 D& R/ ^1 p7 T- Y- p3 t        requestVariant[0].vt                 = VT_BSTR;9 z6 l/ `$ d/ x. b8 \7 x% w
        requestVariant[0].bstrVal         = itemStr;
# j- ?3 N7 o; g: A$ v
# M8 `7 s5 m7 [) A- L+ e% k) j          topicStr                                         = SysAllocString((WCHAR *) L"system");
+ x$ _7 s4 ]: A  _        VariantInit(&requestVariant[1]);
' ]( U5 ^: t6 W# M4 H2 d  U7 U2 f        requestVariant[1].vt                 = VT_BSTR;6 f$ [) B; }6 E0 ^2 ^
        requestVariant[1].bstrVal         = topicStr;/ h( L* \4 O- q( z

# x0 _2 g/ [: O1 w0 W//        Set the DISPPARAMS structure that holds the variant.
! L6 n& J8 K9 I
+ ]2 |; W; b' H* c        dp2.rgvarg                                         = requestVariant;" L$ ?2 O) A% I5 ~. y: q
        dp2.cArgs                                         = 2;8 R& y5 }3 s5 Y6 P
        dp2.rgdispidNamedArgs                 = NULL;
* C- ~8 T! E% I6 E; G' P# g        dp2.cNamedArgs                                 = 0;
* x$ [: p( t; B8 E. P* c- ^0 r
7 T* {4 g" x* a# a7 P% t         var.vt = VT_EMPTY;
% N* J# U- I2 b+ w0 F9 M1 R  b
  ^$ @& e/ X7 P& G//        Call IDispatch::Invoke()& s* V4 N+ ]9 T

0 W, a0 G  D* Z8 Y        hr = m_pDisp->Invoke(( F! Q! P2 l( p8 y
                requestID,* ^5 U3 s: C0 t! N; u! L9 C+ j' e
                IID_NULL,  Q: Q- O" m! ]/ O- Y9 w
                LOCALE_SYSTEM_DEFAULT,
& c; C% K+ n( d1 ?% X+ F) L  Y# ~$ Y                DISPATCH_METHOD,
. s& r& ?, r' v1 D                &dp2,5 D$ S2 J* q3 ^) a; v+ Y
                &var,
' M) l. P. I# ?$ V- S3 P7 R* y                &ei,
7 c4 \5 ?% R  l5 `                &uiErr);( a+ s3 k* [6 x& p5 I- _3 `
" p! X6 X0 P0 L; X: ~/ o
        SysFreeString(topicStr);" ?2 k. o9 e* o$ S5 b1 C. B1 x  J' R
        SysFreeString(itemStr);
* W- I% ]( G% {' F7 l5 a请问该程序是获得extend里面的哪个值?
# M' l2 s2 ?2 ]  S如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-27 21:34 , Processed in 0.014909 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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