设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8395|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:' g; O( h: y. H
Name = (WCHAR *) L"Poke";
  O8 F0 K$ F# ?# u6 p                 0 X3 J1 j% f" X* ?3 j8 p
        hr = m_pDisp->GetIDsOfNames (
% @, {% y. U) v. u' ^* ]                IID_NULL,                                // reserved
' S& f( O( N2 R* ~* {7 C                &Name,                                        // Array of names to get IDs for
+ @1 E& F; h8 V+ Z                1,                                        // # of names in the array
" s- `+ a" W! P9 b                LOCALE_SYSTEM_DEFAULT,        // System locale
- a- u9 z5 K1 ^6 P% [                &pokeID);                                // Array of IDs to fill on output7 r1 n4 y2 s# ~8 i% \' g2 T
                        + w/ z' p' ?) O/ v
        if (hr)* D& x% J; z+ _
                {
9 `8 E2 Y: L" `3 M/ |                MessageBox ("Get Poke Unsuccessful");- ?: E6 r1 ^# \; S' L
                return;" S$ E( X/ C( G: u  G. `
                }
; N. t3 ~% G) h* ^; l
) H. t; L) `. m% _; `) t9 f9 q/**************************传递数据给extend**************************************/
9 B( [0 g9 n* _0 L+ ?1 i; m) b        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);% A/ Y" e% B( Z2 E
       
) H  r; L" A6 ~" s7 W0 x  S7 W         valueStr                                 = SysAllocString((WCHAR *) L"1232");7 A3 C# Q" Z" P& e
        VariantInit(&pokeVariant[0]);
0 f* H1 d- [% K, n  i        pokeVariant[0].vt                 = VT_BSTR;
4 p3 C- D$ a1 h5 r- m( l4 u        pokeVariant[0].bstrVal         = valueStr;
: P% T( |2 K# I! R: E( O" I3 J5 v% W8 C: b
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
2 Z' j2 ~3 q1 t        VariantInit(&pokeVariant[1]); 1 V2 N9 q1 m! x2 G3 k
        pokeVariant[1].vt                 = VT_BSTR;
6 r2 N! M! d5 [3 E" K: x        pokeVariant[1].bstrVal         = itemStr;
2 S2 ^0 w% C) L) |* c4 O: G2 I
  b2 {8 h- X; c% D9 i; _4 U          topicStr                                 = SysAllocString((WCHAR *) L"system");% H0 ]$ ?' R& I+ ]$ t! A
        VariantInit(&pokeVariant[2]); # r2 B$ K4 Z" w: I5 M; i
        pokeVariant[2].vt                 = VT_BSTR;
. K+ m* b$ A3 E        pokeVariant[2].bstrVal         = topicStr;
/ v3 |" n+ J0 d- i( R8 ?/ V3 b" h7 z
//        Set the DISPPARAMS structure that holds the variant.! M/ w" f6 f3 r1 i* O
' a3 m  N1 ^9 g$ k
        dp.rgvarg                                         = pokeVariant;
- y8 u  j, [( }% T        dp.cArgs                                         = 3;9 c! _( F% b" W2 O" s1 T
        dp.rgdispidNamedArgs                 = NULL;
% T5 ]! g3 ?5 T- \$ e        dp.cNamedArgs                                 = 0;+ o! I+ w$ N: O4 F) _' \; Y4 e

( y" _  W2 f2 C3 M& A% `% ?2 J8 @//        Call IDispatch::Invoke()' v) d7 B8 k. I: @! j3 r

, q7 o9 m" y. C  f        hr = m_pDisp->Invoke(
6 W8 A; k8 I4 x6 J2 Y                pokeID,0 I* W, r- X$ M
                IID_NULL,
0 x! B/ f  ]# F$ ^0 r+ x                LOCALE_SYSTEM_DEFAULT,
; l) K. N0 f7 K" _6 \. y+ O& p                DISPATCH_METHOD,
6 S- P9 g8 }4 _7 Y/ l, n                &dp,% i5 k2 f9 H4 P8 y9 i* o% ~
                NULL,
) h6 I( U8 l0 \1 H, p$ P) ?- J2 v                &ei,
( K2 c4 ~; X, N: G                &uiErr);! C; }& E0 U1 [6 |. r- r0 [, @

4 M5 a1 l& G, N2 m, C" r  Y        SysFreeString(topicStr);
  v! t% F) {  T3 l0 n        SysFreeString(itemStr);
3 d  [# F, F  Q! E; I# Y- R        SysFreeString(valueStr);7 |1 ^# Q, a4 |. ?! k; G
8 G  @3 M3 y4 n6 w- x) r4 U& s3 a: I
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???% L3 Z) I& [" R, w8 J6 y- `
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????) m- @& Y7 E2 U* X) z% J8 r+ C8 }
# w, V& O' B4 s

+ u. t; \) v% g6 U6 G, W  w2.这是request的程序
4 N: R- r& u  c1 ~# m6 b/ [//  Request a value from Extend8 z, s, V$ c! y' b% R6 Y$ w
//
4 j2 q1 `: F- I. ^! _! [8 }//        Initialize the variant that will hold the BSTR.  Set the variant's, E! `6 c: A# U# T/ B" r/ p1 l& p
//        type flag to indicate the fact that this variant holds a BSTR. Place the
# w7 \( B: |# s6 |, i* q//        BSTR into the variant structure.
& ]) O1 F9 W- n- B
- `+ z3 ~" R7 r* h3 q$ b6 {        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);% G! w3 v5 p4 g
       
% m' ]7 N* b% I! C2 o) n         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");) h6 a% S% ?: E1 O
        VariantInit(&requestVariant[0]);
# t3 F* u7 P# O  h: m        requestVariant[0].vt                 = VT_BSTR;
/ l6 e' j( I" @* X* d        requestVariant[0].bstrVal         = itemStr;  b) q% x+ O8 V( \' \

5 ~  p$ }3 |6 q! J- H8 h          topicStr                                         = SysAllocString((WCHAR *) L"system");, O. Q: [% K4 r; R" U0 G6 k2 D
        VariantInit(&requestVariant[1]); 4 Z! g5 G! ^2 a7 @, a( z
        requestVariant[1].vt                 = VT_BSTR;, y* Z. |$ F2 I
        requestVariant[1].bstrVal         = topicStr;
' I* x+ t9 L" K& ]0 E% M
5 N& X9 O8 i, \& f! E/ O//        Set the DISPPARAMS structure that holds the variant.
6 _/ }( L7 U5 B$ Q" e( Q
& Z; a9 Y! H9 G        dp2.rgvarg                                         = requestVariant;! b+ n5 Z5 _" L, |1 N; H
        dp2.cArgs                                         = 2;
- T; M# d1 r4 y1 C        dp2.rgdispidNamedArgs                 = NULL;8 t+ N' m$ F7 I. G# ~6 d7 P
        dp2.cNamedArgs                                 = 0;
$ p, a: U2 D- c! o' c3 S5 s% o2 S* C1 Q: Q2 i. I1 X
        var.vt = VT_EMPTY;
+ H4 E3 l5 f* W
. @& J. \9 p, \6 B//        Call IDispatch::Invoke()( h. r+ m& |9 R% T/ [; E+ z
7 v: F' f0 m' Q# ~9 E" r
        hr = m_pDisp->Invoke(
3 U7 U/ r$ E# h$ s6 Q' L- a                requestID,
7 D, ^  f* n. P6 }7 o                IID_NULL,
2 }% v3 _5 ~3 E- s* R                LOCALE_SYSTEM_DEFAULT,+ [; ~% e; f. c. w5 F
                DISPATCH_METHOD,
5 @: l# w2 C# b                &dp2,  O6 ^" `6 c5 r( }
                &var,
; \6 N' @* _/ {3 ^7 l: S4 |. r                &ei,  H# ^2 p* C4 X" `/ X& h( ~0 b
                &uiErr);( t7 z3 M- f6 a  |3 p) @; q
8 U9 `7 I2 f" e& i1 L2 ?7 w
        SysFreeString(topicStr);
5 x+ [2 r: N# x0 }        SysFreeString(itemStr);
4 n7 s( d0 l- A, O# {- x! P; p. ?请问该程序是获得extend里面的哪个值?
7 d& I$ l( w* G3 ]8 n如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-27 01:55 , Processed in 0.013840 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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