设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6629|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
% ?0 R/ C. T0 z7 \Name = (WCHAR *) L"Poke";& Y  w- ^9 I; K. k" A9 W
                
! A% Z* R' T* @; N# [1 ]: R+ @) J        hr = m_pDisp->GetIDsOfNames (
- |% s1 X, y1 t4 N. X: p7 M                IID_NULL,                                // reserved, {$ N$ w) y4 f2 L( ?6 R  J
                &Name,                                        // Array of names to get IDs for
) Y, ^. ?: V, ~) A# U  U                1,                                        // # of names in the array( A$ ~& T) @8 M
                LOCALE_SYSTEM_DEFAULT,        // System locale0 y+ A+ F: [5 u4 x* c& h) y
                &pokeID);                                // Array of IDs to fill on output. q/ Z! a7 N1 m8 @1 V
                        . N" E, U3 i! H7 j( p0 j
        if (hr)
' S) |- ?) V6 B$ U3 `                {
+ }/ J# N9 M* R' c; ]3 y                MessageBox ("Get Poke Unsuccessful");" ~% j6 M4 ^8 I
                return;
& ~/ \, ]' D3 K% l0 X8 h! n                }$ V% F% G$ A  F! w9 Q3 {

- K9 W8 i: @1 s8 a2 o2 U( K; F/**************************传递数据给extend**************************************/
6 q2 o" C) E7 a5 s  d% Z" s- W        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);: U" X# b2 e. J
       
8 O4 k! N4 t" F9 U% m( F$ x         valueStr                                 = SysAllocString((WCHAR *) L"1232");# a! [7 U7 {( p% `! F/ T/ r6 N0 l2 [
        VariantInit(&pokeVariant[0]); ! M" }; H" r0 n& C/ H
        pokeVariant[0].vt                 = VT_BSTR;
" r7 p5 W. B5 x9 j% C  E        pokeVariant[0].bstrVal         = valueStr;
2 y: I# f; i( x5 D" p. ~4 O3 c7 a7 I* Q- X& p7 p8 N
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
+ T/ h! U) j" C5 p. |8 W$ |        VariantInit(&pokeVariant[1]);
7 x* g6 i( v# _4 D4 F% K: [. O" C        pokeVariant[1].vt                 = VT_BSTR;: t, {1 U, [$ G$ r) Q- B6 v: l
        pokeVariant[1].bstrVal         = itemStr;, i+ f' i% q4 d9 e- A& |3 \0 W
% l& i, u% }" f! a8 h, W: K8 e7 U$ M
          topicStr                                 = SysAllocString((WCHAR *) L"system");7 v5 [& T9 ~4 ^
        VariantInit(&pokeVariant[2]);
9 f# Y% |, i& g6 B; f( O        pokeVariant[2].vt                 = VT_BSTR;
& C  G, s9 |& O5 n1 _' k        pokeVariant[2].bstrVal         = topicStr;4 x! ?0 P! L' q1 f8 H% L: f/ j
, ?0 w% l2 f9 T4 s2 U
//        Set the DISPPARAMS structure that holds the variant.
' c/ p  x/ P" t1 Z: h. K. ~8 Z5 [- ]% p1 ]
        dp.rgvarg                                         = pokeVariant;
6 k. ]$ t0 s6 e- Q        dp.cArgs                                         = 3;
# \1 Z3 \- y& {# N& Q, e3 w        dp.rgdispidNamedArgs                 = NULL;' F# E: o7 t  n( o* W
        dp.cNamedArgs                                 = 0;$ H7 a* ^7 K  P8 j7 |

2 @* `! h6 a& H! @//        Call IDispatch::Invoke()$ j% f8 H, S' a: J7 j5 x

: w* r1 f! @' h8 v. X* _        hr = m_pDisp->Invoke(. @; y, Q+ @% o. u& Y
                pokeID,$ o" D  M4 H8 f# e+ h$ s
                IID_NULL,* I/ u& Z$ m7 q2 Z6 h  p7 J! {' W
                LOCALE_SYSTEM_DEFAULT,/ m. K. f: R& [
                DISPATCH_METHOD,5 ~: F7 f  ^& g
                &dp,
5 G9 K/ C4 a' `# H; h                NULL,0 T! x) i4 X  @) V9 B/ K
                &ei,
+ X  q+ g8 ]5 E* {0 O) R                &uiErr);7 c& ]% _( m: ^  F% r

4 A' c9 b  ~8 t! Z! K        SysFreeString(topicStr);
7 a- \9 N( ]0 H+ l; u        SysFreeString(itemStr);
5 j( K; b8 h2 U6 T4 W4 H        SysFreeString(valueStr);' f0 K+ w3 D1 b
9 \. Z6 [" g' A! B' ~
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
2 ]* X- [" @+ v( ~% _此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????& d/ i7 b9 t( }' P

' n5 y' E2 A1 j  M- i. p0 O2 m  o, b1 \( |) y, N4 y2 h; }" B
2.这是request的程序3 C0 L" P& k8 ?* W
//  Request a value from Extend2 j$ g3 j' d' H8 ]# I
//) ^% g: ~- m) j. Y$ K9 _
//        Initialize the variant that will hold the BSTR.  Set the variant's
! _2 H) T0 a6 C( ]5 L2 i+ h7 l//        type flag to indicate the fact that this variant holds a BSTR. Place the
9 @% G6 ?& I) o) u( N! r//        BSTR into the variant structure.
( }; m! k; \. J" `" l, |
% v* J5 m8 X7 j2 A9 d% X        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);  T8 W' V- M: _' G9 f
       
, i6 V* y; U# z. a5 M6 v         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
) F: @- d3 A# C+ F; b7 A' h$ N        VariantInit(&requestVariant[0]);
8 r! w  h& H0 ], E. a0 M! o7 s) F' P9 J        requestVariant[0].vt                 = VT_BSTR;: A- T9 `" O& k
        requestVariant[0].bstrVal         = itemStr;
% c) ]1 G1 c+ t( J' N. O" q) y; c8 Q$ C0 t! h6 [
          topicStr                                         = SysAllocString((WCHAR *) L"system");
& d5 j/ v5 G) i        VariantInit(&requestVariant[1]); 3 p/ y0 U0 b' U) H
        requestVariant[1].vt                 = VT_BSTR;
. b: L7 t2 f3 I1 x+ i. j* b5 T        requestVariant[1].bstrVal         = topicStr;
2 R* n& n* x5 n5 j) ]% P
4 `9 E0 E2 r$ L& b* @3 V( H! y  U1 Y//        Set the DISPPARAMS structure that holds the variant.5 y0 N* o8 G$ q/ L( Y

5 x! ]: B) Z6 E* o' g        dp2.rgvarg                                         = requestVariant;2 |$ C; y8 w* k2 y- Q
        dp2.cArgs                                         = 2;
% e' |" i0 E7 |- @; K; L6 p# S        dp2.rgdispidNamedArgs                 = NULL;
  e# ]) q0 {; M, y: q" g) K        dp2.cNamedArgs                                 = 0;( N% A9 S) K; y8 _

3 f+ ~( E4 o) e1 S; x: X         var.vt = VT_EMPTY;
5 R, U. {1 l/ Q/ w/ f5 U
6 j& B+ K- D) y# R& O' h//        Call IDispatch::Invoke()9 I% c4 N+ g, e! D/ A4 k, O

& w+ Z* {* ?2 ?  E0 [. q) t        hr = m_pDisp->Invoke() B; H2 m/ _0 `
                requestID,
' M; r9 ]; A" @5 ^4 c) t1 m  V                IID_NULL,6 X  ~. a1 t) @3 Z
                LOCALE_SYSTEM_DEFAULT,
. q/ Q3 p" n' P0 Z4 C8 L) Y                DISPATCH_METHOD,/ [6 _; f# T; ?- U# d; J2 h
                &dp2,2 |; s; z% Q6 K! K5 m% G
                &var,) c" Q0 L. q4 F6 [
                &ei,0 Z9 Z. i- j- k% G4 i4 A
                &uiErr);/ {" c. a8 @+ a5 J$ p* h

( o8 W) r* x$ B# z9 q+ q        SysFreeString(topicStr);5 y6 G+ m  p% ~4 G/ `
        SysFreeString(itemStr);6 i* x0 X' j2 G+ Y
请问该程序是获得extend里面的哪个值?4 d9 z/ {+ q9 K' L
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2025-11-21 13:04 , Processed in 0.016593 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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