设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9982|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:0 b- f1 |, Z( u% [/ R$ X. [
Name = (WCHAR *) L"Poke";
" F& J) j' F  s  O* N7 L6 d                
( z& A0 Z3 f! d6 \+ Q8 |        hr = m_pDisp->GetIDsOfNames (7 y% [* M+ k0 D4 R: N" Y
                IID_NULL,                                // reserved
# a/ P1 |% }9 B7 v% @( j                &Name,                                        // Array of names to get IDs for
: U- @8 E- t% F% i* P3 Z; s                1,                                        // # of names in the array
1 z& L' U" h0 ?/ `1 d$ M                LOCALE_SYSTEM_DEFAULT,        // System locale
1 G# T; G, q# s# _                &pokeID);                                // Array of IDs to fill on output
! ]( e) e& \- g; z+ t- p                        : O" r& D1 a% E, [8 \" `6 r
        if (hr)
- n% V) o7 F6 l                {
2 I4 a% s2 n, O/ p! f" \+ r                MessageBox ("Get Poke Unsuccessful");( D' `- X9 _+ H/ s
                return;
% b* w- g6 f' H1 r0 _0 k% [$ ]                }& a6 Y$ E3 [6 J- t5 l  u! d

0 a" K7 M: P/ B0 D+ `- q# n% q* ]2 R8 J/**************************传递数据给extend**************************************/+ I% V7 d5 d. d$ e( I* m
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);  H1 J- C7 I0 s" L5 w* _3 D1 U
       
2 a1 z  L( j1 y         valueStr                                 = SysAllocString((WCHAR *) L"1232");! h# u1 t+ \& B; \+ c( q
        VariantInit(&pokeVariant[0]);
9 O2 w& t; r/ H. o" N+ w6 f% h: `        pokeVariant[0].vt                 = VT_BSTR;7 z0 c* F  y! V; c1 @1 _, P) _9 C" _
        pokeVariant[0].bstrVal         = valueStr;& ~( K6 g, E% o1 p. l( }' e, W

  {) ~/ ~' U9 L         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");* @9 J. n9 Q) X' Q
        VariantInit(&pokeVariant[1]);
( W2 O5 p# R1 I, ~4 |        pokeVariant[1].vt                 = VT_BSTR;
. E7 J  }+ j7 ^0 P        pokeVariant[1].bstrVal         = itemStr;; `. r6 @6 p" ?2 b% d9 D. [& F4 C

9 b( n' f* r  x# g$ \- u! d# T. T          topicStr                                 = SysAllocString((WCHAR *) L"system");
2 f8 T* K- {% @" s6 t6 S  y        VariantInit(&pokeVariant[2]); ) \6 i* X+ W2 [0 F
        pokeVariant[2].vt                 = VT_BSTR;4 c3 n1 H5 D- }8 u. h
        pokeVariant[2].bstrVal         = topicStr;
! @, H9 z/ i; s: a7 H4 ^' l$ K3 y# O9 L2 e3 v, l  e
//        Set the DISPPARAMS structure that holds the variant.& y% i( O4 [$ r1 p) z9 [6 M

6 q4 g2 r8 C8 y  `        dp.rgvarg                                         = pokeVariant;
" o) u' k7 }! o$ U' x        dp.cArgs                                         = 3;' x& b/ \. ~# N6 c9 q$ ?2 R( L
        dp.rgdispidNamedArgs                 = NULL;
1 _5 |  ?& v8 w        dp.cNamedArgs                                 = 0;! v7 F& E; `$ `; R
6 C2 F& C% [: ~* P& K
//        Call IDispatch::Invoke()) G2 K- ?# |4 U. h+ |. A2 i# t

' @( `- i& l6 y4 I, F        hr = m_pDisp->Invoke(
3 Z9 C5 \7 a/ h; P                pokeID,
+ p- t9 d9 @; @! O8 Q/ Q' T                IID_NULL,
0 U. ]) i1 c" L- A) m                LOCALE_SYSTEM_DEFAULT,7 f) C. E5 h9 k. R* Q* D3 K2 G6 m4 O
                DISPATCH_METHOD,
2 r, i$ V0 [: e, s+ _                &dp,
6 g* l' @: {7 l' F6 A                NULL,
( V- ?' j# o$ d. P8 h0 F                &ei,- K# }; i' m- `- F0 |8 w% ~
                &uiErr);
/ c3 h' N/ ~5 J1 s$ l
0 }' r% G/ A1 X        SysFreeString(topicStr);
& \, e5 q; ^) T3 p9 F        SysFreeString(itemStr);9 F$ |; V" u5 m( k
        SysFreeString(valueStr);
! T4 t) \2 q7 W8 Y* Y2 N* K% D& g" {. L0 Y7 \
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???+ v9 ^5 E# C  M2 |' L  K
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????8 m8 X: }. S5 B& M4 C
9 H. H0 {1 U& w7 E9 I

- `9 v6 b0 J$ J8 L6 B2.这是request的程序6 V3 ]) O* A  \' `9 N1 X8 H" y! ~
//  Request a value from Extend2 j$ `/ E/ ~- d* V) D3 S0 m
//
) @! _: a5 P. b( a5 ]2 O( t//        Initialize the variant that will hold the BSTR.  Set the variant's9 h* R: N. ]. L
//        type flag to indicate the fact that this variant holds a BSTR. Place the6 P! @) Y3 x) `9 V1 P5 I6 G& g0 j3 t
//        BSTR into the variant structure.
6 h/ U4 n) M0 `+ E+ q+ M% d1 U( ~5 E3 [
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);" c" g; F: [* m( |
       
& m- w# o" X, [: o3 n5 U         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");6 b' n4 p' a( }" q* l/ G; n  ~5 ~+ |
        VariantInit(&requestVariant[0]); 8 p6 E7 S; b; H- A) Y
        requestVariant[0].vt                 = VT_BSTR;
, g! S4 l. d' h3 C        requestVariant[0].bstrVal         = itemStr;/ E! x/ j' G. z2 @9 n

$ R$ ]5 r9 @+ d- }8 n          topicStr                                         = SysAllocString((WCHAR *) L"system");1 S5 b: c. a* o( f& l* ?
        VariantInit(&requestVariant[1]);
* |- ]3 p% A+ W        requestVariant[1].vt                 = VT_BSTR;
5 G, t) @& u: v5 U. M        requestVariant[1].bstrVal         = topicStr;
6 r$ Y! K8 U) j  _6 ]" p
& C$ ]! H: j6 P8 g# a//        Set the DISPPARAMS structure that holds the variant.
! H6 J" W3 h& v; m
$ Q8 v" O8 }, G( E  ~) e9 e        dp2.rgvarg                                         = requestVariant;
8 O" p' g( M* ^% M5 `9 X# [        dp2.cArgs                                         = 2;4 n/ t, \, v6 `. \
        dp2.rgdispidNamedArgs                 = NULL;
3 H! z' U  Z9 Q! \. V        dp2.cNamedArgs                                 = 0;
3 j+ M6 w+ w' @% X* i1 [& W
0 L: G1 `, p! p3 ?2 c9 M8 u$ u         var.vt = VT_EMPTY;! T$ p( x% {: a$ G" c) V
% s- m; W6 a) V2 E
//        Call IDispatch::Invoke()% T; R! C/ D" W7 V/ ^, g" N

5 c# w3 R- S2 d: ?( h6 y  [3 T* e        hr = m_pDisp->Invoke(
0 @4 s5 o9 T8 h- v8 a                requestID,
  r, k- ?. z2 I) o1 ~# f, ?( l                IID_NULL,
  V; k! {" q) S- h                LOCALE_SYSTEM_DEFAULT,$ w* w3 H* B; W* A# I- V4 R9 p
                DISPATCH_METHOD,
6 R, J+ G& I$ |+ c& B1 M' e" G                &dp2,
$ Z% O; r( B0 M: S. d* R$ [! E                &var,& M* B0 x0 X. m  e
                &ei,2 f8 O) `% S2 E$ K8 V  C  H  E
                &uiErr);8 X, B& k5 R/ s" s5 Y) v- @1 f

" W7 O, O* W9 L8 t8 D' V        SysFreeString(topicStr);+ Z' z. u2 j3 v, d
        SysFreeString(itemStr);
, y" r/ j" _' x8 r; |2 |) a' t3 J请问该程序是获得extend里面的哪个值?, k& z5 h) T9 O* v3 n0 E
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-5-7 16:25 , Processed in 0.014761 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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