设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10580|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:; K+ m% Q  L( |; Z
Name = (WCHAR *) L"Poke";* l6 O) `" e& l* ?8 |% @
                 8 D" n! w( h" P/ l( h, E
        hr = m_pDisp->GetIDsOfNames ($ o$ n. v0 M' ^
                IID_NULL,                                // reserved8 F' ~  h. L6 `5 `$ O" i
                &Name,                                        // Array of names to get IDs for+ {2 n# e4 I% P6 b6 m7 {
                1,                                        // # of names in the array
1 M6 h* w2 D* A& C, \2 B                LOCALE_SYSTEM_DEFAULT,        // System locale
% J1 G. z& B4 h0 t4 U7 ?! |                &pokeID);                                // Array of IDs to fill on output8 o1 K8 A& d" [; f4 l. a
                        4 {; o9 H) c' t" c
        if (hr)( p" l6 a9 F' x4 h
                {
( X8 c3 v* _$ I: j                MessageBox ("Get Poke Unsuccessful");
6 `  [: d: v5 z4 V. H; R                return;
6 j8 Q) Y; f4 c3 \! z& e& Q                }9 [+ f" S. o+ s. w: c  ~
5 n+ w; z9 n: [- g' R* \, w
/**************************传递数据给extend**************************************/" C0 J' R0 u# [2 O, h* t- N7 i
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);$ Q" n/ @* R1 E4 e& I6 N# M4 |
        # U) O+ s( h/ r/ a6 o
        valueStr                                 = SysAllocString((WCHAR *) L"1232");3 a0 {. x' a' r6 ?
        VariantInit(&pokeVariant[0]);
& x( c) k8 m  }5 q; z4 E5 X: C; _        pokeVariant[0].vt                 = VT_BSTR;
% z7 S* R7 N; `        pokeVariant[0].bstrVal         = valueStr;
6 k" Y+ Y4 V% l' p9 ^. p# E; h2 g& c( z2 a9 p
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
, p7 w4 p) a  r9 r% L        VariantInit(&pokeVariant[1]); ; H# U" Q+ i5 K$ A. _
        pokeVariant[1].vt                 = VT_BSTR;* Q& V) ?& z! Z" y* X$ M' M  C
        pokeVariant[1].bstrVal         = itemStr;
# b; c# T# r% ~9 v: w8 f
0 j. M3 V& O  q) b) U          topicStr                                 = SysAllocString((WCHAR *) L"system");
: i: C1 V* Y  {+ n        VariantInit(&pokeVariant[2]); , }/ |& Z* r) ?& {
        pokeVariant[2].vt                 = VT_BSTR;; h6 [- \) @& o* h
        pokeVariant[2].bstrVal         = topicStr;
- a, L/ [. R0 D! d+ Q9 n! d7 x" t# Q; G2 M
//        Set the DISPPARAMS structure that holds the variant.
5 l& v4 q, a/ e
3 G, A, x: q1 K. |; M+ k3 g        dp.rgvarg                                         = pokeVariant;
3 Y* k4 b2 s$ X/ m2 @        dp.cArgs                                         = 3;0 q" ^; W0 ?7 ^$ n. a
        dp.rgdispidNamedArgs                 = NULL;+ l) ]3 K7 V3 P" _0 v4 \# ~- x
        dp.cNamedArgs                                 = 0;
! o' q1 }) R. B# o: U, c( E/ k
' f- Y# k* r6 x; q2 P2 j; D3 q# K" ]//        Call IDispatch::Invoke()' g4 E4 F; G( ~* U

9 `. T0 r* Z1 u3 y, {/ ]; Y- I        hr = m_pDisp->Invoke(
8 e1 y6 @/ M+ z" Y: C" W% a                pokeID,
0 f! p( [5 Q4 m. ]                IID_NULL,# d# l5 X# n5 @2 e( T9 u, z( l" P
                LOCALE_SYSTEM_DEFAULT,
( I4 y/ `7 G6 v, J( [                DISPATCH_METHOD,+ N9 a( S1 ?! l
                &dp,
8 F' P" x: \1 K                NULL,
/ k3 L7 T8 \" c- r4 J* r  ]                &ei,
3 X" _" A! s; L7 p6 W                &uiErr);* t# {7 D9 s" p1 s

5 M/ {6 y( n( o7 f        SysFreeString(topicStr);
. x8 _4 y) K6 c  ?8 }, H        SysFreeString(itemStr);- R$ r/ b" N+ ~3 m/ P# C
        SysFreeString(valueStr);+ E9 O: _9 @( t9 q% u/ Q
3 ]5 ?! A/ n/ q6 t- F6 \  ~
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
0 H' I, i  Q/ V此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????/ t8 R$ `9 w7 G, ]1 y" J( F

% B1 t+ c+ R9 V: `- {$ K
4 x7 I" J0 v9 x7 d7 L% B  u8 b2.这是request的程序: S7 _- s: e3 q
//  Request a value from Extend* }- N7 |  Q! b6 [/ e0 p
//
! Z, w: W7 `$ g5 R//        Initialize the variant that will hold the BSTR.  Set the variant's
$ J0 q; s! v  A2 @/ |! s//        type flag to indicate the fact that this variant holds a BSTR. Place the6 W! p, q; V/ i4 X
//        BSTR into the variant structure.9 o' Y6 ~- T" x. ?: }1 T$ x5 T/ O1 d

) n5 y% j2 p; {; ?# s: \/ X+ d: X        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);- Z4 G  e9 b, o- c, y0 t4 [  _
       
3 h8 h* S+ }- v; L& I; Q         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
& Z% M) C% J( L4 ^  [" }        VariantInit(&requestVariant[0]);
/ |, N" }4 h) ?. J2 v; U        requestVariant[0].vt                 = VT_BSTR;! G8 ~6 u. ]( T# J8 {# r1 q5 ^
        requestVariant[0].bstrVal         = itemStr;
  ^/ u5 D& t! `$ D( u1 Y0 n2 \  T; {+ z- g- Q( z) a7 E2 w* l7 V
          topicStr                                         = SysAllocString((WCHAR *) L"system");( D" G& Z  q0 @! I+ O1 ]5 P
        VariantInit(&requestVariant[1]);
4 \1 }0 T: H; C; f        requestVariant[1].vt                 = VT_BSTR;
& D; U8 r3 D+ t        requestVariant[1].bstrVal         = topicStr;+ K/ ^4 c0 j- ~5 b, |
( {! f+ }6 a% Q# Q
//        Set the DISPPARAMS structure that holds the variant.6 ]6 u6 T" Z* M/ R* n9 n! J
# h. _7 E) p& g& R
        dp2.rgvarg                                         = requestVariant;
4 ^- T: X: l' m        dp2.cArgs                                         = 2;
# e3 s+ ~, h* D$ M        dp2.rgdispidNamedArgs                 = NULL;
! f1 e% a4 s1 y8 p1 X! W7 X        dp2.cNamedArgs                                 = 0;
0 X& V1 J9 V( O
1 N! s! y0 m1 p- ~: _         var.vt = VT_EMPTY;; q5 V$ _( R9 W2 j1 c4 T2 I% z

5 t# Z0 L0 ^! O  }8 Y' L1 Y# e5 Q4 g//        Call IDispatch::Invoke(), R$ X# i1 j0 K# U# T1 |
! }/ M' p8 M8 ?  a/ o
        hr = m_pDisp->Invoke(
. V0 p% w: X3 U; y+ P2 U0 @, Q                requestID,
$ c3 k2 y% X2 B6 @" b" k& a                IID_NULL,
/ o$ E7 U" F8 B4 |" `                LOCALE_SYSTEM_DEFAULT,+ t# r, m7 z, @( Y. F# P; e7 n+ A
                DISPATCH_METHOD,+ a! |$ Y3 Y& N$ ?; u
                &dp2,
. N* P0 R5 j5 v! C/ {' O                &var,9 @' s/ ]* s. f7 `9 h
                &ei,
0 q* f* A: j8 v" M+ ]! ?                &uiErr);, h7 g4 w* K7 Y' s, ?
) r2 e3 m* Z! r: g$ E2 C) b, z
        SysFreeString(topicStr);
1 k# h. W& J/ J$ x, N        SysFreeString(itemStr);* w+ Z1 e( J. S
请问该程序是获得extend里面的哪个值?
+ `! b1 A; K- T如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-6-1 17:34 , Processed in 0.015929 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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