设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9188|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:
  b' Z3 N+ M8 H' n; o9 A- pName = (WCHAR *) L"Poke";
% Z! g: K# U/ p0 _4 Z8 O                   \0 ?- O1 D& `
        hr = m_pDisp->GetIDsOfNames (& K/ O/ ]. J7 o5 B: p  r+ R* V
                IID_NULL,                                // reserved2 E5 C1 [8 ]$ U1 J
                &Name,                                        // Array of names to get IDs for' z4 }7 b4 |5 w) c- ~$ J
                1,                                        // # of names in the array3 q: Y8 Z& A6 ~  b0 c9 x
                LOCALE_SYSTEM_DEFAULT,        // System locale
* |/ g( e) d3 h: {) L                &pokeID);                                // Array of IDs to fill on output0 @* _% X( o( L# t) H
                       
( V. l$ `/ v3 K# v/ g1 c        if (hr)
* i0 ?5 n' `5 ^. V                {. b" g/ O1 I+ f0 U# `8 t
                MessageBox ("Get Poke Unsuccessful");
8 [) l$ C) c+ W2 `& C$ c                return;
) {% l. j; u9 q5 A                }# R9 ?6 l7 ^- K: Y* J# W

: r/ `3 x1 z' k3 s, d  l. U/**************************传递数据给extend**************************************/
! \6 J7 A( r  ^- X        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);
8 g' H( O3 V8 ]: _/ d       
9 ^$ P" A5 R# w+ j; S         valueStr                                 = SysAllocString((WCHAR *) L"1232");* w3 v9 J% h7 h7 T, k- ?' v8 W
        VariantInit(&pokeVariant[0]);
, C6 d! |+ Y& i0 f0 X        pokeVariant[0].vt                 = VT_BSTR;) C, R# W2 {: c
        pokeVariant[0].bstrVal         = valueStr;
; |6 D6 ~' d1 q( W& M0 Q6 u/ o6 C& f) C+ R1 }7 W
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
7 u& u+ t: K' A& d, K        VariantInit(&pokeVariant[1]);
" z4 s0 Q3 o8 b3 V! w! i        pokeVariant[1].vt                 = VT_BSTR;: l! F% Y* H' L4 v
        pokeVariant[1].bstrVal         = itemStr;
; c: y$ X9 A9 K9 K+ W
# v7 b/ H: [3 l3 O, L- `          topicStr                                 = SysAllocString((WCHAR *) L"system");9 t( S- u5 ^- S# [9 O- d0 S  l
        VariantInit(&pokeVariant[2]);
; [9 h" o  v& e% I! E& U        pokeVariant[2].vt                 = VT_BSTR;* B4 a" ~) Y7 L8 T; a2 ]# i' o4 t
        pokeVariant[2].bstrVal         = topicStr;
3 y7 W! b5 {; U! {4 P- w3 ?: e, @8 W
8 m+ V* z6 x. V6 b' O3 t. ^: |0 L//        Set the DISPPARAMS structure that holds the variant.5 s, P+ D$ H# x& C, k/ W7 O$ O

5 ~2 v' i2 s5 |6 r/ W        dp.rgvarg                                         = pokeVariant;% Q  [/ G. C+ h6 W' B: ~- R' `
        dp.cArgs                                         = 3;+ F" W9 k& F2 A1 A# g/ S: J* D
        dp.rgdispidNamedArgs                 = NULL;# o- h' j" a/ V2 A/ r9 @! |
        dp.cNamedArgs                                 = 0;
( u  w2 W$ J! x0 R: n- q
5 l* {3 X) _. @- B5 g- b% \  c+ X0 Y//        Call IDispatch::Invoke()7 v* B' ?1 `7 j, D: v) g

) a, @# i0 m1 X1 r7 V9 u& G        hr = m_pDisp->Invoke(
$ O, p* a5 O6 P3 h, ]/ Y/ e                pokeID,
- y8 U2 y4 F5 K/ ^' K+ R( O! `                IID_NULL,+ i) }" t1 U# w
                LOCALE_SYSTEM_DEFAULT,) c+ v3 P& X  p& k
                DISPATCH_METHOD,2 n# A$ h6 D% P% B% f. y1 e. K
                &dp,
; r2 Q1 n# t5 N# H' p                NULL,% k+ k% N4 n" Y/ F! }& j
                &ei,
9 w/ H! a  B/ }2 h! L. q5 _# e                &uiErr);
- X& A; v4 c% F3 F+ r4 q4 \
, k2 ?" K' E1 p        SysFreeString(topicStr);: r+ h0 F' S6 I* k) ?
        SysFreeString(itemStr);
+ N2 j6 J, `- M& m$ D9 [& |, _( j# _        SysFreeString(valueStr);' p4 {! J, ^0 d. ~
" N' ~1 K% e. ~
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
! Z* U2 y% f, M& X: [此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????0 t1 w9 g) L3 n) F, @7 e+ j
4 p* Y$ f1 R5 d; p: Y; i; E

/ i: ?& ?3 \( _2.这是request的程序( k; {* n+ n, Q6 [
//  Request a value from Extend
4 F3 d) y) a3 g6 k$ M/ v3 h- p- \4 B//
0 Q+ o/ [( ]; g7 @0 B3 K//        Initialize the variant that will hold the BSTR.  Set the variant's# `5 q! E# \/ E" j# s
//        type flag to indicate the fact that this variant holds a BSTR. Place the
* {; {$ J# o) o6 ], N. b) c; Z//        BSTR into the variant structure.
( W  \" r8 Y( p) R/ K8 r0 d8 I8 \) O& }* |
        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);& B- h. q$ G3 H9 c# q
        ! `+ x; O) Q5 J
        itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
9 Z. f& p6 r! }1 S0 g! p        VariantInit(&requestVariant[0]); 8 t" N0 h8 w. V3 ~0 T* V5 u1 p
        requestVariant[0].vt                 = VT_BSTR;
: {- _7 ]2 }, n* O: V        requestVariant[0].bstrVal         = itemStr;
+ ?! I7 |: p. [5 @8 {5 l- i( P1 {2 S2 E2 Y$ g' D3 `; v  i
          topicStr                                         = SysAllocString((WCHAR *) L"system");
' E9 p- \5 t3 o9 R/ A% Z6 H: M        VariantInit(&requestVariant[1]);
# R0 L+ u  f( e* i7 ~0 T8 m6 x        requestVariant[1].vt                 = VT_BSTR;
6 y: J' R9 \( u+ s. a, Q. {        requestVariant[1].bstrVal         = topicStr;$ P$ J& v/ W+ {) }
% A: h! ~* A- A
//        Set the DISPPARAMS structure that holds the variant.
0 m1 c- b$ J, I3 Y$ u2 {" w: L+ c' P5 r
        dp2.rgvarg                                         = requestVariant;
0 j: i. u8 b! s) j8 j        dp2.cArgs                                         = 2;( B% a0 j, }6 z7 }' L7 l9 ], p
        dp2.rgdispidNamedArgs                 = NULL;5 G% P9 g+ V, s( S6 U
        dp2.cNamedArgs                                 = 0;
! U% d& G$ g6 v0 l+ t8 T# D$ T* A4 G: U* ~3 D$ W
        var.vt = VT_EMPTY;
. u: z3 O+ z3 |8 V& S  d& l
5 U/ F6 ]6 [$ A, m//        Call IDispatch::Invoke()
- F7 U; w$ P3 D. U
7 \9 I; z9 B" G" i) W+ z        hr = m_pDisp->Invoke(
0 V- k: a$ V* Y$ W                requestID,$ l5 ]) U, }* j6 a0 m5 ^
                IID_NULL,' A$ k$ o' U0 n9 F" p; W3 w- R
                LOCALE_SYSTEM_DEFAULT,
5 i: M( c& u  t                DISPATCH_METHOD,
5 A0 e2 \1 A) f* g                &dp2,
. _+ y* n9 r7 T6 C* X( _7 }% q" l                &var,
4 R) g' _, r- y9 V5 t2 c3 l2 f+ ?                &ei,
" W; B9 \5 w, {, o# O% ^  u# z2 j                &uiErr);/ D  P4 p9 F' s6 l4 L+ j9 k
% m! S( ^  b( {. W! y
        SysFreeString(topicStr);
& i; U9 ?7 o' {! M) ~$ W$ Z        SysFreeString(itemStr);5 [% j) V9 L% R$ d( `
请问该程序是获得extend里面的哪个值?
# J( o+ p4 e( N如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-4-7 07:21 , Processed in 0.018225 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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