设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7784|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
7 }4 I% W$ z# X- Q, b$ x9 o! QName = (WCHAR *) L"Poke";
1 m  u- |7 V. O- c" V" r                
' u+ L1 n- T- n        hr = m_pDisp->GetIDsOfNames (
. Z# q) l* F- t8 X                IID_NULL,                                // reserved) Y: D8 d6 z7 o! j' t4 I
                &Name,                                        // Array of names to get IDs for
4 h7 f7 N4 B7 n4 }! m                1,                                        // # of names in the array
+ [0 q8 Q9 b* l                LOCALE_SYSTEM_DEFAULT,        // System locale" v0 }. {$ u$ B, F2 N3 n
                &pokeID);                                // Array of IDs to fill on output
, l6 V" I! ~! a1 Z/ e6 J                       
: D: B2 ^2 ~. L        if (hr)
( k9 P1 r5 B  y/ i: u% f" A  e                {
+ J; a# u) H& R$ R7 m                MessageBox ("Get Poke Unsuccessful");6 w2 U' {- H# _" ~5 i  }6 z
                return;# P/ h- O7 e( s! K7 D
                }
: d4 g5 ]! D; e* F  ], v
; y* q% f% b6 I9 f/**************************传递数据给extend**************************************/( N) [8 B8 R0 b) A6 M# I! @
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
! ?1 ]+ K/ e5 q: `( }" p" e       
; M5 Z' [' @+ T5 o$ G         valueStr                                 = SysAllocString((WCHAR *) L"1232");
* H2 s( h; {: s$ U' C        VariantInit(&pokeVariant[0]);
& S5 t2 M* h2 _2 Z/ D  Z        pokeVariant[0].vt                 = VT_BSTR;( h: i1 {; U2 A, E( S* c$ m
        pokeVariant[0].bstrVal         = valueStr;' v' S+ P) {/ p
) k/ F2 @2 \, a# x* Q( _" ?
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");+ ^7 {. O+ B6 d) y6 U: O  G( v
        VariantInit(&pokeVariant[1]); 3 Y7 Y3 [6 t0 N5 ]8 Q* o( X2 z
        pokeVariant[1].vt                 = VT_BSTR;
4 A8 U1 Y, f% X) Q        pokeVariant[1].bstrVal         = itemStr;. H3 j* I( X5 R4 k" z- Z

2 S0 \# {. f9 K: X          topicStr                                 = SysAllocString((WCHAR *) L"system");
  C& ~8 X0 g4 J; g( T8 C        VariantInit(&pokeVariant[2]); % G* W( @5 S! _0 B& R) |* P! @( q
        pokeVariant[2].vt                 = VT_BSTR;
" K( A8 }' [/ B8 ~- a" O* p        pokeVariant[2].bstrVal         = topicStr;
; X) E9 |0 @; d) D* ?7 Y
! i6 B( e  p' W% N8 M. {( S//        Set the DISPPARAMS structure that holds the variant.- R. q3 [9 J% e0 \* g

+ N7 X6 q! s$ B" c, D        dp.rgvarg                                         = pokeVariant;
& G$ w# v$ E; A        dp.cArgs                                         = 3;
3 C- q) Q' ]. B" x4 e        dp.rgdispidNamedArgs                 = NULL;
- d  f( K1 J. @2 J% b- ^4 E        dp.cNamedArgs                                 = 0;
, j. W" V/ g; a4 Y
7 Z0 W) g6 U5 G, }: O  |0 Q//        Call IDispatch::Invoke()
7 j! S8 X% X7 x' Y- {, ~" D- F- t# ~
  C' J$ K8 f( w        hr = m_pDisp->Invoke(" e; r1 u8 ~& B: o3 y- X
                pokeID,! _& p$ l" N! C5 h! J6 S! [
                IID_NULL,
$ }4 Y' ]3 o  P0 [2 i. G: j                LOCALE_SYSTEM_DEFAULT,: o1 V  U4 M  w1 v2 Z8 b4 h, W
                DISPATCH_METHOD,$ F) K: P5 @" A
                &dp,
7 }0 i$ A4 m# H" d; ~3 m                NULL,, @( K# w$ A7 q4 k
                &ei,
7 E( G5 l/ r1 ~) d3 f                &uiErr);& I9 f4 b$ L* K; n5 {7 z& E- {
* R& x2 C+ A! [
        SysFreeString(topicStr);) O8 [( |) y; |+ p/ \& L# [
        SysFreeString(itemStr);
  l; h( s1 ~4 k3 H% R  V! O        SysFreeString(valueStr);; G9 p& n. {) e7 ^: b

) F; B% e0 h- h6 X现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???) \: x7 A+ P" ~. U
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
( \" ?0 ?  e& H" d3 [( h5 a$ n
" W3 ]/ x0 X% ~2 S* w% ^6 z& z: F, b' u8 K
2.这是request的程序% m( V8 c6 M) |' _9 T3 @- O
//  Request a value from Extend
2 ]" J4 }7 w" m//8 m, q# {* L. X4 Q# a) [5 O8 h
//        Initialize the variant that will hold the BSTR.  Set the variant's
6 f3 U# J: g& D& a. |* v3 q//        type flag to indicate the fact that this variant holds a BSTR. Place the) z4 h9 B7 \; Q+ Q( I
//        BSTR into the variant structure.
; p7 C* w1 o( M, F2 N; E. {5 I5 d$ N% ]
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
0 j) ]1 Y1 h: Q8 }; R9 D7 j9 D; T        ' M/ h7 x+ [: u
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
# K; C* ?4 k5 w6 i8 S2 ]/ j2 M7 l        VariantInit(&requestVariant[0]); 2 B4 m( ~' k" c1 K) j, I9 Q1 r
        requestVariant[0].vt                 = VT_BSTR;8 }% R; f" J, G3 o0 y" o
        requestVariant[0].bstrVal         = itemStr;
& A5 ~, B5 r4 n6 f" V
3 A; s: f  b: s7 H, c! v4 `) G          topicStr                                         = SysAllocString((WCHAR *) L"system");/ j' q$ ~" n7 I9 S! ?
        VariantInit(&requestVariant[1]); 3 E2 k& z! o4 z- l, r! p
        requestVariant[1].vt                 = VT_BSTR;% V3 M' J: Q' ^' e
        requestVariant[1].bstrVal         = topicStr;- S/ I. }8 {9 ^  k  o8 x
& ]+ E' P" |% \# v0 W
//        Set the DISPPARAMS structure that holds the variant.6 L2 B- w1 z# d5 {

0 c( Q$ a! }- {) l9 T9 K        dp2.rgvarg                                         = requestVariant;
' Q2 @) N* l* O( L        dp2.cArgs                                         = 2;( U% ]! t6 E7 W# T! s7 X
        dp2.rgdispidNamedArgs                 = NULL;
9 p' u, Y& p: Y$ V4 s" H        dp2.cNamedArgs                                 = 0;
6 Z3 S. F* U$ i$ F: F) J$ y4 }/ p# \9 u. l: @
        var.vt = VT_EMPTY;. v- b; a: s* K

$ C( X, X4 F0 q1 ]& W1 {//        Call IDispatch::Invoke(). b( c  X3 V0 d1 v# d& m: Y
  U' B9 h9 J  J/ G& ^
        hr = m_pDisp->Invoke(
; g& S9 G& r3 h: W# e  E: I& k                requestID,1 C, S) K8 @+ Y1 i# G
                IID_NULL,0 ]; B% V5 `* t2 |3 H! f% g
                LOCALE_SYSTEM_DEFAULT,
# T3 R, y# J- i0 n% y                DISPATCH_METHOD,# q! P0 S! k) m- \3 l$ M( J
                &dp2,/ A) a! M0 S) J/ [5 q% v+ Z$ k
                &var,; ?& u  I" @0 W" ~" P- j
                &ei,7 v* f$ v7 L8 [0 |9 N) j  [. l1 L
                &uiErr);
- p- n5 j9 }8 c# J, A
3 R! {1 e% P: D* D4 h. h( A+ x$ q& W        SysFreeString(topicStr);& d' {% C$ W9 c; `( U: Y. L7 z9 l1 z
        SysFreeString(itemStr);
% I9 a% m7 h9 d请问该程序是获得extend里面的哪个值?' r) v; E' L+ a! @* R- M
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-2 15:06 , Processed in 0.015499 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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