设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8291|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
, L3 d) g- ^1 |" }Name = (WCHAR *) L"Poke";) X' |! p6 @) v7 \; z, w9 m
                
( e& \+ q- e; f9 K: c/ m4 c  d        hr = m_pDisp->GetIDsOfNames (& z' p0 w3 A$ L! \8 y& _
                IID_NULL,                                // reserved6 Z; \" s: X9 \
                &Name,                                        // Array of names to get IDs for+ ^/ j- K  z& h5 k' K  ?# S. ?) Q
                1,                                        // # of names in the array
( y- m5 A" v. r4 H7 |                LOCALE_SYSTEM_DEFAULT,        // System locale
, o; A  ~4 L- i                &pokeID);                                // Array of IDs to fill on output+ |3 f9 P6 n$ m3 }
                       
2 M2 b) ?5 }. D% u* k* j$ f        if (hr)' u8 t& v% e% d0 `7 g# T
                {
2 _& f" |: k7 c: F                MessageBox ("Get Poke Unsuccessful");! n* e4 g0 z( s/ m$ V/ Q! e- }
                return;/ g2 v, e( D2 h' h& y
                }
, `- c& E1 M( \" `0 v+ m" I9 x3 o. e  e; E3 R( k5 J( `( d5 H3 y2 N
/**************************传递数据给extend**************************************/
8 _8 y4 b9 z( {* d' [        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);4 S& {, ^/ l  D! s: f( y
        9 Z) f0 B6 a: N( w7 K5 V4 u
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
$ F% u) `" ^+ ~$ B        VariantInit(&pokeVariant[0]); 1 s5 s9 a  I! `5 q" g; G
        pokeVariant[0].vt                 = VT_BSTR;
: S, Y4 G0 I, e( C8 }        pokeVariant[0].bstrVal         = valueStr;
4 L" Q$ p) A6 H; u/ X2 O. e1 M
' m* v6 T+ _+ z7 H& ~7 W0 J/ H         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");0 Z1 ^1 ?: c: D. k
        VariantInit(&pokeVariant[1]); 6 ^$ J' P" C- f
        pokeVariant[1].vt                 = VT_BSTR;
* z6 {" S; Y5 @! Y% A% e4 F        pokeVariant[1].bstrVal         = itemStr;/ a6 u( p  `! m" ?$ y$ Q
6 l' J$ \% c' d$ j' V/ ?
          topicStr                                 = SysAllocString((WCHAR *) L"system");0 ]! d4 g# j8 u" `8 t0 \  M
        VariantInit(&pokeVariant[2]); % T6 a! R! G% F2 y0 Q
        pokeVariant[2].vt                 = VT_BSTR;
; [$ `& B- t2 F# I5 x  ?        pokeVariant[2].bstrVal         = topicStr;! N0 ?& y/ `0 O5 p

; L9 Q% U( h3 y! P- i& P0 o  z3 j//        Set the DISPPARAMS structure that holds the variant.! ~2 T+ k7 n* I" _: c6 _

5 L: @- b5 c" D) G  e        dp.rgvarg                                         = pokeVariant;
9 A1 b! l  Q0 e$ v' [, N        dp.cArgs                                         = 3;
2 b$ a% G0 O# k, ~4 c- ~2 u6 B        dp.rgdispidNamedArgs                 = NULL;7 P9 _: t# h9 c& m) u8 W
        dp.cNamedArgs                                 = 0;
7 J5 N2 q; f  ?4 I# n* L
' x9 L+ z8 @! c# Z$ c//        Call IDispatch::Invoke()& v- Q% J( ~6 L3 _4 t& M/ Y
5 s' G0 K6 H3 W2 O
        hr = m_pDisp->Invoke(
0 U2 m$ [6 u$ l  Q$ c3 E& [, I                pokeID,
- z% ^! [& c7 n- \8 B                IID_NULL,4 z3 J4 N8 t* T; o. T" g3 Z9 J. N9 g
                LOCALE_SYSTEM_DEFAULT,
' K6 ]+ s1 I. O: w" D/ _                DISPATCH_METHOD,
6 V4 g; x6 e, T2 g% h5 z. F1 D+ i' j+ {                &dp,
1 g0 b( W! d- [% R                NULL,& l/ E& t8 o4 ~' X
                &ei,- p8 v5 h6 r, ^  `$ d+ b; L' X
                &uiErr);
( D8 @* a% z' t/ j7 t0 j
# W/ a! f0 l/ X7 x+ q! W        SysFreeString(topicStr);4 z! I# @# k, ]# Z6 M
        SysFreeString(itemStr);6 k" }2 l2 B1 P# h1 f
        SysFreeString(valueStr);
9 k0 Y9 H) A5 ~' \4 K# k1 |! {, C) D# d7 O$ i& B9 u' j$ R9 y! _
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???* ^6 I0 }+ y' T- w, B  T
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????. {0 D7 K; R7 K7 Y$ K' w6 f
1 l5 s& B/ m. F6 f, F5 n. e
; m0 B$ l0 _0 b9 K; h* t0 l
2.这是request的程序
# t3 `" T' H4 l. }- K9 k//  Request a value from Extend$ G+ |( E7 \) T
//: m+ s, X, Y. H6 M! q
//        Initialize the variant that will hold the BSTR.  Set the variant's7 R5 J; R: ~  q# Z; i& L* F. k
//        type flag to indicate the fact that this variant holds a BSTR. Place the
0 W# B  S8 z+ i* _' M& s4 q9 B/ _//        BSTR into the variant structure.
1 ^( X( |0 j  U- z$ V
9 \0 I6 G' ~  Q! ]- g, e        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
7 \( a/ }. x6 e! \/ Y       
5 P! H7 `. P9 x0 A) I         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
- R% E9 k" O: n& `  W: p, h        VariantInit(&requestVariant[0]);
9 h' `$ p1 j% f) Z! P& j        requestVariant[0].vt                 = VT_BSTR;8 v4 p8 e& Q2 W: P7 E; p
        requestVariant[0].bstrVal         = itemStr;* u; m  F, Y* P8 O- j3 R4 D

; d  S* O8 t5 e( l$ k: q          topicStr                                         = SysAllocString((WCHAR *) L"system");
+ x/ x" B& A. t$ a* \        VariantInit(&requestVariant[1]);
5 n) ]" h" A  w  U        requestVariant[1].vt                 = VT_BSTR;4 f2 y2 E: `' Z6 O0 T: L  z
        requestVariant[1].bstrVal         = topicStr;, Y+ a  g6 ^! N! Q8 `8 V

" C9 D  i0 |- Y9 u! Y$ i& D//        Set the DISPPARAMS structure that holds the variant.
+ M; A+ V: t8 y  \2 P9 U5 J4 S9 l6 ]1 {; X, ~/ ?
        dp2.rgvarg                                         = requestVariant;
* z$ y7 ]/ @$ l1 v; O6 x4 Y5 K        dp2.cArgs                                         = 2;0 x4 v) [5 \$ `
        dp2.rgdispidNamedArgs                 = NULL;
6 ^2 N2 w5 i$ h& E- r        dp2.cNamedArgs                                 = 0;
% @) [* V6 C  ^( K2 g+ V2 K2 t% J) t/ z" f8 q" l
        var.vt = VT_EMPTY;& A4 L8 f6 ?/ q+ r/ R- R- |1 y
4 s# C. M; a3 |& v( H; E4 Z
//        Call IDispatch::Invoke()+ T3 O# ]  v' f; j; v, `
4 f1 S. ^; w7 S
        hr = m_pDisp->Invoke(
: D0 K4 m6 S+ O4 s' G, S1 r                requestID,; T7 ?' x( L* p# q1 T
                IID_NULL,
, K) U* B! t3 e6 E$ N5 b7 j1 {( c                LOCALE_SYSTEM_DEFAULT,6 V* \6 B9 h8 o! U& i
                DISPATCH_METHOD,! f7 V' a" g; O+ Q6 U. L
                &dp2,9 J& z2 w9 l# N$ C
                &var,
$ m! K! n) ~) z- t& L2 u                &ei,
4 j2 a/ t1 l( r3 g                &uiErr);
- x. F' |3 {: J% L; D& v5 }- r9 ~$ o- R' Z$ h7 B2 g! T$ s8 \
        SysFreeString(topicStr);. I' u: f) u, {
        SysFreeString(itemStr);
' _6 E' u) x/ O# K( F* z0 A/ Z$ N请问该程序是获得extend里面的哪个值?
5 j3 K. p2 Z7 r" o/ q4 ^& ~如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-22 18:10 , Processed in 0.013000 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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