设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7866|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
/ D. N/ Z3 e+ l) M/ {Name = (WCHAR *) L"Poke";' {: F0 q; R2 X& j6 n
                 1 w4 \: |. B: M/ e9 |
        hr = m_pDisp->GetIDsOfNames (
1 z5 x3 z9 ^2 j' a1 }                IID_NULL,                                // reserved
+ h9 w9 t) D& }3 R  I: y                &Name,                                        // Array of names to get IDs for' A/ h9 L6 n. l( o8 h
                1,                                        // # of names in the array6 [  D: Z& F' P/ U
                LOCALE_SYSTEM_DEFAULT,        // System locale
3 w5 n; A, C4 }. q7 g                &pokeID);                                // Array of IDs to fill on output
6 r: a' O% V3 {, o! ^3 i/ Z; u                       
7 V8 s6 x; h% ?, B( h        if (hr)
! m3 c" j& {7 Y9 b. I" h; z                {
$ o) O$ ^0 O( u                MessageBox ("Get Poke Unsuccessful");
4 K; \6 ?2 g, [8 X$ w                return;, I! Z9 H+ G; M- b
                }- v7 O" x& J( n7 Y, u; z! X0 a( P$ D
) |& `4 Y0 G/ Y* F2 m
/**************************传递数据给extend**************************************/  L1 H- W' M8 E" w
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);/ v4 e( q6 c) [5 G
       
3 }3 J2 n& ^8 D/ _( A7 R3 s9 |         valueStr                                 = SysAllocString((WCHAR *) L"1232");
5 n2 {6 Y) G0 h+ c( |: S) ^        VariantInit(&pokeVariant[0]);
) {  |4 ]$ l0 u! Y) y        pokeVariant[0].vt                 = VT_BSTR;8 z3 a. f- t& u6 \' H% o. V: }
        pokeVariant[0].bstrVal         = valueStr;7 x4 ?# A$ ^! E0 D- }
- x% [  s' b: `' a
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");! i; C9 G5 j; |( g6 E; z
        VariantInit(&pokeVariant[1]); ! R9 A0 v- p! e. u+ L% I; Q
        pokeVariant[1].vt                 = VT_BSTR;+ k6 c* \0 a$ C' V6 h! c
        pokeVariant[1].bstrVal         = itemStr;. y) H4 o- P9 ?4 b8 s# z7 y
. w* u/ F$ v- ^3 Q- J# _; f
          topicStr                                 = SysAllocString((WCHAR *) L"system");
; n& U2 _, g& Z' O# \. `' v        VariantInit(&pokeVariant[2]);
4 C. [. b6 G! w$ W1 C        pokeVariant[2].vt                 = VT_BSTR;/ w8 ?7 X* \) m0 h" f  E
        pokeVariant[2].bstrVal         = topicStr;
+ j# \/ E2 b! I! i+ F$ t! U  Q$ P- x
: e; t% W, L8 @+ X//        Set the DISPPARAMS structure that holds the variant.
) u; R3 x5 p; f+ d1 U% I0 K5 x& M; g2 Q4 N" B) r0 V6 o" I: j, J
        dp.rgvarg                                         = pokeVariant;
! v3 n' H4 n5 J        dp.cArgs                                         = 3;
! t8 b: G% w8 y$ u2 I        dp.rgdispidNamedArgs                 = NULL;
$ \2 ~4 c3 d% x, |$ y        dp.cNamedArgs                                 = 0;
! Q5 @( Q3 j, @7 r6 N1 i8 }  f' B. ]; k" I# M
//        Call IDispatch::Invoke()! T7 E6 L1 I) g

5 u) ^9 _7 }; N8 K( _. z) y        hr = m_pDisp->Invoke(, n  z5 W* w! T4 Z, O) ^
                pokeID,
8 `& h$ d$ u/ t& m! d                IID_NULL,
$ [) K1 h9 A9 m- Q! c& L. [                LOCALE_SYSTEM_DEFAULT,, R( m& D; ~7 q% R
                DISPATCH_METHOD,* L1 Z+ j2 D' t) G4 V
                &dp,& ^8 u. p" f) R+ F  J$ g6 n
                NULL,
# {8 l2 {/ ~% [                &ei,7 R# Q( I4 g3 w5 N
                &uiErr);
; s6 n, }3 f; L# O. n9 B% `0 ]# m& p; Z" l1 p
        SysFreeString(topicStr);
$ N' d6 j1 H9 _7 s        SysFreeString(itemStr);0 c; t2 Z" [. g2 J+ k
        SysFreeString(valueStr);5 u8 A/ W5 x2 P
8 i4 o% O1 ^5 {+ G) m: |
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???# ~; t, I: l7 A& Y+ b. n
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????! B0 E6 N. |- A$ j; B
6 h; h$ y$ a! F

0 ~8 ~7 L3 Y0 p2.这是request的程序& x$ v" L" y" z! E% T/ V
//  Request a value from Extend
+ `) v3 ~- g6 D( P/ B  F5 O//9 C; ~; F$ W' K0 f% _
//        Initialize the variant that will hold the BSTR.  Set the variant's
' _- m1 w6 x+ j" @( \//        type flag to indicate the fact that this variant holds a BSTR. Place the
7 H5 y0 }0 S6 a% ^# ~; H7 ~//        BSTR into the variant structure.
0 E8 W! p0 `# v* Q1 d& a$ o" Q" V! q9 V& R
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
2 ]% K. r" v) a- c5 T       
3 ^, J& h$ D* t. r2 E- @5 S& i         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");( x9 n+ E7 [6 |2 z) K
        VariantInit(&requestVariant[0]); / S5 J8 ]- y% t8 }1 A- G
        requestVariant[0].vt                 = VT_BSTR;) z8 ^# X. Y2 N# ~2 K; |" f1 \, u8 o
        requestVariant[0].bstrVal         = itemStr;; n- E' G1 _9 T9 i9 o
+ T1 }2 X) T8 G" |. l" M
          topicStr                                         = SysAllocString((WCHAR *) L"system");& H2 ^& P) h8 A1 X
        VariantInit(&requestVariant[1]);
4 X9 B2 @  P+ C2 [3 O: o  W        requestVariant[1].vt                 = VT_BSTR;
- `1 s" f( y. ~! B5 `- h. }        requestVariant[1].bstrVal         = topicStr;) d1 c9 u& f! b: g$ S2 N  J6 X; L

( N' g* x& n# V//        Set the DISPPARAMS structure that holds the variant.
& E  I' j# s  c: z7 f- ~5 A7 B. R* S% \
        dp2.rgvarg                                         = requestVariant;9 |5 }+ H* h& `
        dp2.cArgs                                         = 2;
: z- P; ~0 j7 j6 Q( c        dp2.rgdispidNamedArgs                 = NULL;) S/ `, ^2 [: r9 T. C
        dp2.cNamedArgs                                 = 0;1 W; y2 x, Q. l

+ \* J  `/ c2 I8 s         var.vt = VT_EMPTY;
# }- F7 w8 O1 A9 r
% ^3 f  t3 D$ z; k& e, ]0 M//        Call IDispatch::Invoke()! W! ], S. S( c! m; A
8 K8 K8 O  }5 |- X  E+ j5 A  N6 N
        hr = m_pDisp->Invoke(
& n6 @, F. Y/ I# g# [                requestID,
) h, o; A! Z, i! U9 d; {: R                IID_NULL,
$ J7 K$ |) f, A                LOCALE_SYSTEM_DEFAULT,
; Y  P& B$ ~3 v; V                DISPATCH_METHOD,! Y/ v* ~5 h  H" s4 k& U
                &dp2,
& X/ y" L( w; T                &var,
8 W7 A5 G; S! b: b8 |  z                &ei,0 e5 u. R& f. l/ V% s# f3 E
                &uiErr);
! [6 ~" \2 G; H6 c
  K6 N' ?9 H9 D        SysFreeString(topicStr);" w. \4 L6 N# W' b
        SysFreeString(itemStr);7 r- `% {+ W8 z% T% e9 [
请问该程序是获得extend里面的哪个值?
# g5 A, o* U8 V如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-5 14:33 , Processed in 0.017433 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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