设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9171|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
- Y2 j6 }" z% _2 _" u7 `Name = (WCHAR *) L"Poke";
/ ?# L: L) @! z$ T7 L, O                
7 r7 p9 k0 X3 g6 h8 b; o        hr = m_pDisp->GetIDsOfNames (- J& d8 A, }. v$ t
                IID_NULL,                                // reserved
: R$ q+ Q/ [+ u3 E. U3 _                &Name,                                        // Array of names to get IDs for
% Q* @8 K7 F+ ]1 g% a                1,                                        // # of names in the array: ]$ c- b2 i0 q# W. f; e. ]
                LOCALE_SYSTEM_DEFAULT,        // System locale- I0 J8 z- j( B
                &pokeID);                                // Array of IDs to fill on output/ F5 X6 @* h: I# n
                        2 |, Z8 o) Q! q
        if (hr)8 K2 r  j2 T9 U8 N
                {! x* P% @# C0 b' A: _  ?
                MessageBox ("Get Poke Unsuccessful");
0 e+ u3 R+ H$ y3 \                return;/ V% s: s% p8 p+ v' R/ S/ j; f
                }
8 A9 C- L* b. _( ?7 W, x) n$ b+ `' J: {$ `7 @' t$ t& L' a  x
/**************************传递数据给extend**************************************/
6 T# C# p% l+ V, B7 L8 u        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);$ p" X9 k9 X7 t- z3 _
       
- c* i, I3 e. N. ?7 G8 T( R         valueStr                                 = SysAllocString((WCHAR *) L"1232");
4 t4 E% {$ y& ^3 {        VariantInit(&pokeVariant[0]);
5 J! C$ n& P( N        pokeVariant[0].vt                 = VT_BSTR;% l) j/ y' J: d  j
        pokeVariant[0].bstrVal         = valueStr;
5 I! L) \! ^3 ^3 ^: G) W0 n
$ X4 V+ M2 _4 w* R% L$ W, S9 \; P         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");$ a- ]! h! `) j5 A4 J2 |2 a+ m" k8 @4 I
        VariantInit(&pokeVariant[1]);
. f1 D2 k  H( Z% v; o        pokeVariant[1].vt                 = VT_BSTR;
' F3 n5 J. R1 X# G        pokeVariant[1].bstrVal         = itemStr;' g# \. d' b) |0 U, u

% f1 s/ Z' m( Y          topicStr                                 = SysAllocString((WCHAR *) L"system");
8 B3 T' Z  c# Q" F        VariantInit(&pokeVariant[2]);
5 ~3 a3 Q9 j0 l: p( B4 l        pokeVariant[2].vt                 = VT_BSTR;4 j! m; ^3 v$ p% Y- _
        pokeVariant[2].bstrVal         = topicStr;
) [3 Z9 A% m4 ^
' t$ p3 H" U) {" M$ U4 I//        Set the DISPPARAMS structure that holds the variant.
/ L3 e4 {! m( t4 ^6 a: h( A1 I; _! H2 e2 N2 h% w' i# O$ m
        dp.rgvarg                                         = pokeVariant;
6 \2 B5 d% }( Z3 m* q0 G$ V, S        dp.cArgs                                         = 3;
0 ]% I" L' k& O8 F( X4 f$ Y7 U        dp.rgdispidNamedArgs                 = NULL;
# S! G+ x! b9 S* e  g        dp.cNamedArgs                                 = 0;* M! p8 c: \9 R! i

+ q; F% R- }7 E) K/ v8 Q//        Call IDispatch::Invoke()
( B# N1 Z% s% `: R; n1 A5 X7 L& f8 a4 Q6 [6 Z) v+ _3 h! @
        hr = m_pDisp->Invoke(
, A2 \$ _5 `3 P* V1 D  C4 @                pokeID,
4 H- c8 W# O+ p/ O& n# u                IID_NULL,$ Q5 H0 X9 y- v  _% S
                LOCALE_SYSTEM_DEFAULT,! N2 z3 i/ p) b# F
                DISPATCH_METHOD,
4 \- Q3 t9 Y* ]9 o                &dp,' ?; f4 k9 N2 y7 k
                NULL,- I. O) E) {) g4 S
                &ei,' o8 Y4 }4 d, c, _# ]  }8 ?5 v7 K
                &uiErr);
- z7 e; l% O+ Y2 Y4 K% j$ ]- H$ r/ z3 j* {8 e0 f: x
        SysFreeString(topicStr);
6 R/ A  ~$ Q& y3 t! T( h3 ?8 ^        SysFreeString(itemStr);+ U  [( ~4 K/ ^( r) l
        SysFreeString(valueStr);8 H. O' k- k8 q  u4 @1 m

# b9 I: m, A4 s( b4 r$ W. U现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
0 S% H3 |9 o0 s# B2 e, r此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????/ i0 q& U7 [9 n1 Y8 O

. ?6 J9 L+ [$ [" u' q; ~
" O& @6 x% G' \) y8 @* r" {2.这是request的程序
8 [+ J) r- n) `( V$ \1 _0 Z! H//  Request a value from Extend9 Y& s9 ?" _/ a% L
//% \6 A# e* x7 E# k+ B, e
//        Initialize the variant that will hold the BSTR.  Set the variant's
$ X" ]+ ]3 h! W, u//        type flag to indicate the fact that this variant holds a BSTR. Place the
7 E4 T. S) D* p* G) g# h) @  g; X//        BSTR into the variant structure.
2 h: ^  b/ t. H7 m/ o
" g6 X2 r4 P* a- v9 l( {4 Y. |1 a        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);. d  |* a5 Y0 S+ u6 t
        1 N; V6 {* v$ T% L$ `
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
5 }. k" d! O' v! n2 |        VariantInit(&requestVariant[0]);
, q$ w% b1 u0 v0 q' m- D        requestVariant[0].vt                 = VT_BSTR;! z' P$ ~* m6 E  r& R
        requestVariant[0].bstrVal         = itemStr;, H1 i  d2 [& M, Y: U
+ c2 {# D4 G+ S
          topicStr                                         = SysAllocString((WCHAR *) L"system");
# ]% w' C6 S6 G0 D! {8 w        VariantInit(&requestVariant[1]);
- M# v  E$ q( L+ q$ P$ B; Q/ m        requestVariant[1].vt                 = VT_BSTR;
# x$ K* ?, p2 L2 r1 e  V$ [, K2 h        requestVariant[1].bstrVal         = topicStr;
! e: m1 D9 w+ u5 r: b  B
! u4 E4 x+ \& p  y6 w& _! G//        Set the DISPPARAMS structure that holds the variant.
& U/ L* t1 M  Q/ F* s! A0 l4 F- [" ^& G9 v2 Y- ^
        dp2.rgvarg                                         = requestVariant;: _: [' U4 k. S" b5 @
        dp2.cArgs                                         = 2;- Q" s' J& G% R( C
        dp2.rgdispidNamedArgs                 = NULL;
5 a  R; |  {" Y+ T7 _; y        dp2.cNamedArgs                                 = 0;
) t4 o! {) `. T: n# Y6 t
6 q$ v9 B1 H7 W/ Z; I         var.vt = VT_EMPTY;
# g$ Y% l9 A- v/ b
; `. k' _7 s% B  Z$ w3 Y. P6 K) @8 f//        Call IDispatch::Invoke()! @2 D& `/ Q  B% q  X
* ?8 r# }0 L4 |
        hr = m_pDisp->Invoke(# q' M) X. D" R4 d
                requestID,
6 d  a! e& f1 G- e  I! e                IID_NULL,
& {# K8 v8 E( M2 E- Q+ _9 K                LOCALE_SYSTEM_DEFAULT,( h" p+ J/ u# r
                DISPATCH_METHOD,
* U7 p% O/ h# o/ M1 L" K# k                &dp2,
3 m& G( Z, D+ y                &var,
6 I! v4 x9 Z6 H* {- C                &ei,- l+ r' a! M2 s# A
                &uiErr);7 j0 m5 w7 Q. m$ S" ]
- {* H8 B0 l# ]$ ^$ K5 P4 G
        SysFreeString(topicStr);3 G1 f4 D. i! E
        SysFreeString(itemStr);
2 s( ^2 p  O+ ^5 K/ \请问该程序是获得extend里面的哪个值?" ~; Z, X& l& c1 `, ^# }( U
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-4-6 13:07 , Processed in 0.013229 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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