设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13031|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
% m% I9 T1 C2 t5 n+ YName = (WCHAR *) L"Poke";# D2 H& s  `+ a% h( `
                 . {" K+ N1 }+ z! B
        hr = m_pDisp->GetIDsOfNames (! N$ O8 F# k* c" d
                IID_NULL,                                // reserved
3 Y* @+ h* a3 Z2 ]' d                &Name,                                        // Array of names to get IDs for) t6 {# m7 P, D. T, u( j
                1,                                        // # of names in the array
( g& S+ w- s" l2 k5 A% q                LOCALE_SYSTEM_DEFAULT,        // System locale' K4 r9 W: Q2 }
                &pokeID);                                // Array of IDs to fill on output
  Q, @0 @/ M, G7 u7 ]                        % H3 ]1 \/ d  R3 Y
        if (hr)
/ U* T2 B, l" s% P" g                {
) N$ {( R2 \, j& \5 P: x                MessageBox ("Get Poke Unsuccessful");) c1 d. o- ~) @  }8 a/ C: R
                return;$ @' C* F0 V5 U* T+ N
                }
0 q1 [7 ^5 B7 F& q& t  l1 N" h# Z# D% A& B3 V* e
/**************************传递数据给extend**************************************/
  }! }) M9 O4 e# O6 z0 K2 J4 ~! G        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);( {( ~' i7 P% E0 i8 M4 U" T/ {1 ]0 ~
       
2 g% q# N: v+ V         valueStr                                 = SysAllocString((WCHAR *) L"1232");
, `9 s8 E+ W( I" N: u        VariantInit(&pokeVariant[0]); . n" X5 D1 K5 o, G: O) D
        pokeVariant[0].vt                 = VT_BSTR;
' C1 z0 K- A( G$ S7 U        pokeVariant[0].bstrVal         = valueStr;, o( q: a5 W+ `1 v& @. v4 Y
/ P+ C  N* G/ q  @+ {% U
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");+ l& J! J! |( q2 N0 R$ z7 c& M
        VariantInit(&pokeVariant[1]);
6 P1 [7 \3 ^! z# i6 w) l5 `4 j        pokeVariant[1].vt                 = VT_BSTR;
  s" R2 M4 C* I        pokeVariant[1].bstrVal         = itemStr;
6 e9 A5 Z$ i  B' o; x. E4 V
0 j$ n! r$ f- D3 O' a          topicStr                                 = SysAllocString((WCHAR *) L"system");
6 N9 d5 d) d5 I0 N+ a% Y- T) L        VariantInit(&pokeVariant[2]); 5 J5 S2 E8 C; F7 @8 X
        pokeVariant[2].vt                 = VT_BSTR;
3 T" |& y3 q2 J  o" t        pokeVariant[2].bstrVal         = topicStr;
4 `/ \4 j% j" Z1 ~) r7 N
0 n- G, I& `8 O, _" Y//        Set the DISPPARAMS structure that holds the variant.
3 w* Z' S" v( T! R6 @
5 ~( K% b3 g. K6 z, m, s2 J& e        dp.rgvarg                                         = pokeVariant;& U  v  k: u) s6 E4 R& G
        dp.cArgs                                         = 3;2 K% n9 H" i) z7 @3 N. }
        dp.rgdispidNamedArgs                 = NULL;
  }, k; E% s# m6 X/ Q- ^+ y        dp.cNamedArgs                                 = 0;
! r8 J4 V: h) @) ~% k% y7 u/ [- N+ ~4 |
//        Call IDispatch::Invoke()
/ c9 D5 B( h3 |# }% L6 D9 A% W$ U
/ j4 \6 C( f! K1 p        hr = m_pDisp->Invoke(
& z) F4 q% D! b( y# A/ l6 p, p                pokeID,
3 D9 G3 ^4 u3 p! O                IID_NULL,+ H5 B) I1 H0 H
                LOCALE_SYSTEM_DEFAULT,
+ ]$ }, d) U  n7 \& R7 q: i                DISPATCH_METHOD,
' n+ }8 v% t& m6 C! O+ v" k) m                &dp,
/ p! \' m+ u6 c$ T8 ]                NULL,
, G+ B6 |  |7 z" N; L( r                &ei,
0 m3 N  J$ H$ D/ q7 X4 p1 M. C                &uiErr);
& V/ G5 F1 W5 n- h
" q( F& n9 Z, {! ^7 I3 I' Y        SysFreeString(topicStr);* e- I+ c0 y. P4 ^
        SysFreeString(itemStr);
4 Z9 f. A: R8 {        SysFreeString(valueStr);- {# Q, T4 E: _' p& N5 K+ p4 X0 q

( H- `1 M/ q' p5 ?现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
; t3 a& A0 m" J* h- H此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????$ s" G; k. [% s+ M% |

6 O% n9 M4 P: y/ l1 a: f. ?! y( ], k# D& Y( v6 b5 d- l2 U( {
2.这是request的程序
+ X* ~3 j* t, Y1 e& s& e//  Request a value from Extend
7 F8 g4 m4 r7 m' F" A4 l//
( b0 M' c4 u  s0 I$ R//        Initialize the variant that will hold the BSTR.  Set the variant's5 T5 g7 `5 r' q: W1 \: g' d
//        type flag to indicate the fact that this variant holds a BSTR. Place the
1 p- L" x" y5 w' H//        BSTR into the variant structure.
7 q( r, {% }% Q1 c
3 A  s) l2 O* ~; M        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
! W  }0 V: E, z, D# Z# d# k       
6 j; C( o$ S$ q: |2 t         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
+ _/ o$ Q& L7 t, s/ m        VariantInit(&requestVariant[0]);
1 R8 d- b+ K) H# m8 D9 j% W        requestVariant[0].vt                 = VT_BSTR;
8 A, G, j  G. N" M, [) }. b4 F( f) K        requestVariant[0].bstrVal         = itemStr;) Z" J5 i' T& {+ w! @% F% x

% N9 W- t+ L2 |! U          topicStr                                         = SysAllocString((WCHAR *) L"system");
7 z7 n( v4 u7 H, h, x! S        VariantInit(&requestVariant[1]);
6 T, p) f/ `& _2 g) {        requestVariant[1].vt                 = VT_BSTR;
* ]1 I5 Y3 d: i( I8 z) B" s' k        requestVariant[1].bstrVal         = topicStr;
+ M  S; P7 {3 g% x# v" y' O
+ r( |* @4 r  o2 ]//        Set the DISPPARAMS structure that holds the variant.9 X, F; b2 r* {3 {

" R0 v! w1 I; u2 v9 }        dp2.rgvarg                                         = requestVariant;) |% \( f( M' r- w+ i
        dp2.cArgs                                         = 2;
- a" j  f% Z  M/ m  h        dp2.rgdispidNamedArgs                 = NULL;
$ G: ^0 r, u5 g9 r" s        dp2.cNamedArgs                                 = 0;
# u& k" a# d' ]3 b; L$ x7 r! H
* u  z. w" k7 u- C         var.vt = VT_EMPTY;  @" f9 X3 `8 Q
% }! l9 W0 E8 y( X3 X( |& l
//        Call IDispatch::Invoke()
# d, |  d4 I2 D2 S" ~% s/ D: D
' _5 {. V4 z6 z9 e+ d0 ~" M        hr = m_pDisp->Invoke(
9 a5 Y3 Q4 o2 ^- B9 ^* n" A                requestID,
4 O; I7 j, Z8 O% e# f) z: \                IID_NULL,
% C1 h5 h- a8 C8 w( K6 Z3 j9 K                LOCALE_SYSTEM_DEFAULT,: S. J7 M" a9 p4 r
                DISPATCH_METHOD,3 s# ^. Q, Y; u" E7 o2 n( z/ ^& Y
                &dp2,/ t. ~$ w+ E/ C( H# @1 D
                &var,
2 J' y$ z+ w9 L& g+ i, P$ @                &ei,+ T. Z3 Q7 S% d- L2 V) E; m3 M" M, J
                &uiErr);
; ?& f5 V, s' T) B" r
: g  z' t, c/ E% ~8 o: o7 X, y        SysFreeString(topicStr);
( j, ^1 V, d$ j; w9 l0 F" w: g        SysFreeString(itemStr);
5 O0 ~5 i6 f$ M# X5 g请问该程序是获得extend里面的哪个值?
4 Q. A( c& }4 `" X如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-9-9 20:06 , Processed in 0.012274 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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