设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12509|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:1 _' x0 h5 w& m  ]
Name = (WCHAR *) L"Poke";
) G$ `4 O5 ]& `: C, q! u. N2 H                
& g1 T8 B7 P4 R* a* i* L$ g        hr = m_pDisp->GetIDsOfNames (
6 ]+ @; M% ?) u# s. ]3 G4 p4 @                IID_NULL,                                // reserved
& J0 X- v" i$ g/ n                &Name,                                        // Array of names to get IDs for
+ i0 ]% W) T' w: {$ S0 z                1,                                        // # of names in the array
; W6 Z) C2 o- d. {  \8 ]                LOCALE_SYSTEM_DEFAULT,        // System locale' o- j4 s: \% C$ E# z
                &pokeID);                                // Array of IDs to fill on output
5 w! m9 m  e: @  Z                       
& p  C0 v4 I7 o! g6 u8 z        if (hr)
  F8 {) }2 s  c' T# `                {0 a) l8 q6 H0 w3 ^1 i" g9 G
                MessageBox ("Get Poke Unsuccessful");
1 W8 ~; W! e3 v0 K! P6 U* C+ i2 d# |                return;
& M% i8 f. V+ {3 @( l                }
4 p* p- K  N/ y, f, `/ }; ]) Z9 a! i+ Y) |- c  y! Z
/**************************传递数据给extend**************************************/
* N  U7 F" l, L& E/ P, t/ D( V        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
& p: t( l5 B9 J$ E. V       
1 d% Y8 ?9 q$ v$ N- ?0 n0 m6 t         valueStr                                 = SysAllocString((WCHAR *) L"1232");% u( Z0 \8 s8 P9 v- j9 C7 r! n
        VariantInit(&pokeVariant[0]);
/ j7 F3 D' J; B8 C$ _        pokeVariant[0].vt                 = VT_BSTR;: G( S9 ]/ w) R' k
        pokeVariant[0].bstrVal         = valueStr;2 f: [5 C7 c, [2 z

( b- }: {: D! T, P         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");* z  \9 e2 O/ C
        VariantInit(&pokeVariant[1]); & o6 l' G- s1 I
        pokeVariant[1].vt                 = VT_BSTR;8 i% m; {9 Q+ U/ H' p
        pokeVariant[1].bstrVal         = itemStr;! k( F+ n, i% ]9 d
9 [/ y: x' W3 V  {. D
          topicStr                                 = SysAllocString((WCHAR *) L"system");
, _! t+ g  W% ^        VariantInit(&pokeVariant[2]);
- j0 z& P+ i$ n( @        pokeVariant[2].vt                 = VT_BSTR;9 q0 F9 p# S( H2 t) n! Z+ d
        pokeVariant[2].bstrVal         = topicStr;
" n3 p& _1 p' E* P4 Y) i5 O, |1 b) |* O
//        Set the DISPPARAMS structure that holds the variant.( D* r- V3 j* A! E
, f4 r' e2 `1 [" I6 S
        dp.rgvarg                                         = pokeVariant;
! v2 W, G- a9 ^; ^8 D/ S        dp.cArgs                                         = 3;. ^& M) W) t  O: z1 u2 H
        dp.rgdispidNamedArgs                 = NULL;
, k0 ?) A% R* X% `6 `! n! D1 e" d        dp.cNamedArgs                                 = 0;
1 P7 _) W1 y5 I) X" s9 Q- j
! \7 J6 V7 V3 h$ l. K2 p9 K//        Call IDispatch::Invoke()
& R/ a5 i: C+ q  K: @" _, G
8 R8 q) F; S" O& S; `& _        hr = m_pDisp->Invoke(
6 Z# V, T0 m0 x4 E: P3 I                pokeID,8 ]7 z7 C# m7 I  X& R
                IID_NULL,
0 S* r% V5 n) |) A: Y2 u                LOCALE_SYSTEM_DEFAULT,3 B* X  ^9 e& @+ F8 [$ f
                DISPATCH_METHOD,
$ q( J. Q5 P3 `6 s, U/ |                &dp,
( c4 V3 @. F* _2 D/ x                NULL,
* b  {$ F& M# z. ]4 S6 R, b: V                &ei,: A% }5 o# a4 m0 x9 L; B' F
                &uiErr);: v0 U: x% S; l# ?
7 b) C! [! ^+ X
        SysFreeString(topicStr);
# v* H% \  m2 T  _9 ]: E8 I2 Q4 s        SysFreeString(itemStr);
$ H& ?/ I, Y1 f: X2 Z' e. A5 m        SysFreeString(valueStr);
$ E2 I6 h" V9 _5 z0 ~' Q: t2 }/ c0 L: L- x: U/ I
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
, D% S" h0 c2 P# A" n此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
! t2 H: A# c. Y8 p8 d& \4 H$ ?! e/ v* ?2 @0 A& b

# w8 T6 U% n8 [- q2 |2.这是request的程序
# t7 s/ {; Y$ h" i, ]. E8 }; r3 Q//  Request a value from Extend
; q. D0 _& L8 P//+ Z" \8 V9 F! u
//        Initialize the variant that will hold the BSTR.  Set the variant's
' h3 R4 n+ ?2 W5 W# b//        type flag to indicate the fact that this variant holds a BSTR. Place the  e& m8 J; [4 k( v6 E% o. H
//        BSTR into the variant structure.1 A. Z5 @0 D. {" D% a

+ A6 F6 g' |" q  x4 \, {        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
8 [/ `, M. |  G# z        . H) q) u8 A+ W& s, O1 z
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");5 Q1 o# d, x6 H/ N! J9 ^
        VariantInit(&requestVariant[0]);
" |9 E" _: g& c: r# `9 }        requestVariant[0].vt                 = VT_BSTR;, j; M, c: T; G; w" K1 ~. _  a7 ]7 {
        requestVariant[0].bstrVal         = itemStr;
5 _$ z+ M+ v8 ?* I( n, S& e* ?' j+ L! N' G. g. P
          topicStr                                         = SysAllocString((WCHAR *) L"system");
# G3 a; J; ?: L        VariantInit(&requestVariant[1]); ! c% e, X) ^  f+ d6 l! ]
        requestVariant[1].vt                 = VT_BSTR;
! ?' t; E$ e6 t        requestVariant[1].bstrVal         = topicStr;2 E$ R' o/ R: y! M

5 b; t( X0 \& r/ v9 y( M# d//        Set the DISPPARAMS structure that holds the variant.+ `3 [* o& w2 X

- B% G8 B/ X/ p        dp2.rgvarg                                         = requestVariant;
) W( I" t8 Q, G+ s6 Q- \* T        dp2.cArgs                                         = 2;, u" b" a; s% S1 _  G
        dp2.rgdispidNamedArgs                 = NULL;) Q( d! v) E5 e5 R' y  e! ?5 y
        dp2.cNamedArgs                                 = 0;
9 @3 s6 u$ k  K2 _  z+ ?6 a& ~
) k6 e2 Q" h! j/ Q. v2 R# e         var.vt = VT_EMPTY;+ d0 w9 |, W' [$ v7 R2 `. M4 A/ z9 o

# x+ U7 ]/ O/ J% c) \//        Call IDispatch::Invoke()0 D) t% p3 v+ X# ^3 T5 {* N$ {+ e
% x& }/ q, T1 d, y, E. M: f/ C
        hr = m_pDisp->Invoke(
: r# j  O8 q& v! W                requestID,; r( F8 _) k+ b5 {1 A
                IID_NULL,
7 U& ~( i4 i& G( M4 u  B. i, j                LOCALE_SYSTEM_DEFAULT,
# B. w& T% _+ A% v* L& ]9 T                DISPATCH_METHOD,
& t* Y4 Q3 b' H* r                &dp2,
/ c( q6 {. j. @                &var,
$ X/ W. O7 ]! S/ X8 H- ]$ z1 b+ G                &ei,4 q5 M7 i: E* I- ?. ]
                &uiErr);6 m( V: Y/ K3 F& V; V

9 w! ?+ N# r( f6 [# K, S5 ~! m        SysFreeString(topicStr);7 o9 ^/ u& @% c5 w* ?
        SysFreeString(itemStr);
" m* i8 S' ?- [  y& `请问该程序是获得extend里面的哪个值?
/ L4 I& B0 H, W' r/ D如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-16 07:06 , Processed in 0.013943 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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