设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12331|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
, p) r% i! z8 `+ F' }Name = (WCHAR *) L"Poke";# x7 p1 R# ?* O) e' w$ {" C
                
) O1 F! a/ B" j: C. o0 i. a2 S1 c        hr = m_pDisp->GetIDsOfNames (( D& ?0 L) z7 D1 ]$ `
                IID_NULL,                                // reserved
: ~* _, X: M& V1 r5 k, H                &Name,                                        // Array of names to get IDs for# }3 d! _* n, v, n2 H/ m6 I/ L
                1,                                        // # of names in the array; `8 i  T5 z, g$ K4 H2 a
                LOCALE_SYSTEM_DEFAULT,        // System locale
7 S5 \2 q3 E2 P0 p3 C7 u- g% h                &pokeID);                                // Array of IDs to fill on output  u/ {4 [  H# S' o2 {
                       
* _6 L* G0 q( h+ d        if (hr)
% o: e( q6 r4 Z                {2 \  E( a, W4 I! b$ o+ R7 {
                MessageBox ("Get Poke Unsuccessful");) n! I- [  L; T* _
                return;: t4 z, W/ Q- g# [) c
                }
2 k! e2 a3 y' B! K1 _& J- N7 }! y" U& [* h
/**************************传递数据给extend**************************************/
" g+ r2 w# ~2 y5 }* |        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);+ X0 \3 C: z5 P) u7 T! y
       
9 c, [$ _% c0 z( S% j( ~0 g         valueStr                                 = SysAllocString((WCHAR *) L"1232");" p' I. T& B6 T$ i' x
        VariantInit(&pokeVariant[0]); * ~4 C0 ]$ W' d  _9 O
        pokeVariant[0].vt                 = VT_BSTR;+ O2 E: b1 w- _" A% r, o- R6 r
        pokeVariant[0].bstrVal         = valueStr;
9 ?: B% s$ J6 x4 L
2 K" [4 G2 h: z8 D" u* Q         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");7 e# D" R# m& _: a4 g  I& q( m
        VariantInit(&pokeVariant[1]); % J( P+ T+ [# z% V4 u2 ]
        pokeVariant[1].vt                 = VT_BSTR;) Y- j! c6 J! q6 g5 q7 M3 |3 c
        pokeVariant[1].bstrVal         = itemStr;
) F# P- r/ J: W" B9 J8 F
4 A: @$ v: ?2 t* j' }. p          topicStr                                 = SysAllocString((WCHAR *) L"system");
7 L" r6 ^- I. C        VariantInit(&pokeVariant[2]);
/ |6 o4 |) z5 b* {        pokeVariant[2].vt                 = VT_BSTR;
4 U- |  b. s: w+ i* [        pokeVariant[2].bstrVal         = topicStr;
( ~; D" E' }* @
2 P: u8 m% D0 N//        Set the DISPPARAMS structure that holds the variant.
  U2 Z  K* d# J, O( S/ S. r
( V, U0 _6 j, Z7 z0 y        dp.rgvarg                                         = pokeVariant;
& w3 I, q/ h3 ?, V        dp.cArgs                                         = 3;
; I0 y$ F* E# {+ C        dp.rgdispidNamedArgs                 = NULL;9 ^$ K( g8 X/ |* F) d
        dp.cNamedArgs                                 = 0;! l/ D" \+ _; z, a; b0 S
& ]# n% y9 j% s5 i! B* |
//        Call IDispatch::Invoke()5 I8 \& Y. w) n  K6 u& P$ W

" K' i9 E4 G2 \! E% T9 U        hr = m_pDisp->Invoke(
8 B0 O) p& @/ {6 O3 G( s, s                pokeID,0 t5 m: ?( K5 T( j
                IID_NULL,1 r/ q. |' ^0 q! L  T3 _+ J) J! `
                LOCALE_SYSTEM_DEFAULT,  g: v9 ^: N2 b' u) e
                DISPATCH_METHOD,
& k  r+ A# O$ _$ V, b8 n                &dp,( J. z: t+ `7 ^( G
                NULL,
' A* z7 ~6 `8 K1 G) L, X                &ei,* w$ G" U& [. C9 n% d- _
                &uiErr);& l- ?: J' ]. B
$ l% y: v( u, V3 a
        SysFreeString(topicStr);
! K+ ~: p: m% V! x; h  f# z        SysFreeString(itemStr);
+ X: a2 p* q- d+ c. X$ l/ w! }        SysFreeString(valueStr);
0 w5 f% J% z6 k# H9 P) h$ I; i  M9 S% i2 L! P
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???  a7 |& L2 X) R$ {0 v
此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????# K( X# z/ w- X; {" e8 i

$ Y: o. a. d. s' I0 t" H: T1 r2 V3 G1 W# {( M# P  D
2.这是request的程序
! o; Z" o" X- v1 L0 p//  Request a value from Extend
6 w! t2 w$ N. m9 p/ B; q3 v* M* B3 [//2 A1 p' F/ P1 h5 A* z- k
//        Initialize the variant that will hold the BSTR.  Set the variant's& n+ E6 g. v1 X- ^0 d
//        type flag to indicate the fact that this variant holds a BSTR. Place the" G7 Y4 E- g* `2 p8 k7 y
//        BSTR into the variant structure.
. s/ G% D9 V: D" I$ u# }( \. F- v, A' D+ ]- G) r+ m# W
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);% }* z9 o0 m* c: a; [0 i! E! |
       
+ x% C" [2 y$ O) U* S. o! z9 E+ R         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");* R' H0 J. A" ^0 T* l
        VariantInit(&requestVariant[0]); ! L* q( K" t. m- J4 A5 b0 T8 c
        requestVariant[0].vt                 = VT_BSTR;
' w# H- c$ q( Z! ?* o0 M7 r        requestVariant[0].bstrVal         = itemStr;; |& Z/ j/ w# x& D2 D$ b

6 M+ Q, }# m# M8 X          topicStr                                         = SysAllocString((WCHAR *) L"system");
8 V) J1 Q4 K' i        VariantInit(&requestVariant[1]); / r- k! G' I- q1 G
        requestVariant[1].vt                 = VT_BSTR;
6 L. t+ K" K  w0 m, A- ?        requestVariant[1].bstrVal         = topicStr;7 v( t! O& o  {  I) q# e; ?
) C5 V8 H" n, j
//        Set the DISPPARAMS structure that holds the variant.& l0 C5 ]; j4 j2 G6 f

. k0 R# \; m! g' n# b) Q        dp2.rgvarg                                         = requestVariant;# A7 P6 W9 ?5 X8 w
        dp2.cArgs                                         = 2;: J, M5 N) z* U. C- |
        dp2.rgdispidNamedArgs                 = NULL;
! r2 a# |0 m  y/ p: M        dp2.cNamedArgs                                 = 0;
) U+ O- V* i+ ]: Y7 J* g9 V0 {1 D( s6 u# c8 P* F" p+ |
        var.vt = VT_EMPTY;
  T% |$ @* Q; |5 B' d9 k* q2 U' ~4 [  m/ k
//        Call IDispatch::Invoke()
5 H' e4 ]1 L2 Q5 \
% O& ~" T: I* {. i/ d7 X        hr = m_pDisp->Invoke(! F2 s- f* [) Y7 d
                requestID,
9 T2 E2 M  |* U, {& N$ w# G                IID_NULL,
' U: _& ~5 O  Z& e                LOCALE_SYSTEM_DEFAULT,8 \; y& Y$ Y! f! l4 F3 W1 Z
                DISPATCH_METHOD,1 @& O/ ^7 ~: l2 e5 m" M
                &dp2,
( a; ~  c7 n1 G/ K" W9 T                &var,
, v: j* w1 ?( O/ x+ l. U                &ei,
, K6 ~, U& j5 q; w! w; o                &uiErr);
, u4 [( d% J' R2 z) z+ o/ ~' @, W/ E+ y3 R5 P( U
        SysFreeString(topicStr);0 B" W, d& O# L9 r" \- o" K8 S
        SysFreeString(itemStr);# P) \- ?2 I$ D* c6 ?4 g
请问该程序是获得extend里面的哪个值?8 U% R/ V' L( N0 k3 @
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-8-8 01:50 , Processed in 0.016539 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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