设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9044|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
1 H- `0 h" K( mName = (WCHAR *) L"Poke";
2 T2 V' T9 @! v6 L, E                
( C- O; L2 D' ?, O: u0 }: o        hr = m_pDisp->GetIDsOfNames (
6 v- F# z, |9 N) \9 }                IID_NULL,                                // reserved
3 t1 ^+ P' B- C! v( i% Z. v                &Name,                                        // Array of names to get IDs for
" s* l; `2 L- X2 [; b2 q                1,                                        // # of names in the array
' M" I% Y+ p' {                LOCALE_SYSTEM_DEFAULT,        // System locale
# m& |$ g0 d8 f4 w                &pokeID);                                // Array of IDs to fill on output! u! ^# e/ \: }' F! c9 o0 V
                       
) W0 K! _5 f2 G2 G/ [        if (hr)
& }7 X; g5 e; f( I( n                {
' W. Z0 I% Q0 `. m- P; Z0 [. O: G                MessageBox ("Get Poke Unsuccessful");8 y) u* V* z# _# @0 |
                return;/ T  H7 b: }& f! g8 @
                }5 [+ ?, n2 B' p  P! V# ?3 w7 v

  I  z2 o: K' n, j0 b/**************************传递数据给extend**************************************/, d$ H7 _' H9 c2 d# @3 R
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
" X" B* F, D7 E* d  |* m8 m+ J        7 {. g4 |* J. G$ e& A7 n# }
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
! _; m. B2 M  P4 ^) }+ |        VariantInit(&pokeVariant[0]);
4 `$ x& j& {$ {' f$ c: m* [% k        pokeVariant[0].vt                 = VT_BSTR;& ^$ x# E7 a1 o, Z; l) W- M
        pokeVariant[0].bstrVal         = valueStr;7 w5 y, ]: [" R$ [0 J& L. E0 ?0 m
8 X! w- F* G, P% K3 ~' B
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
5 E; I7 S' a& j" I# X  y# t: g        VariantInit(&pokeVariant[1]); : T# w' l$ T" ~5 B0 }4 K1 ?
        pokeVariant[1].vt                 = VT_BSTR;7 Z; c3 {; O( s& d- M: I% ^5 j
        pokeVariant[1].bstrVal         = itemStr;
5 |3 J) e. x! A8 w
: U) x4 X/ \8 D" A$ B/ O0 ]' Q          topicStr                                 = SysAllocString((WCHAR *) L"system");- t, Y& r9 ?- s, l
        VariantInit(&pokeVariant[2]);
( ^) q4 d: P9 `! ?        pokeVariant[2].vt                 = VT_BSTR;  ^3 c2 @) x! `) [% @' l6 v% _
        pokeVariant[2].bstrVal         = topicStr;% F$ O' B4 v/ m1 J

" }( e4 F0 G8 E) R3 B5 W" K//        Set the DISPPARAMS structure that holds the variant.: u# g6 |6 a2 B! I6 O* H; n+ a

& Z, l5 S  o  K: x8 q        dp.rgvarg                                         = pokeVariant;* U! i' E+ I  a" N9 k
        dp.cArgs                                         = 3;
9 Y) A: |& C, `+ `% C7 f        dp.rgdispidNamedArgs                 = NULL;
7 g3 K  x8 U: q8 o8 |1 a        dp.cNamedArgs                                 = 0;7 E$ i" `) h0 n6 ?& c0 s6 L

0 ^! q4 H, S% c$ G2 P//        Call IDispatch::Invoke()
+ D: h7 q( R" t! S9 K0 ?' v' @" f
/ V- q1 \- W8 n* f1 y        hr = m_pDisp->Invoke(
7 w, Q$ D0 O/ ]/ n" M                pokeID,
* ^! Q4 t& Q4 l/ K4 E                IID_NULL,
" n0 c. ?8 k; N7 |* q% m                LOCALE_SYSTEM_DEFAULT,
2 a  x7 N6 C  K7 A8 ]- t' p; e9 \& c8 l                DISPATCH_METHOD,, @7 N7 R0 U/ f! B6 g
                &dp,5 N+ O# }6 U, |$ I0 }
                NULL,0 _& t3 O6 E. y
                &ei,
4 c: u: A  \% E  c/ Q9 W                &uiErr);
8 P# S2 b1 D, L* E) N6 }' {" X
' F/ B+ L2 z/ P9 }  M1 Z$ z        SysFreeString(topicStr);* y' f9 P. A* z! H1 x& N% u$ x* O. g
        SysFreeString(itemStr);
+ M" D* h5 l3 u        SysFreeString(valueStr);0 J  l: y; B6 g8 N2 l

0 p9 r) b% V( u. p2 ~现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???( |* `# ]3 e* F2 v
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
/ d* i2 j2 p/ x, L  I' ]6 r
- u. v$ M$ ]# U. S, o: x) O, L+ Z9 T( i  z4 M: i
2.这是request的程序
! R7 B" o- w7 e- L& Z6 r" B//  Request a value from Extend9 J# F0 M8 r; Q: ~
//
* G& [" Z$ Z: y  u" u. R/ R//        Initialize the variant that will hold the BSTR.  Set the variant's
. [: W( u  F' K//        type flag to indicate the fact that this variant holds a BSTR. Place the
* _% |% }; [* [//        BSTR into the variant structure.
: ~% u% d$ k1 O, e4 B# d9 L: z- j& e2 ?: q7 G
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);2 S* w" U6 u7 l1 w' C! G  z
       
% y1 [5 ?( A/ x! }& s! ~: l         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
' n4 j$ V/ l, a$ L        VariantInit(&requestVariant[0]); . V4 v, a9 R- ?) ]3 G/ h
        requestVariant[0].vt                 = VT_BSTR;& n5 q. \5 L8 A' Z
        requestVariant[0].bstrVal         = itemStr;9 \/ V; J# }( M
0 T; {. Q. i, f7 q
          topicStr                                         = SysAllocString((WCHAR *) L"system");. D& [( K7 u2 O5 P6 D
        VariantInit(&requestVariant[1]); # O, r3 o6 L! F/ C
        requestVariant[1].vt                 = VT_BSTR;
5 J! X* f( m" K5 o' |        requestVariant[1].bstrVal         = topicStr;7 h" X; s9 m; s$ v: f  r* Q

) e8 |% R. N" z//        Set the DISPPARAMS structure that holds the variant.
6 m' a( R- Y! t% P5 ~' ]9 h3 [4 V9 ]4 r) B
        dp2.rgvarg                                         = requestVariant;
0 `: s; a/ W' i* Z% N9 H        dp2.cArgs                                         = 2;6 r4 U5 N5 B$ }! R
        dp2.rgdispidNamedArgs                 = NULL;
  k# F* W: |+ Z5 Z8 _' p' T        dp2.cNamedArgs                                 = 0;( |/ h/ x2 t) @; h1 s0 G5 N
0 [. F$ S# f0 V; L0 v! u4 O
        var.vt = VT_EMPTY;5 H. ~) v& E5 U. c; O: j1 P3 i
+ F' z. H. K: w* P- U
//        Call IDispatch::Invoke()5 @7 a# m+ C. Z! r
& n6 A! i/ G1 h$ [
        hr = m_pDisp->Invoke(& G2 m) [7 r9 }  l
                requestID,
* v: Y* h7 G7 W                IID_NULL,
' \7 ^7 I1 o# d+ q: i0 t, U" p7 |                LOCALE_SYSTEM_DEFAULT,. q$ Z5 @1 ^- E/ j4 L  F) @0 \
                DISPATCH_METHOD,: z' S: x$ G; n8 i- E; d
                &dp2,( t: Z3 S! k2 y
                &var,! ]0 K( J# @  y0 D" V
                &ei,
. s# ]1 M- Y/ O                &uiErr);$ L4 k- `$ B5 D& b

" Z: l/ ?5 e! P( t        SysFreeString(topicStr);2 R7 g% g5 A; C' Q
        SysFreeString(itemStr);
& A( y$ w5 ~! s7 n* m请问该程序是获得extend里面的哪个值?
* V0 d/ w( Y) A如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-3-31 18:19 , Processed in 0.018312 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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