设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8202|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:  N7 g  C  }' k% D, d
Name = (WCHAR *) L"Poke";
( a# A: q" ~$ k# ^1 t                 , H- p: l2 V# @* R
        hr = m_pDisp->GetIDsOfNames (
* p; b$ K* i# ]# f$ j                IID_NULL,                                // reserved5 i: z, S8 A5 \) H6 B; J
                &Name,                                        // Array of names to get IDs for5 T5 ?. A( W6 i( N" |3 c
                1,                                        // # of names in the array  y7 O" _5 X& {, u' b+ z
                LOCALE_SYSTEM_DEFAULT,        // System locale
- ?% J+ E9 {/ B: x                &pokeID);                                // Array of IDs to fill on output/ D1 B5 U7 Y) I; _) H& B$ h' U
                       
! k, }( f+ j$ e' ~9 x        if (hr)( n! f1 l" }3 C6 L$ E
                {
$ i/ k: Y  q2 v+ \' t                MessageBox ("Get Poke Unsuccessful");
: s% t& h" [8 e1 t2 C0 p* D                return;
, `( H8 P' V6 J  `" F% Z* D                }
$ s! [# @/ _2 p/ `+ S, Z
6 ?/ \( l! p  R3 y" C/**************************传递数据给extend**************************************/
. e  ?$ `" f( [  G% I0 A& ]        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);2 U' N( D" _: X6 G' d
        1 r9 J* E( t" l( F( H$ s
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
* t9 X9 ~% h# `/ k) {/ {        VariantInit(&pokeVariant[0]);
  ]* V, q0 M, x: {) w        pokeVariant[0].vt                 = VT_BSTR;
* M+ \& \, q7 e& \, S        pokeVariant[0].bstrVal         = valueStr;$ s3 X9 }7 Y; |. m. E% n6 G3 y6 ^

8 W* @4 Z" F: i' _8 Q         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");! a* d6 U0 D2 d) h
        VariantInit(&pokeVariant[1]); 3 u5 k, {+ ^" x' r3 o/ Y
        pokeVariant[1].vt                 = VT_BSTR;
! C6 ?  D7 ^, s4 O8 P        pokeVariant[1].bstrVal         = itemStr;
: o* n6 ~! Q3 R" j
2 e6 m8 a0 _2 t# S* `' j' O: X          topicStr                                 = SysAllocString((WCHAR *) L"system");
2 z: D& Y: H* m. J3 t) q        VariantInit(&pokeVariant[2]);
9 O+ B4 H) O3 H) U, `) N0 l        pokeVariant[2].vt                 = VT_BSTR;% {8 N! ?, b( ^& H# b) K7 z
        pokeVariant[2].bstrVal         = topicStr;
: {( {6 Y4 u  s  \8 w1 H
: z8 {% O# {" P' Z1 H* l//        Set the DISPPARAMS structure that holds the variant.
# E0 [! S3 N+ n! ~! l! p( L7 H& h9 {. G' R" p8 O/ _# {4 q& o! p5 _# i4 H
        dp.rgvarg                                         = pokeVariant;' t; \8 E1 G0 A. q- `7 @
        dp.cArgs                                         = 3;( w( X! C: z; m2 ]" B
        dp.rgdispidNamedArgs                 = NULL;
9 ^# _; T: U1 [: S. C        dp.cNamedArgs                                 = 0;5 q6 l  u9 J) x# R9 T

4 Q* u- d7 ^' @( D7 {//        Call IDispatch::Invoke()* P2 l4 ~8 n0 m

5 n2 q1 i" T; p# |( C        hr = m_pDisp->Invoke(% L) f' D8 R# I
                pokeID,
6 K1 }+ M7 B" H# |) d                IID_NULL,& ]7 z3 M* `* E/ m
                LOCALE_SYSTEM_DEFAULT,+ \) l. [1 D; P+ b
                DISPATCH_METHOD,' U0 R: l4 k: Y- X$ ]
                &dp,6 k& n3 u' ^5 F3 o; u% r
                NULL," V# O! h/ G- \; ^' O
                &ei,
3 |' G% [3 h5 x2 ?  z) W) L                &uiErr);
0 ?  I( E! ~7 _5 y
, W8 D- ?9 ]" q& }$ d        SysFreeString(topicStr);
4 B* P% }) c+ w        SysFreeString(itemStr);
1 i4 N8 W" N9 U5 Y! v7 \        SysFreeString(valueStr);
8 t# W* @  a- \% W6 H% b7 B3 d0 l. \' Z7 O  z2 g$ i! m' M, s4 T
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???! J3 O8 L! `7 F( k+ U9 E/ W; B" U
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????' _% ], }. V$ g8 x
2 R% y; u( ]- ]# o" [+ M1 |
& r, j8 k  X, Z9 M5 B
2.这是request的程序7 c. w1 J; A! m3 w4 s" x
//  Request a value from Extend
1 i3 N4 I0 `  G! n5 j0 k4 a//
" E* s# L2 V- w  Y//        Initialize the variant that will hold the BSTR.  Set the variant's
0 Y& D8 g$ y5 G2 y//        type flag to indicate the fact that this variant holds a BSTR. Place the0 a+ p$ t! a6 ^  R7 k
//        BSTR into the variant structure.
1 r2 f! E& z$ a: W6 ^/ H8 {
! h5 J4 W( O4 @  [        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
) W# L1 K, h% ?        ) u+ s  D5 g6 O3 K$ m
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
( K/ Q+ N( a; P' ?( X        VariantInit(&requestVariant[0]);
& b$ }6 i7 m5 {8 b  h        requestVariant[0].vt                 = VT_BSTR;
& U/ N: j8 Z7 {' R0 a& M4 y        requestVariant[0].bstrVal         = itemStr;
- X% J, Q  f5 Q* F  D, X& d% u
4 Y! q, G( Q) Y, a  U$ n) N% X          topicStr                                         = SysAllocString((WCHAR *) L"system");
3 |. e" b3 [8 W8 U$ j        VariantInit(&requestVariant[1]);
$ Q( f3 f) G2 R& p0 {8 n# A        requestVariant[1].vt                 = VT_BSTR;
* L2 O4 o) p3 l! F) U" ~! Q+ Q# z: x3 W3 Z        requestVariant[1].bstrVal         = topicStr;7 \5 q) q' [. Y- A  z( A

; I5 [1 o7 a  b  g//        Set the DISPPARAMS structure that holds the variant.
# a( _  j* O: A" G) K% x( d5 S/ b. d
        dp2.rgvarg                                         = requestVariant;  m8 q; S$ j. c
        dp2.cArgs                                         = 2;
7 v" D$ V1 q7 V/ l) J9 G  j        dp2.rgdispidNamedArgs                 = NULL;
8 I4 G' J! y* S* [7 ~% f0 b/ w8 p+ z        dp2.cNamedArgs                                 = 0;
! y% K3 i1 M! U! j6 x3 P
9 V) L! ?, J( k8 c" R, x# L         var.vt = VT_EMPTY;5 a1 G+ f( ~" c' j4 c* x% Z
& k+ F( _; S7 ^7 S" J
//        Call IDispatch::Invoke()$ }0 r$ [2 j0 u) p

: z6 v2 t( E; s. M: R        hr = m_pDisp->Invoke(
; s7 V. M( w0 k; m/ G                requestID,) G+ o, e+ P+ l' d; r& M- K/ x1 I( e: x) F
                IID_NULL,
5 E; G% v5 Q7 p- T8 n6 H' S                LOCALE_SYSTEM_DEFAULT,
1 p6 J* ~1 Q5 D4 o1 }  V                DISPATCH_METHOD,, h6 q5 s" \; e
                &dp2,
0 ^- m  i( q1 }6 @                &var,! h) [8 E  D: C* n
                &ei,' R( J1 f7 d2 f+ N) G
                &uiErr);" P. B( L9 G7 z& x& @, y

: M. d8 |. e# u! Q        SysFreeString(topicStr);0 p# x& B. Z5 _
        SysFreeString(itemStr);
; a9 \& V. N. Q# N" i/ R" \8 R. [' q请问该程序是获得extend里面的哪个值?
' a" S! R! \8 t7 K9 S/ B如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-19 06:24 , Processed in 0.018568 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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