设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8308|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:- b$ f! J$ `; z7 q: `
Name = (WCHAR *) L"Poke";' M8 j5 i. k% d, u# N% C
                
! L& e2 D/ q) t/ e: p, I        hr = m_pDisp->GetIDsOfNames (
* O8 `# x9 ]0 c9 C- d5 m1 y                IID_NULL,                                // reserved
; j" }2 t. J* h; ^; h' v                &Name,                                        // Array of names to get IDs for
% V$ t: f3 m' ]! R# Y# D9 Q                1,                                        // # of names in the array
4 _" o7 g1 w: \- m- a                LOCALE_SYSTEM_DEFAULT,        // System locale, \4 i0 k- r. S+ A& f" t* r
                &pokeID);                                // Array of IDs to fill on output
1 `  U5 V, h* n5 X1 R$ e                       
& Y. s2 I- V+ R        if (hr): W4 Z( W, L: G; q/ j, D
                {; v' G0 m6 H8 F* ^; @  u
                MessageBox ("Get Poke Unsuccessful");
( _' [$ t5 f. ~" z' X8 X                return;
: P# ^7 a$ y6 D# H4 |: J* d8 i4 I                }$ d8 j% H/ F# I! u' V) ?
" ~( m. i8 j& ?: r
/**************************传递数据给extend**************************************/
6 q' J# z# ~9 K3 F        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);8 ?4 [# N, J) E$ J& U
       
6 O- _" Q; t8 w( ~, o/ L& g         valueStr                                 = SysAllocString((WCHAR *) L"1232");
. e& V+ Y! ^. P        VariantInit(&pokeVariant[0]);
: c3 B- M0 d4 E, z* o        pokeVariant[0].vt                 = VT_BSTR;9 f) W. ^0 n! F0 J$ ~6 K  F
        pokeVariant[0].bstrVal         = valueStr;3 H, I6 D" t" Y: H! z/ }( t8 t8 u3 j

7 L% r0 y! X( d: \' F  P         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");1 j# p8 _4 Y' @- [) `- a
        VariantInit(&pokeVariant[1]);
4 b% e2 @3 s/ r/ I2 Z$ x        pokeVariant[1].vt                 = VT_BSTR;
4 y- s$ U, |( c# e. o) h- P. F        pokeVariant[1].bstrVal         = itemStr;
4 U/ g6 H2 q! N# g5 V8 f3 A; o- {3 A' e6 M. l+ _
          topicStr                                 = SysAllocString((WCHAR *) L"system");
7 m( ~; c1 g, _3 p1 j        VariantInit(&pokeVariant[2]);   r1 s; X# D7 q7 X: K$ i& y( t, F
        pokeVariant[2].vt                 = VT_BSTR;
6 O& o/ B4 N) S) u$ s4 A        pokeVariant[2].bstrVal         = topicStr;9 L& Q7 c6 o# T- Y& S5 p7 F7 U7 s

+ w! J7 \0 z1 S3 O3 O. b, s$ r//        Set the DISPPARAMS structure that holds the variant.
4 L9 t$ C  m* e% a& O. f
( w. S8 g, @/ [, T7 \        dp.rgvarg                                         = pokeVariant;: @: b5 T2 }( a( z6 h# p
        dp.cArgs                                         = 3;. ?1 o# E) D' b9 {
        dp.rgdispidNamedArgs                 = NULL;
. H6 p: E2 Y6 S7 ?        dp.cNamedArgs                                 = 0;+ N3 c4 m* W3 B. y+ K" D
+ X3 R" N7 L3 e+ |# E$ Q
//        Call IDispatch::Invoke()
9 t. C. n% i1 u) ~7 r2 @5 r. h0 O3 _5 v; Y# T, H3 e/ Q  |' V
        hr = m_pDisp->Invoke(7 b1 a% q0 \: @& m
                pokeID,* r" m& q( }1 Z  e. d- D1 a- ?
                IID_NULL,
9 }6 X8 ?' ?3 _3 j( E) L                LOCALE_SYSTEM_DEFAULT,4 I1 w1 y) U% V
                DISPATCH_METHOD,
$ y) w8 M* [/ [3 d* n- A8 V                &dp,
3 w- Z8 z" R8 a9 z. @0 k! G                NULL,5 l) T# m* V" I* v6 n% O
                &ei,
7 Y0 j( Y/ z4 n8 U* H( D                &uiErr);/ U4 B) ?5 s  G* j

+ ?! k* o8 `5 V/ d8 S5 n        SysFreeString(topicStr);
' r# a5 }6 y8 d        SysFreeString(itemStr);
7 J% c$ f. Q, @- o. |: a3 o        SysFreeString(valueStr);
. T3 C# M& V( _/ I) X, a' p) z" ?% V
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???9 ~, c" \- D; |6 N2 u
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
* M5 k0 Q2 K: |# J/ U! {
, [; k, d9 _! M/ b! k1 }0 E* E3 Q7 o+ K( L* A' I1 B! V
2.这是request的程序2 g0 B+ u& x* y+ A, `, g# Z. N
//  Request a value from Extend3 H7 r6 R/ f2 |, M% d" E, ^& n
//- j" r3 Z& }1 B' h, y8 ?# e
//        Initialize the variant that will hold the BSTR.  Set the variant's
7 f( c4 X& x- L2 t7 Z' a+ i//        type flag to indicate the fact that this variant holds a BSTR. Place the1 {; U; _  u7 v) J- q; N7 L2 ]
//        BSTR into the variant structure.
5 {: F7 v/ Q0 C6 d/ p- Q3 g. @7 T6 X* v! s6 N
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);9 d4 ^  I: S8 Y0 \
        3 D# O3 `2 c! l, Z. C! R) }" U0 ~
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");. r5 R* _& x. p: B, h: D
        VariantInit(&requestVariant[0]);
% [4 k' E" N7 i+ e5 t1 ]% V        requestVariant[0].vt                 = VT_BSTR;
8 ~9 [1 w1 n+ j' T' W        requestVariant[0].bstrVal         = itemStr;+ U' u# L* d9 ?2 L# k

6 C  l) q! c; g: C          topicStr                                         = SysAllocString((WCHAR *) L"system");
7 A. e: v4 i$ d% e: o        VariantInit(&requestVariant[1]);
2 [% u  j1 K0 e3 s$ o  B        requestVariant[1].vt                 = VT_BSTR;
' h/ @! ^. v( }# B& Q4 J0 y        requestVariant[1].bstrVal         = topicStr;
8 k$ w+ T4 Y  ^
6 ~3 l/ z) ~5 d) g- s- s5 @//        Set the DISPPARAMS structure that holds the variant.
8 r$ }! P! X6 ]( l' }$ s% _- D; o
; a. M0 V/ b; D7 ~0 G% ]        dp2.rgvarg                                         = requestVariant;
/ ], C- B+ B% v7 }# |0 u8 l* G4 E6 x        dp2.cArgs                                         = 2;/ ?0 P" l& q. P! c  z- B  t8 a4 u6 c
        dp2.rgdispidNamedArgs                 = NULL;& `+ |3 }! G* W4 T
        dp2.cNamedArgs                                 = 0;
( ^& r' ~; I) o+ n2 X- l% h* N0 j9 T$ q, [
        var.vt = VT_EMPTY;
3 R, Q1 D  k/ Z0 q8 F
! W  \9 ?. t# `//        Call IDispatch::Invoke()# H# F; q. |# M; }

- z4 G* U0 m: ]2 P: p, O' R" Z: u, i        hr = m_pDisp->Invoke(
5 w( o) k, ?8 Q                requestID,  g8 j* Y6 f2 [6 l  ~
                IID_NULL," q. r# z/ \7 r: b" P- c
                LOCALE_SYSTEM_DEFAULT,! f" }. }5 b6 H0 v& t
                DISPATCH_METHOD,' [6 Y9 i3 J; P) \0 X
                &dp2,
1 G. Y7 G+ `$ U                &var,
8 ^- a- |% Y" x$ q0 `3 Y                &ei,& b9 q3 i" m& F1 c( x# y
                &uiErr);+ V- `4 U' x% Y% Y+ S% T
- Q' z& H8 G; n9 F: n
        SysFreeString(topicStr);
+ r4 E* N0 @, H- f# o5 f5 ]        SysFreeString(itemStr);
# F" h1 @/ J( w. `# A! I请问该程序是获得extend里面的哪个值?
0 T" \5 ~- T$ q* @如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-23 13:38 , Processed in 0.019419 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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