设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11453|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:. q& D& J+ f9 c$ s" `# Z# W1 y
Name = (WCHAR *) L"Poke";7 ^/ h- o( f- a1 @/ Z: c
                
) [6 k9 S; j2 _3 q5 M( w        hr = m_pDisp->GetIDsOfNames (
9 Q! H! X/ p( I                IID_NULL,                                // reserved
. m3 o7 p& S: p* M( q" _                &Name,                                        // Array of names to get IDs for
* a/ X9 ^: q$ E9 ~8 K$ i                1,                                        // # of names in the array
  f$ A  i. m5 F                LOCALE_SYSTEM_DEFAULT,        // System locale0 S7 w) ^% J& t) l) N+ {
                &pokeID);                                // Array of IDs to fill on output( {0 {" x7 w  \! l% X' ?0 ]1 p3 T
                        * s9 f# \3 r8 V3 h: u
        if (hr)3 x9 w6 Z9 S# v
                {
. N- G" ~8 P" i                MessageBox ("Get Poke Unsuccessful");2 [& V) ^  K0 l  ^' B% B. M
                return;
' V0 V% Z( k' j) o/ ~" R2 W& A4 o2 ^                }0 N, D0 }3 h/ o  U

+ X; [% V# V7 T# k8 a( b$ Z/**************************传递数据给extend**************************************/5 Q/ y2 v8 E! D& @  o6 v% m7 x
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
; k% u( e) W# q% ~. Z! s0 X        1 h3 c( q: w9 }
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
: F. W' x! x4 W" ?1 K        VariantInit(&pokeVariant[0]);
: m9 F1 L" f6 J5 ~        pokeVariant[0].vt                 = VT_BSTR;
+ `1 @, D! @  ^# j! c8 n, M0 x5 J        pokeVariant[0].bstrVal         = valueStr;9 H; c% q  {: _$ v7 ?* n' L  Y
- k& o; E" L/ A' q0 Z
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
1 V4 B8 I3 b. W+ _5 @; P+ \        VariantInit(&pokeVariant[1]); 0 y) i# f1 d& F
        pokeVariant[1].vt                 = VT_BSTR;! T* R! j$ n2 a" T. \
        pokeVariant[1].bstrVal         = itemStr;
( Q6 R: F! Q  H+ I3 `+ h) N) }: f# [- e4 T' V$ N
          topicStr                                 = SysAllocString((WCHAR *) L"system");
5 Z6 ?/ S, q- l. K2 f9 `        VariantInit(&pokeVariant[2]); 2 r: S6 k7 F3 U5 V6 D1 b( S+ d$ H
        pokeVariant[2].vt                 = VT_BSTR;* D. ~) w  F) Y, U7 d
        pokeVariant[2].bstrVal         = topicStr;8 m# B( y8 W% \, q# L. y. j

' e% Y" }0 f; u& B1 k. s2 d//        Set the DISPPARAMS structure that holds the variant.
% m! O  V1 A5 }" Q0 N' e% q5 G8 M: P) K. P  N, S1 j+ w) t
        dp.rgvarg                                         = pokeVariant;: s! E- g5 c+ ~8 k
        dp.cArgs                                         = 3;* J; O: H$ N5 Z6 {3 ]+ |
        dp.rgdispidNamedArgs                 = NULL;
9 x# W$ F( V$ b8 Z        dp.cNamedArgs                                 = 0;
% C# I" Z- g$ }' L9 n7 w1 |( Z
- c5 \* a) g, E& u7 q//        Call IDispatch::Invoke()
! H2 h; q9 B; \# _
  Y% j4 Z+ J0 o2 H! c' U7 ^        hr = m_pDisp->Invoke(
$ F7 y) Q- n0 a9 n6 t                pokeID,
; Y9 b6 x' j* a5 H, ~                IID_NULL,
' p6 z6 Q- C4 G+ t* ~; c                LOCALE_SYSTEM_DEFAULT,( @% z4 X; f' I* q9 }
                DISPATCH_METHOD,
8 J; t; Y' f: F4 q" v                &dp,0 ]* k+ u) `. t8 v; P( S2 B
                NULL,0 C/ T1 U' G8 f& w( r$ w  {
                &ei," X( k# r5 ?, v- j* s; U
                &uiErr);
& t$ j% }  k" S' H
1 c, G9 C: ]4 U& P' R2 G        SysFreeString(topicStr);  c$ R) r) |* u* c* s
        SysFreeString(itemStr);9 ?2 f+ B: g" v! c4 \
        SysFreeString(valueStr);
9 h6 V0 T4 ^$ f1 z) e
7 p6 p# e) o$ j2 |: p; O7 }现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
4 I  x, t6 F) d* L+ l8 s# Y& ^7 N) p此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
! _% x4 m! N9 P& N. ?, X' d, ~' c2 \+ O

0 W& ?- ~6 u3 ~9 o6 K' ?$ e2.这是request的程序
2 p( H; H3 {. P) N  r8 K//  Request a value from Extend  G; n* D8 A* Z/ U7 k- X
//( i8 S8 y+ [& A$ N! s
//        Initialize the variant that will hold the BSTR.  Set the variant's
6 q0 X4 C4 ~) f2 M" e//        type flag to indicate the fact that this variant holds a BSTR. Place the
, r6 L" S7 E7 T7 ?" b' G) O//        BSTR into the variant structure.
: @# o! m' d" O; I' S3 s1 f8 Y# W
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
* q6 z7 Z/ I( J4 u  ]5 R8 H5 x       
7 w, M3 F4 ^0 ?# ^- C         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");/ B& L7 p% h/ }( F( `, y* A
        VariantInit(&requestVariant[0]);   a9 Z, D9 x" ^6 b; N$ h
        requestVariant[0].vt                 = VT_BSTR;
$ v% n  D) ], O' Q4 T4 P" f6 y        requestVariant[0].bstrVal         = itemStr;  W$ {* l4 B, @2 f( ]
( R6 _0 l% d1 W; N
          topicStr                                         = SysAllocString((WCHAR *) L"system");
# x$ C, F4 `) E! j, n1 x3 A        VariantInit(&requestVariant[1]);
% C% S: F' U, Q) O; W        requestVariant[1].vt                 = VT_BSTR;
& ~" S2 r% E: R! x9 V& i# k7 M  y        requestVariant[1].bstrVal         = topicStr;
+ n: B4 h$ `" i6 G/ x
6 [" b4 M. G' X! L//        Set the DISPPARAMS structure that holds the variant.
8 b8 R( ^$ k) i3 }  f) j, v) Y' B5 s2 n! q
        dp2.rgvarg                                         = requestVariant;
6 w% _3 Y9 U- {        dp2.cArgs                                         = 2;( ]- t* D- R/ J8 t% T
        dp2.rgdispidNamedArgs                 = NULL;
& G; u" T  s7 A        dp2.cNamedArgs                                 = 0;
) v" z3 x0 Q+ z0 G* ^: u  ^8 M1 F) w3 V; b6 N' I; D
        var.vt = VT_EMPTY;0 e8 e% _( K" ^. b: ?) {  Q% Y
6 Z* z# U. _+ Y2 p  W( B
//        Call IDispatch::Invoke()
* Q% S. Q; b1 L" J5 z" a7 R) h* H8 |6 J3 w4 Q; d( q
        hr = m_pDisp->Invoke(5 X/ f. k( S2 o, E! y0 C
                requestID,( C2 O. }& ^* E/ Q1 x, l4 N2 L9 A
                IID_NULL,
! F& w* j% Z8 l! u1 g3 v                LOCALE_SYSTEM_DEFAULT,
4 ^5 |7 `3 s# ?; Z- y                DISPATCH_METHOD,* K9 d1 t- u4 P8 m; p* Y
                &dp2,
, L) u" h2 K' a, U5 ?7 d! T6 K                &var,* _$ J1 |. z5 ]" e: g6 Z
                &ei,& v% I5 L1 z8 s7 ~
                &uiErr);3 T" z( N* f' N3 f2 z5 T' _+ T
, d8 e4 b* B5 x, U, T, k5 l7 h3 G9 N
        SysFreeString(topicStr);
; ]; x' p* M/ A! T( q* F        SysFreeString(itemStr);% @/ w! L# ?) ]. e% d
请问该程序是获得extend里面的哪个值?0 F- }* X$ |1 ]# }5 ]/ ?
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-10 23:00 , Processed in 0.015744 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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