设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7253|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:) q& D! d1 i2 r+ |( B7 G" j9 `
Name = (WCHAR *) L"Poke";
0 b5 c& U' l6 ?3 v- i4 Q8 [                
5 n. d; o" g( b- \        hr = m_pDisp->GetIDsOfNames (
9 L/ r% T' Z# o4 ]& T                IID_NULL,                                // reserved( \! P, l- x5 ?; V
                &Name,                                        // Array of names to get IDs for$ z7 z" p9 ]  X1 ?9 l
                1,                                        // # of names in the array, K9 |0 `& T  i/ x9 t% r
                LOCALE_SYSTEM_DEFAULT,        // System locale
& q! i: N+ O/ W7 Q8 `) I                &pokeID);                                // Array of IDs to fill on output% i9 t1 w3 v4 |& F" B% s
                       
; c- x* |( P( o" _0 F. ~) V        if (hr)
2 `7 H0 z% Z+ O2 }( L# f6 E7 C                {3 j( q! S3 \# p# p' F2 y3 E
                MessageBox ("Get Poke Unsuccessful");/ _6 Q$ v) }7 l3 f) `4 e
                return;3 |7 g, }" M# _/ J! i4 `  u* c
                }
/ U# H1 \6 N0 n' `9 Z5 h) h
1 T1 R$ C* R  U7 u/**************************传递数据给extend**************************************/1 W3 c9 @: }# f7 P' j
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
" }1 A0 l0 l7 J+ D       
* q' U7 _" e( G/ C3 e         valueStr                                 = SysAllocString((WCHAR *) L"1232");
% B. {2 a& Y$ E1 ^; j+ t        VariantInit(&pokeVariant[0]); $ y& B. F8 v3 Y* H$ v
        pokeVariant[0].vt                 = VT_BSTR;- B' n3 k0 @' j! G
        pokeVariant[0].bstrVal         = valueStr;6 e; K# `# D+ L5 ?

+ v! n) L5 z2 W6 k/ T0 _         itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
# C0 g6 j- {/ ^3 {/ y8 W        VariantInit(&pokeVariant[1]); 9 U( Z4 z$ h4 K  \% m! [& v
        pokeVariant[1].vt                 = VT_BSTR;
5 j0 W8 c0 E; L) E1 a        pokeVariant[1].bstrVal         = itemStr;0 Z4 \8 @1 M) M+ g

9 }+ g& Y" X' Y% n1 i( g          topicStr                                 = SysAllocString((WCHAR *) L"system");
5 \( X9 w  s/ a        VariantInit(&pokeVariant[2]);
% |, C" @7 g3 ^/ e3 M        pokeVariant[2].vt                 = VT_BSTR;
2 J3 [/ y1 x; ?0 E" i        pokeVariant[2].bstrVal         = topicStr;4 v( E- B* ]  _  _. j

( W. ~  S3 ^) M+ }" g  {( K, X//        Set the DISPPARAMS structure that holds the variant.9 ]8 H# G6 Q' H; j5 C% j

& i. y* \  ~6 }: U7 D  c        dp.rgvarg                                         = pokeVariant;
: n! `3 Y% h% m; W7 E3 u8 d- _4 I        dp.cArgs                                         = 3;
3 L6 ]6 A; \, ^* p        dp.rgdispidNamedArgs                 = NULL;& b0 l8 L( t; {& ?
        dp.cNamedArgs                                 = 0;
+ B% C" C# {+ v/ {) L8 L% [0 F9 s3 H5 x
//        Call IDispatch::Invoke()' {4 @% e/ X7 f& K
; i1 i3 D- ?$ ?7 y
        hr = m_pDisp->Invoke(5 _+ f# r' L# x9 x$ ?
                pokeID,
% z) K) _& j- _                IID_NULL,4 t+ w0 E+ F/ ^1 i5 J+ V
                LOCALE_SYSTEM_DEFAULT,
9 l" q  K( s1 T$ H                DISPATCH_METHOD,( R) z4 Q# T! `
                &dp,) M6 S0 d& L! ]
                NULL,
4 L. x6 a2 P) ^                &ei,- J" V( e' S: L9 y8 w1 x9 l
                &uiErr);! L- O% a! R! v' v- U

  C9 {7 I2 s( Z) t( q        SysFreeString(topicStr);
% g3 m  p: t! M' ]4 x. z- |3 F& v        SysFreeString(itemStr);' Z. d2 n8 C3 v: O! @: Y) B5 n
        SysFreeString(valueStr);$ E- z" d8 N) K% [3 Z, K
2 w: ^( A5 L' C2 M
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
! m/ T9 {* g. a  X. j7 g此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????
  p; v3 A  h3 ~4 A) }) |3 F( K; N% ^  G% M$ t7 [4 w$ m0 V' B

% u, A% K0 E9 j' X9 x2.这是request的程序
0 T5 w9 J5 p" o' e6 [$ e//  Request a value from Extend: b# E4 A: f0 J; j0 t
//
. |+ V8 {  r6 g! [& W! K//        Initialize the variant that will hold the BSTR.  Set the variant's
* Z- X+ R2 c: n& y, Z9 G1 `//        type flag to indicate the fact that this variant holds a BSTR. Place the
6 `" W' {% a1 z: f//        BSTR into the variant structure.
/ ~$ N+ P+ ]1 r9 H# |+ C, Q: H
# n- B3 H+ j2 ?. X        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);3 X4 Z3 |- z9 ]. B- K
        9 [' z3 {9 @! x; o
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");9 N- a4 L2 F! f
        VariantInit(&requestVariant[0]); 8 e, v7 T5 n* @$ Y9 s* ]2 Y
        requestVariant[0].vt                 = VT_BSTR;( L8 ?! ~. o. C& \0 w0 d/ \
        requestVariant[0].bstrVal         = itemStr;
; l' d' e$ s  o7 G
6 c6 f& v: g  P6 U0 w# N          topicStr                                         = SysAllocString((WCHAR *) L"system");7 {9 p- d3 k- m% E, E0 u
        VariantInit(&requestVariant[1]); 3 P/ e2 s( q- J
        requestVariant[1].vt                 = VT_BSTR;' i1 u" b& i% D5 ]0 c- J" ]
        requestVariant[1].bstrVal         = topicStr;; y6 R/ E% P$ t( B( z5 t2 b

7 p* V& b# c; U/ K( h//        Set the DISPPARAMS structure that holds the variant.
  A) u' R9 a  Y- `( P9 C0 _; T* D3 {+ j3 E
        dp2.rgvarg                                         = requestVariant;" ~. x/ p+ G$ D% B! Q
        dp2.cArgs                                         = 2;
; M; K8 M" E( v2 O6 a* ^        dp2.rgdispidNamedArgs                 = NULL;$ v0 I, w  f5 l+ b2 j, \2 K
        dp2.cNamedArgs                                 = 0;
, ]0 s5 O/ @* }- b
" A( h% |' h1 A, p6 l         var.vt = VT_EMPTY;
* l+ C0 v) P9 v# ?3 n" c5 E3 M7 B, q7 S; J
//        Call IDispatch::Invoke()
' t7 `3 e  B7 s! q1 c1 j& o; X4 @# {2 U% t; N
        hr = m_pDisp->Invoke(
$ x1 X( \5 q, s1 I8 N- F                requestID,0 S0 ], k3 n" S+ h/ r8 m
                IID_NULL,) ]5 b' l3 s" C: o2 T: F
                LOCALE_SYSTEM_DEFAULT,
# S% Y- s% y* k" b6 A                DISPATCH_METHOD,
+ ^* \0 p; s* u( i# P. \/ b1 x4 l                &dp2,
2 x, w/ U$ c( Q                &var,
( C+ f) Z) S+ @+ c1 \- `# w1 }                &ei," z9 i% X& n/ A  U
                &uiErr);. |; J. `' Y5 T: E2 j1 O1 S

& f# I" e- l$ ]7 H5 V6 x) V2 ]( g        SysFreeString(topicStr);
; B( y& ~2 A4 k$ Q- W* Z        SysFreeString(itemStr);
8 ^, f6 [) e- S- n/ f! V& `/ R$ n请问该程序是获得extend里面的哪个值?
0 \- @% c4 K* C如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-1-9 17:41 , Processed in 0.014630 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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