设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11257|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:8 K. t' z0 W/ A& j3 P6 f' c
Name = (WCHAR *) L"Poke";
/ K& v7 K$ }- b1 t2 C0 P. G                
+ c' t# ^( E1 }1 @        hr = m_pDisp->GetIDsOfNames (" T. _0 S+ z  `
                IID_NULL,                                // reserved
$ c$ d' L. e& B0 s                &Name,                                        // Array of names to get IDs for
2 H) U1 _# U" B+ S$ T% H6 [                1,                                        // # of names in the array
* N" _! w) {0 G" K0 X$ N                LOCALE_SYSTEM_DEFAULT,        // System locale) w5 t7 N1 @# K8 q9 {5 g' a
                &pokeID);                                // Array of IDs to fill on output& ^2 C3 y- l/ `$ E! {) L* V
                       
2 ^1 e" l" O- j* V6 q* o        if (hr)' A8 D& I  S3 t3 h
                {; o$ D# v$ J* y; N: }. K1 S  C
                MessageBox ("Get Poke Unsuccessful");1 t. Z" G! }( q3 N5 T
                return;; @1 e3 Y& t! Q  l- V; S1 G
                }+ n6 b( |- g3 N! ~4 a! J

$ u- m% b+ f8 z. s# r8 \/**************************传递数据给extend**************************************/3 Z$ S- q- O) L& h4 P; Y2 Y
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);) q: B; |* W1 s7 g  c; ]  ~! x
        3 v7 i$ O5 j9 [. T
        valueStr                                 = SysAllocString((WCHAR *) L"1232");
' G+ g7 Q* b- X. K  ~) e/ i- I- s+ g        VariantInit(&pokeVariant[0]);
* ^8 X% `/ F/ K5 N        pokeVariant[0].vt                 = VT_BSTR;
! D! s$ Q# m7 J2 {4 p: Y        pokeVariant[0].bstrVal         = valueStr;
" l' e) Y/ @( X2 s% S
$ k" j. \; k! r3 Z9 k+ I/ B7 A9 j         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
; r$ M# _5 s7 O        VariantInit(&pokeVariant[1]);
5 l! o: ?& ?1 D8 t$ @: i& a        pokeVariant[1].vt                 = VT_BSTR;
# \* g  n0 S" c) D: E$ K3 t$ k9 v' Y        pokeVariant[1].bstrVal         = itemStr;! r" @, K1 ]4 s% |: f

7 ~- f5 ]" w) j. n! `          topicStr                                 = SysAllocString((WCHAR *) L"system");/ O9 N0 v/ i  D) h+ x6 q  U
        VariantInit(&pokeVariant[2]);
, a) k' V! v+ |        pokeVariant[2].vt                 = VT_BSTR;
6 n8 j8 y4 P7 \8 [& l        pokeVariant[2].bstrVal         = topicStr;
# }6 b, x6 A4 _9 ]5 X& Q; `/ v( D* D1 F# b. i3 r  {. @# M
//        Set the DISPPARAMS structure that holds the variant.
$ J, }. o" l4 H$ j- p7 X; k5 C+ y6 _) n0 \7 V# k3 m# A6 C/ n6 w; b+ A
        dp.rgvarg                                         = pokeVariant;
" v$ I" m( C$ {% t, R  r9 l        dp.cArgs                                         = 3;# u8 `: F9 T2 e
        dp.rgdispidNamedArgs                 = NULL;
# S% z& X6 \1 P4 F! e$ U2 g        dp.cNamedArgs                                 = 0;6 }' l4 A- u" ^5 K

- Y3 ^! S; i. |) \//        Call IDispatch::Invoke()
% T2 F& r5 B1 ~( \
; c. T+ g& W1 W& m) q& V- `0 O9 W        hr = m_pDisp->Invoke(0 t. _" V. ~6 j+ W( G9 B) m
                pokeID,4 u$ Z1 W: f. F5 I4 |5 K
                IID_NULL,
% N6 y/ r  i9 ?5 u7 |                LOCALE_SYSTEM_DEFAULT,
! F  v& O, y/ v                DISPATCH_METHOD,  ^! |" \( M) c. {& ^4 N0 R* M
                &dp,$ J5 H+ X- N' k  h" Q. x
                NULL,3 Z' C3 k/ t( ~! x- L
                &ei,2 z: Y: G! r, H# p
                &uiErr);
) K! |4 e5 Z) r7 D5 [: m9 W
. t% {; Y& K5 N( K0 F$ J: _" W        SysFreeString(topicStr);
+ ?, `2 S! F9 z        SysFreeString(itemStr);
/ v  y$ S! w1 p; E- H        SysFreeString(valueStr);0 x* @  \5 u' O4 g2 E
+ B) I% i, d$ |: \# f
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???. D% m0 d" }7 l' j$ o
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
0 y' p' P8 t2 y5 t- W) f* v' @& o) h! P) L9 J% e. [$ J% Q/ R
4 I7 L& ]7 a% ^/ I& d( Q
2.这是request的程序! w: v5 T& H$ I1 `/ }$ R2 Y
//  Request a value from Extend
* l; }/ P% ?$ v5 K, Q. a% {//, O; m! a6 ?5 X: d) K
//        Initialize the variant that will hold the BSTR.  Set the variant's2 C0 l+ u: u" g4 P+ K0 I6 T) E
//        type flag to indicate the fact that this variant holds a BSTR. Place the
% j1 P5 c  H$ {9 t4 q$ U! s" M% q//        BSTR into the variant structure.! c4 @6 @  X" y! c6 X
3 f6 V3 U' S. L% B2 ]' \
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
% }: d* R% m8 X+ F3 l        # J4 P7 G/ }$ P  w& V# C
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");4 k9 m: R5 v7 f) ?
        VariantInit(&requestVariant[0]);
# H7 ?  l9 o8 j( K8 ^$ Z        requestVariant[0].vt                 = VT_BSTR;7 C% N+ J( T2 l8 [
        requestVariant[0].bstrVal         = itemStr;
5 a; D! R8 K; O( ~/ V5 G% m7 ~7 }* z
          topicStr                                         = SysAllocString((WCHAR *) L"system");
( s2 U% A7 S, n) K6 ?        VariantInit(&requestVariant[1]);
5 m* w2 c$ I; |        requestVariant[1].vt                 = VT_BSTR;0 A! t( C' x( v! E! I' G' Y# @& A3 x  |* D
        requestVariant[1].bstrVal         = topicStr;
4 ^1 b  q# e7 l* s* W
: f( l5 F/ M) z//        Set the DISPPARAMS structure that holds the variant.
; l3 X2 ~7 I, y
9 F" q1 B. @% w% ~        dp2.rgvarg                                         = requestVariant;  i# a1 E8 G- E2 L9 e
        dp2.cArgs                                         = 2;5 q2 V8 u0 x# t
        dp2.rgdispidNamedArgs                 = NULL;3 D# j- h3 p2 g' S, q
        dp2.cNamedArgs                                 = 0;3 R! b5 M* c/ w6 I

/ ?6 ]/ C. a# ]         var.vt = VT_EMPTY;2 P+ P6 z/ y, V, j  Q% @- n; ~
6 D6 O4 \# z6 A) W
//        Call IDispatch::Invoke()! r2 j7 ^& P9 `! z: w! }! b

8 ^7 j: Q9 T4 m        hr = m_pDisp->Invoke(1 D1 ]( e! K( B$ Z4 }* k+ s. Q. R
                requestID,
" I+ Y' j+ c! d7 N# Y) U$ @                IID_NULL,3 f% O$ g; V' V) b) B
                LOCALE_SYSTEM_DEFAULT,
2 n. \( t, ], Z& ?# P                DISPATCH_METHOD,
6 B6 @: g& O2 \5 r0 p3 K                &dp2,0 U" H* {# |4 K* N! p: M  D
                &var,
: p1 S, x2 \2 e$ b5 ?1 V                &ei,4 g/ E; E# a& }( a* O3 P) f( E
                &uiErr);0 k. z9 M2 R; C  I+ f
0 j8 h4 x' M6 i# ^
        SysFreeString(topicStr);
$ l; t" n$ S8 _5 C/ V% c        SysFreeString(itemStr);
! V1 z- s; V9 c请问该程序是获得extend里面的哪个值?
# Y7 t4 K/ H0 j- @- W4 B* [% S如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-7-4 00:23 , Processed in 0.014832 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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