设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10730|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:* e' u9 U6 V7 w# \' B$ _. e
Name = (WCHAR *) L"Poke";% E. T& a6 O* Y8 Q2 c$ c
                
& N7 ~8 T1 Z. Q; U# Z) r- K* R# c        hr = m_pDisp->GetIDsOfNames (
% d& n1 l. l0 c- j3 U                IID_NULL,                                // reserved
% X" \) E0 \0 `! X/ Q                &Name,                                        // Array of names to get IDs for
& R: k# n3 B% B2 x                1,                                        // # of names in the array7 V3 z( a! Q- i) o# h  k
                LOCALE_SYSTEM_DEFAULT,        // System locale
- d. p) o) e9 D$ K' y- h+ |, I                &pokeID);                                // Array of IDs to fill on output
1 p* `7 j9 ]' @# N3 ^8 w+ F7 U                       
- m& i4 u  h3 U# }5 s2 A  |3 \        if (hr)
, k! a1 I% Z9 E  y5 ]' Q                {
# h, I5 N" W5 {6 X- V0 Z                MessageBox ("Get Poke Unsuccessful");
/ Q1 r" i% K: S, Y; ~7 B" S                return;
5 q' ]$ S  [6 y3 K! n! j                }
1 z7 I& K5 a! J5 b# Y8 A9 ^3 f0 m5 `- ^, O" ^7 |
/**************************传递数据给extend**************************************/
/ ^' C! ?+ }( l0 h% w2 R        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
7 c% S0 \* X6 U1 C8 v* S' ?       
0 C4 Z# H5 y  X% V7 U         valueStr                                 = SysAllocString((WCHAR *) L"1232");
7 k5 h, }5 ]9 d* s, b" m7 o* I        VariantInit(&pokeVariant[0]);
, o8 b6 P* l5 I5 R& B        pokeVariant[0].vt                 = VT_BSTR;
6 H" X6 q: D4 X/ N* \5 j$ `* I        pokeVariant[0].bstrVal         = valueStr;" b0 ^9 t- K$ L5 S
" E. w0 E8 c( E( U! W6 G; F- [
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");4 r' F, F  _" e/ x
        VariantInit(&pokeVariant[1]); 0 d/ j$ b. v( V4 d, H$ E
        pokeVariant[1].vt                 = VT_BSTR;
# u3 _1 m# W) ?) C        pokeVariant[1].bstrVal         = itemStr;
% x6 Q/ C6 Y. A: u
; P" W( R' ^* ]' H* D9 i' }          topicStr                                 = SysAllocString((WCHAR *) L"system");% `9 X4 Y/ H8 }% d* w
        VariantInit(&pokeVariant[2]);
4 t$ m( I  j$ y: J1 ~        pokeVariant[2].vt                 = VT_BSTR;! z# R5 i  ~2 |$ Z
        pokeVariant[2].bstrVal         = topicStr;
+ H' Y3 f1 C2 Q, I% h7 i3 b. a! K3 H8 Z8 w$ [6 N: J; P
//        Set the DISPPARAMS structure that holds the variant.4 u/ m6 [3 F+ b+ _5 g' h* Z
. ^7 W+ K4 S/ P3 e' _7 f1 O
        dp.rgvarg                                         = pokeVariant;
$ \- Y. ]  x3 [% g6 F" ~        dp.cArgs                                         = 3;+ g3 v" ~- z. U) S  f0 x( \
        dp.rgdispidNamedArgs                 = NULL;6 k# B5 f3 b; p5 i& q
        dp.cNamedArgs                                 = 0;' h- ~9 S$ e" w7 X/ B
$ R/ \& p; c) A0 h, R% ?
//        Call IDispatch::Invoke()
( P; X* x( [( A0 c/ G) X+ s7 T
% M# H  C; u/ B* c& W' c+ y- V. J        hr = m_pDisp->Invoke(8 p) b6 V1 q' A# q8 ~
                pokeID,6 J! A* [4 N( l3 J' B
                IID_NULL,
# Q: X/ f) @0 j& @* o5 x                LOCALE_SYSTEM_DEFAULT,
! L1 F9 ~! E5 Y                DISPATCH_METHOD," \2 T; g  C2 A( g) q
                &dp,9 N' i/ i, D4 \3 Q8 W! _( a
                NULL,1 G' Z7 {. }  l5 W" T& ^
                &ei,* F- N$ W7 d1 N7 j* I: q
                &uiErr);
5 |) `- S& _1 u1 ]# [, y
9 M" Y( j- b9 [! r5 e* B        SysFreeString(topicStr);
+ A7 M! {2 J0 X) b6 g) B        SysFreeString(itemStr);
4 N1 y! \' k+ |/ ]& t$ W" F2 i: h        SysFreeString(valueStr);  r" x# D  @. r" `5 {
- x2 ?" w  p2 J# M
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
8 G* N* G3 b- m) l此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????7 h2 v# Z. b2 V8 j* M) G) E6 u
0 j2 ]5 P  @! J. ^* z- Q
, B# A; q0 s. z
2.这是request的程序2 r) {$ x7 A+ t' i, d4 G# J
//  Request a value from Extend
/ r# ^( l3 p; Z* A# h, P//5 S5 L" z9 v- w# V0 C* _* P+ m( q
//        Initialize the variant that will hold the BSTR.  Set the variant's
) H1 A: Y4 V- a) |1 G8 N- R% p% m//        type flag to indicate the fact that this variant holds a BSTR. Place the9 _# W9 }% ?: i, E+ i; u
//        BSTR into the variant structure.
0 w/ j2 J7 q' U7 E& M# I5 r4 x* G0 U# k: `7 I8 A% T+ @9 x8 n7 A
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);) s4 D5 |, i6 X
       
6 H3 g6 z5 X. V/ W5 b9 `         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
9 q3 }3 ]8 `2 T/ G: @* b        VariantInit(&requestVariant[0]);
' t* B' g3 o% R4 n% }2 P9 J        requestVariant[0].vt                 = VT_BSTR;$ C0 e& J/ b. ^* N; l
        requestVariant[0].bstrVal         = itemStr;
" n4 L( u* Y* y3 ]$ U- y$ z
  w8 t# m" _( y$ J$ i          topicStr                                         = SysAllocString((WCHAR *) L"system");
1 o* b" k( n" C        VariantInit(&requestVariant[1]); ' A% i+ i, l9 Z" u1 O  H
        requestVariant[1].vt                 = VT_BSTR;- m# o. T3 G3 N4 U4 B
        requestVariant[1].bstrVal         = topicStr;
# @! s9 r/ S- h9 c1 N! {1 W
$ T% X( e, `. u8 E) p/ P//        Set the DISPPARAMS structure that holds the variant.2 L; w  \5 S! ]7 E0 ]

9 J% r! y% x# Y: C+ E$ ^% f        dp2.rgvarg                                         = requestVariant;
; k" W9 p, x* Z( g# e        dp2.cArgs                                         = 2;
. m) k0 x" C3 A0 F" X        dp2.rgdispidNamedArgs                 = NULL;
* A6 n! `7 w5 I' d% W  m2 S        dp2.cNamedArgs                                 = 0;
$ g1 M2 J4 w9 j9 c' _6 |0 p1 r2 a- j' T* l3 j. m$ d* j
        var.vt = VT_EMPTY;& \( o2 l& @, R1 S; s
- J) M3 ~- }$ S
//        Call IDispatch::Invoke()
3 d$ S- m/ t* Z3 v" R6 X: ~$ j5 r& Z' e: J) \% {
        hr = m_pDisp->Invoke(* |; b" ^8 Z! W/ {7 Z3 h. }/ g3 J
                requestID,' z( d; ?. N6 I+ g1 D& G
                IID_NULL,
2 J* ?) b4 C* c# |! {. `                LOCALE_SYSTEM_DEFAULT,/ G% I" f3 H* a; U( ?6 p6 c
                DISPATCH_METHOD,
! n) {2 H  T1 ~                &dp2,
8 w/ B7 O  D' M4 X% u                &var,! ^% s! j0 s$ _4 E0 _9 K; {) j
                &ei,/ F9 R# n' G; ]6 q8 e* U
                &uiErr);9 y  g; S- a4 X1 |; d
; I) {& e4 I8 \) p1 p7 I
        SysFreeString(topicStr);
9 ^) ~" ~2 s" z& A. w' _1 w        SysFreeString(itemStr);. g; N& L) \( Z
请问该程序是获得extend里面的哪个值?
' g4 m8 N3 ]* G/ g如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-6-9 23:07 , Processed in 0.017212 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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