设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11156|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:. L2 ^; ]6 ]! D' u7 K8 g8 A9 I1 ]1 t
Name = (WCHAR *) L"Poke";) t4 C. }2 k9 w3 r
                 - x$ V+ i) ?) f: k! D; P
        hr = m_pDisp->GetIDsOfNames (4 Z- R" }9 w/ T4 P+ `4 Q
                IID_NULL,                                // reserved
& G1 Y% r1 h1 B" @! I                &Name,                                        // Array of names to get IDs for
6 y2 {! L! W' r$ `* F7 Q                1,                                        // # of names in the array
( W$ e5 j+ ?- j* J! Y                LOCALE_SYSTEM_DEFAULT,        // System locale* o; h- j( [4 e
                &pokeID);                                // Array of IDs to fill on output
# [9 n1 O/ P3 i3 z! V                       
" T/ ~/ e' O' d9 a3 e        if (hr)4 k; R1 D, t; q4 P. A. @' t
                {
  y5 j! B* x! \( r: o% a4 ]                MessageBox ("Get Poke Unsuccessful");
$ j; a* t6 E" p4 k                return;5 O/ W8 }" ?2 `$ {! _/ T/ @
                }
; F9 M" {, s+ V# U) v) ?, w* e8 s" T# `$ _. q
/**************************传递数据给extend**************************************/
5 ~: }* ?$ F0 Y( v5 E        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
; J; i% a( o# n- d       
- [! A* l3 B4 O4 j1 e         valueStr                                 = SysAllocString((WCHAR *) L"1232");
# Q8 z( W. b. W" e+ ?' P* d5 j        VariantInit(&pokeVariant[0]); 5 m: |$ ~% ?7 K+ T4 F6 a. L
        pokeVariant[0].vt                 = VT_BSTR;
9 ^6 u9 O- j& ^3 j8 H        pokeVariant[0].bstrVal         = valueStr;
8 X2 c8 W; u6 W  n- C1 t+ T  \: f( k' u
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");" e% V! l: z5 _6 `1 V! Y
        VariantInit(&pokeVariant[1]);
7 e, m. E2 Q" v8 ], A4 |1 Y        pokeVariant[1].vt                 = VT_BSTR;6 s! Z! O+ [  U. x5 q3 U! I* U; U. Y3 ^
        pokeVariant[1].bstrVal         = itemStr;+ s. K+ [" Y9 D1 ?, L

6 J" F( V4 _3 J          topicStr                                 = SysAllocString((WCHAR *) L"system");2 E, I9 R4 _. C$ I. \; H* C
        VariantInit(&pokeVariant[2]); # j; j/ \5 _6 s% z5 m5 W
        pokeVariant[2].vt                 = VT_BSTR;
& V% z- \3 p: M, c% ^+ Z$ Q$ q" h4 B        pokeVariant[2].bstrVal         = topicStr;
# B& g, x* p4 J; |1 m7 U3 l
3 v  c, \, ?  {* @( ^1 h  {//        Set the DISPPARAMS structure that holds the variant.
* @; f  z5 r0 w. `" x% Q& _( p, D9 E
        dp.rgvarg                                         = pokeVariant;
. R' n$ C0 s& a1 i        dp.cArgs                                         = 3;& t5 u; Y2 l: E0 X9 `( k
        dp.rgdispidNamedArgs                 = NULL;, u- [/ k2 s! k% y4 M* p7 _# g# F. q
        dp.cNamedArgs                                 = 0;" x. I7 W+ t* T# A! L" G- U
3 I0 i$ q$ C( W; W. E3 C
//        Call IDispatch::Invoke()6 K  k% U, T8 {' g- ?; Y6 O/ E

) e4 N- ~0 q( k! t" V        hr = m_pDisp->Invoke(
0 b; j' d/ ?3 a3 m' N9 m                pokeID,% \" K2 ?' X% _$ {: H- r
                IID_NULL,
$ A+ N' w4 w+ [) `                LOCALE_SYSTEM_DEFAULT,
& Q7 O( T8 A5 ]; I; b4 ~                DISPATCH_METHOD,$ P/ p4 K# w6 s  V( H: K: o/ d% I
                &dp,9 ]3 x' g0 H; s; {# M2 W
                NULL,
6 Y* ?/ P& l6 C3 |- v4 e                &ei,
6 b4 f2 _3 e$ k+ S2 Q                &uiErr);7 f2 E+ I  t" H- y, U% N; G/ G
8 e5 u/ A0 z0 F! I8 Q- a
        SysFreeString(topicStr);# w; _. F  a$ r% Z3 r, f
        SysFreeString(itemStr);- r8 l7 B4 C$ O2 {# W
        SysFreeString(valueStr);
7 W6 `7 K1 r2 J9 J) F3 f! W- t. v
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???9 Z7 `% H- n. i
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
, C# L  E0 j) F# U, m! g3 A4 U, y0 t: K+ d+ k1 i& `' o7 n( ~2 k

5 T1 A8 u5 v8 N+ h7 e2.这是request的程序
- ?/ C( w2 M* d$ G0 J+ G* Z//  Request a value from Extend
( I1 d/ p. }7 P# i//5 m% U  R. C# g
//        Initialize the variant that will hold the BSTR.  Set the variant's; D. ]+ Z7 [7 l: t: z
//        type flag to indicate the fact that this variant holds a BSTR. Place the
* U, x- h; ?& L4 T/ a6 R+ f//        BSTR into the variant structure.0 F. z6 k1 Y. d" r2 D, h0 C
( a, Q; h5 S' g/ H
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
0 b( Q9 H1 E; d5 H# H6 F        ! z$ `7 x! {! I8 I
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
# J2 S. Q" P' K9 G1 z/ U        VariantInit(&requestVariant[0]); + o# Z( V9 n3 `2 U; k  j% a! |+ ~4 b. z
        requestVariant[0].vt                 = VT_BSTR;5 d) a2 j' m, Z' @* N* E" [( z
        requestVariant[0].bstrVal         = itemStr;! |3 ^9 w, Z. D- T/ B6 ~# m* ]' E

2 C1 }( L# |- m          topicStr                                         = SysAllocString((WCHAR *) L"system");
  s3 J$ [; r  b+ Q* _$ H+ l        VariantInit(&requestVariant[1]);
1 S. A& m  D. ?5 Z5 ^        requestVariant[1].vt                 = VT_BSTR;
( U* O; F8 U7 q" w        requestVariant[1].bstrVal         = topicStr;, A' y7 h$ T8 Q- E: k9 w

  h, h$ ]2 c! k8 T, t7 Q//        Set the DISPPARAMS structure that holds the variant.4 ^1 r/ ]6 O* c1 z1 p

( I9 f$ C$ [3 Z        dp2.rgvarg                                         = requestVariant;
7 p1 S" b3 n* I- R        dp2.cArgs                                         = 2;3 U1 p/ E, ?. X2 p7 L. l! l
        dp2.rgdispidNamedArgs                 = NULL;$ E0 O- S2 N- I% l
        dp2.cNamedArgs                                 = 0;. v7 V( s2 d1 W9 {) ]$ S$ s1 X
- b  \7 h% f: g: C
        var.vt = VT_EMPTY;
9 s0 T: E  D$ s  ~1 q. `# I
* c1 _% ~7 R  `3 F# _//        Call IDispatch::Invoke()5 n; \* b' S# o6 c8 E- W; x% ?* F

+ F' I! _/ m: Y/ E        hr = m_pDisp->Invoke(
+ e) U8 w, Z8 c4 P                requestID,
  n# ~4 ~2 J3 A4 e                IID_NULL,
0 f  z: s# A; ?! `                LOCALE_SYSTEM_DEFAULT,; I5 J  W. m( `: I9 I# ]! P$ L
                DISPATCH_METHOD,, {; x' K; C3 |
                &dp2,! N1 E+ s% E- U7 n2 @
                &var,
( a# _: j* ~% |$ a* t+ M                &ei,
* ^3 \3 X! |/ C; S/ t! ]* M                &uiErr);
/ X& |- [  O, {' w9 x
& O, r4 {5 F! z' K! `- h( r0 d        SysFreeString(topicStr);
: D$ T9 I7 \$ O& ?& S        SysFreeString(itemStr);
5 A4 [1 x* d0 u" h8 `; ^! b% R请问该程序是获得extend里面的哪个值?# B; c. F- d1 t7 }- I, y/ ^
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-6-29 02:48 , Processed in 0.014491 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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