设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12616|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:. n0 E% V( c" n8 R2 P
Name = (WCHAR *) L"Poke";
. c: }+ N" B$ i' F' N0 b                
! v3 u6 v( j3 A3 Q+ j* p9 r        hr = m_pDisp->GetIDsOfNames (
1 ?4 G, X* S" v. l3 M2 H/ U) n% B; z4 ?                IID_NULL,                                // reserved, X3 J$ z5 N1 r! i8 ~
                &Name,                                        // Array of names to get IDs for
. W5 P4 S! h6 x* x( b8 `3 c                1,                                        // # of names in the array! ]( `% U  z- i. v1 `5 W9 b9 o
                LOCALE_SYSTEM_DEFAULT,        // System locale! E7 |- _; |& P5 r7 P7 X
                &pokeID);                                // Array of IDs to fill on output
5 p2 z" F6 l& @' Y$ C. i                       
" ]: M+ y4 _1 [; q        if (hr)
8 |  h; ]& T. R% w9 Y+ N/ e' j                {  B' U$ K) W) L5 i4 b
                MessageBox ("Get Poke Unsuccessful");& `& @+ D6 r, `" T5 A
                return;7 R# |. _7 b: I+ E
                }" O; v/ n- f# q- ^; I7 s0 Y1 i0 d/ o
- U0 L: k) }. k9 B' t
/**************************传递数据给extend**************************************/
9 O4 M8 H- Q: o( @, ^        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
* X7 v: d2 D* B: Z        & z2 d' R% J0 S4 b' i% H0 e  x; j
        valueStr                                 = SysAllocString((WCHAR *) L"1232");- h. s, S, V' ]% w. |0 G" c: H
        VariantInit(&pokeVariant[0]);
8 o) Q3 b% ~" Q$ B. h7 }! r        pokeVariant[0].vt                 = VT_BSTR;3 {$ L. t$ H3 m$ ?
        pokeVariant[0].bstrVal         = valueStr;
* E" c  r$ N% I
3 |; W  b0 ?& B/ _2 j3 k         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
! t9 d  G% t$ I9 K& R% z' T        VariantInit(&pokeVariant[1]);
  |6 U1 ]& U! g+ y, P3 _0 ^( V        pokeVariant[1].vt                 = VT_BSTR;
$ R2 m6 k) |  g2 p        pokeVariant[1].bstrVal         = itemStr;
7 D. ], Q( z- g8 Z: G. s/ D7 Y* T: s* J" c/ r6 t! Z! Q4 N
          topicStr                                 = SysAllocString((WCHAR *) L"system");6 C3 T/ H  W3 a. ?; S6 T9 v
        VariantInit(&pokeVariant[2]);
$ c6 s6 q, B0 Z4 X) t        pokeVariant[2].vt                 = VT_BSTR;  F- e- G3 z" ?& E3 t) i1 h9 s" {
        pokeVariant[2].bstrVal         = topicStr;
1 e/ D1 N4 c1 a$ _6 d8 h! K! H; E! B  ?
//        Set the DISPPARAMS structure that holds the variant.
( e+ d5 ?- f6 J  x$ `6 P! Q8 {1 H* u6 |" w
        dp.rgvarg                                         = pokeVariant;
, u  a3 A( s( b7 P        dp.cArgs                                         = 3;+ ?* h3 p4 n1 m8 ?  M' n
        dp.rgdispidNamedArgs                 = NULL;
* O2 k& p7 W, Y7 o        dp.cNamedArgs                                 = 0;9 V/ J0 E7 r! F6 L! Z% N3 _
) u' v9 L3 L7 ]3 v) ^# b
//        Call IDispatch::Invoke(), v/ p+ }* J7 O2 S3 q; M
& H1 n; W% G  A, o2 n
        hr = m_pDisp->Invoke(
& b3 I  `: G1 o) J% s, o5 r                pokeID,# K* l# \5 c& ]. P" h9 j
                IID_NULL,
4 F8 H' D, h2 h/ ?6 d                LOCALE_SYSTEM_DEFAULT,
+ I! }/ k; N  c/ f" l! |( J                DISPATCH_METHOD,
, E; ]9 B" _9 q' f# N                &dp,% S/ A# d2 F9 v/ T
                NULL,# n0 y+ s  S; e
                &ei,
" v) L7 }# n: P& F                &uiErr);0 O+ E# Y+ H) n& \
$ X* O* W4 ^5 [+ o0 q9 n
        SysFreeString(topicStr);
% Z* C& ~2 {: L8 l' ]. E7 J        SysFreeString(itemStr);
: T+ ?- ]- q( F/ a, G: q& u" K; E) q        SysFreeString(valueStr);
3 z+ s( d+ o1 \- J
+ u! X) p; r" ?现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
1 P8 A& u& b; m& |此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????5 @8 Y9 `! O# ^
" i$ @) X( Y+ n' j# Z$ X
! |8 Z" X( ]( S3 ?% ^- V5 @- ~1 ]
2.这是request的程序, r# R+ v- ^8 h* u9 W
//  Request a value from Extend  g# h" b7 k, a$ ^+ z9 E6 w! J
//: i9 g# S! C1 i8 A" [
//        Initialize the variant that will hold the BSTR.  Set the variant's
" V! L" {7 ^3 K7 _//        type flag to indicate the fact that this variant holds a BSTR. Place the
+ @* [7 {1 a9 E1 Y6 g2 q! [- b$ \/ [//        BSTR into the variant structure.
  c* u6 n. e" B1 |* w! u/ ]% l) O' ~8 P. T& N
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
/ h3 v$ w8 {. T$ `0 Q4 ~- v        7 v! d$ |8 u" _# g$ A
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
3 b2 a2 Z3 o# t; T3 y        VariantInit(&requestVariant[0]); + m( P/ \0 {; }
        requestVariant[0].vt                 = VT_BSTR;. o7 K4 H( B3 A
        requestVariant[0].bstrVal         = itemStr;
9 y1 D1 ]- b" j; @
, `) G* g0 j5 n1 N# C$ ]% Y          topicStr                                         = SysAllocString((WCHAR *) L"system");
5 ~" i' x- ?2 n        VariantInit(&requestVariant[1]); " f' h  N1 W( i. v& a* G
        requestVariant[1].vt                 = VT_BSTR;
9 C! e9 R& q, X/ Y        requestVariant[1].bstrVal         = topicStr;5 e9 K9 c" ?4 U

; j) ^% o$ }& g9 @2 v" c3 i7 p" I% [//        Set the DISPPARAMS structure that holds the variant.
, i1 ^$ U# Q2 [5 s( j, G! i9 ~3 [) o3 L8 }; i# N6 A! x
        dp2.rgvarg                                         = requestVariant;
; i; Q2 @# e* X$ H6 r% y        dp2.cArgs                                         = 2;
, x5 R' K0 R3 W2 O8 ^5 i* {- W        dp2.rgdispidNamedArgs                 = NULL;
5 i9 @, d$ a& G. v; R2 P; I        dp2.cNamedArgs                                 = 0;2 S: f1 j9 [# M2 T$ y% {, P

( ]2 ^6 V2 m: S1 D0 M         var.vt = VT_EMPTY;
- b; u; H( `. i: h, L! o5 u: Q; s3 x4 E
//        Call IDispatch::Invoke()
" U+ _4 j. M; M1 J7 u* }' ]& u( k* c) A7 o' C9 a4 T) C3 d
        hr = m_pDisp->Invoke(- r9 U4 c1 W7 n/ a, ]9 O, l
                requestID,
5 l) N9 ]: @& B. r; s* x! O$ l7 q                IID_NULL,1 c/ E$ C6 \' K8 T, m+ J; B
                LOCALE_SYSTEM_DEFAULT,
8 b. X7 Q) n% ]                DISPATCH_METHOD,8 w& C- a; @% y/ _+ I  D
                &dp2,5 |- H( S# ^6 s! O
                &var,
* g! v2 ~3 ]' `2 ^  v% ^                &ei,# J' ~5 U% z* ?/ [& z- ~% p0 q
                &uiErr);. l8 r  k' y7 E. F

" B# p, u) B# r7 h        SysFreeString(topicStr);5 X. N% H3 H* c; E3 U
        SysFreeString(itemStr);" H( f/ F: y) \( j8 Q
请问该程序是获得extend里面的哪个值?  X8 b5 C" O. G1 L4 f
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-21 11:42 , Processed in 4.108108 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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