设为首页收藏本站

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

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7793|回复: 0

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

[复制链接]
发表于 2008-11-25 19:37:03 | 显示全部楼层 |阅读模式
5仿真币
我现在用c++编写了一个程序,希望能够和extend交换数据,以及自动对extend进行一些操作。我参阅了例子里的关于OLE AUTOMATION方面的c++程序,但搞得不是很懂。比如说,c++程序向extend发送一个数据:2 E% z& K( f; N0 x5 r7 P2 g! h2 Z
Name = (WCHAR *) L"Poke";8 Q* }$ q6 Q" A6 P2 s4 a
                 & U# F/ C6 `0 e$ q
        hr = m_pDisp->GetIDsOfNames (6 C& j4 B% D" ?6 p( E$ v! i& P
                IID_NULL,                                // reserved
) D) R6 G9 \7 g2 w# {) H  G3 P                &Name,                                        // Array of names to get IDs for9 C* H  }* Q% J4 i6 {
                1,                                        // # of names in the array4 d6 O/ J7 Q6 T9 |5 ~
                LOCALE_SYSTEM_DEFAULT,        // System locale/ L: v% q6 F8 B' [& a6 a; g+ I8 C
                &pokeID);                                // Array of IDs to fill on output) L7 Y! k  r0 N2 E, \8 U
                       
1 i! ^7 X$ ?; v        if (hr)
/ {0 _. J% |/ [' a" e1 W# }                {
$ j# [2 R( u6 `, x1 C) \                MessageBox ("Get Poke Unsuccessful");' |( \. F; ?1 K, J) x7 n
                return;
' k6 H6 @0 _5 Q" O                }
+ F- Y( N; ?; N
7 E% d9 Q* Z; k2 m, Y/**************************传递数据给extend**************************************/8 d7 B0 e* M( [8 W% ]* _
        pokeVariant                         = (VARIANTARG *)malloc(sizeof(VARIANTARG) *3);% Q7 a5 G& B. q
        / |3 z: J2 l; d' E& F, \
        valueStr                                 = SysAllocString((WCHAR *) L"1232");- ?+ w3 J4 l6 O2 y) Q
        VariantInit(&pokeVariant[0]); ) I0 |2 A) y3 n1 p8 [3 K6 S
        pokeVariant[0].vt                 = VT_BSTR;. b- C9 o3 E* }. T$ F
        pokeVariant[0].bstrVal         = valueStr;  f+ f4 O: O1 ]1 _0 U0 k$ M5 r
( M  ~. x8 S% s* ]8 j8 {0 G5 [# Y* E0 j7 h
        itemStr                                 = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");& X0 D$ q( F( |! _* i  b2 ?
        VariantInit(&pokeVariant[1]);
+ t4 {9 |) i! Q# [        pokeVariant[1].vt                 = VT_BSTR;8 t/ ~' G/ q/ E5 V" E/ Y: z  F% ]
        pokeVariant[1].bstrVal         = itemStr;
3 S; G( w/ h, I6 G8 t1 p' L. v6 I6 e& ~* R; j0 w9 z
          topicStr                                 = SysAllocString((WCHAR *) L"system");
' H" _' Q# R& _3 T" m/ H% {3 p, L. z        VariantInit(&pokeVariant[2]); ! ]* n  z8 j# t5 u) V# o
        pokeVariant[2].vt                 = VT_BSTR;. J- c' P4 K3 {$ h/ g
        pokeVariant[2].bstrVal         = topicStr;
4 t% d& u7 [9 P$ _# M0 [
9 z) H3 c4 A5 a//        Set the DISPPARAMS structure that holds the variant.! l& S( J. S& X2 Z

8 }: }  B7 _' \8 S" Z        dp.rgvarg                                         = pokeVariant;5 {, g0 O' I* J! p
        dp.cArgs                                         = 3;
/ ~2 \6 p! L& Q4 J0 `: i        dp.rgdispidNamedArgs                 = NULL;
3 K) N, K# t3 t  V9 e$ ]4 L        dp.cNamedArgs                                 = 0;  G& `2 R0 p+ Q- N* |  H

# A/ d& X9 w, V  A% ]- o: C- o+ c8 e//        Call IDispatch::Invoke()
: e3 @9 p; h$ p" m* {9 b
, x* W, ~) b8 m: M3 U% V$ r3 G9 s        hr = m_pDisp->Invoke(
* o$ Q, U8 R" e/ u. D: y& a                pokeID,6 Y' ~# B. Q  d. l) s- F
                IID_NULL,% ]* L6 i- ^  {
                LOCALE_SYSTEM_DEFAULT,
0 M: N% P6 t1 n5 `( X8 L6 {                DISPATCH_METHOD,) S. \. |3 M4 l7 e. O0 Z( v6 s+ b! ~
                &dp,
. Y7 Q$ N3 j# k3 x                NULL,& ?7 r' @. Z( i: e
                &ei,
* p8 O3 ]# a$ t4 p) e                &uiErr);9 e, Q4 y  ^: T" z$ s* U

3 J$ Q( `7 s* u$ G0 N$ n        SysFreeString(topicStr);9 H/ N. t: a8 f" y3 l* O
        SysFreeString(itemStr);
7 L4 r3 `  ~1 m( p( }& h        SysFreeString(valueStr);
. E2 f6 c/ s" N& [7 k6 o, ^. H6 }, T. q* h
现在这个程序可以实现将1232这个数据发送到extend,extend有一个对话框弹出并出现1232这个数据,不知道这个对话框为什么会弹出并显示这个数据???
  e5 ]' P1 n, l' Y8 l此外我希望将这个数据赋给extend程序里面的一个变量,请问如何实现????1 D/ H: s( _2 R5 Z/ |4 L7 M4 D

' u  f  Y% K$ [
# l# B* }" }  X2 j* P$ U2.这是request的程序
( Q7 P8 d, j& J( H7 l//  Request a value from Extend" c* R3 {+ `# m2 u& M' C$ A! F4 M" K
//
, U# q' a6 v! X2 w" n4 w" N, h/ p//        Initialize the variant that will hold the BSTR.  Set the variant's) j& t5 b2 D' P) b+ d
//        type flag to indicate the fact that this variant holds a BSTR. Place the
: D7 \) }. `' u, Z//        BSTR into the variant structure.
8 I, x. C; e& w! W7 F! a$ K$ K
; \: \; Z) e3 }# s4 Y% W* t        requestVariant                                 = (VARIANTARG *)malloc(sizeof(VARIANTARG) *2);
. E0 |' E( a; L  L" N' c       
( v# y9 X' r/ ]/ ?5 B9 p+ _         itemStr                                         = SysAllocString((WCHAR *) L"global0:#0:0:0:0:0");
# H, H' s$ I, W        VariantInit(&requestVariant[0]);
" |. a0 F% [# g0 |! a        requestVariant[0].vt                 = VT_BSTR;
) ?5 y8 g/ r! N( v( W$ k  X5 `/ q        requestVariant[0].bstrVal         = itemStr;
  V+ n% J7 P$ S" p! E
, K# y2 {, \( b! ~" y+ ^          topicStr                                         = SysAllocString((WCHAR *) L"system");$ H2 T/ h& N; h& C! {& X' q+ [( T$ u, D
        VariantInit(&requestVariant[1]);
. t3 x6 P; G% B        requestVariant[1].vt                 = VT_BSTR;
- k! G1 e- q) r/ M1 b        requestVariant[1].bstrVal         = topicStr;7 |! a3 t+ u1 v! T! |3 w/ H) }4 H
! \% {% l. w7 _# e) Q0 p
//        Set the DISPPARAMS structure that holds the variant.
0 {% F3 v) B4 I/ [: [  k& @& n% X5 c% z; M
        dp2.rgvarg                                         = requestVariant;
; w! Q1 j/ r" n$ }$ k        dp2.cArgs                                         = 2;
; ?, X: |$ j# n8 O0 A+ s        dp2.rgdispidNamedArgs                 = NULL;$ y6 d3 ], M1 z! g: D+ v- I- `
        dp2.cNamedArgs                                 = 0;  O% ]3 X0 n- Y- m  n+ R" z6 o/ ?. j

* s2 V2 {& g) J0 Q4 V. v. M         var.vt = VT_EMPTY;
! a7 R1 U$ j  W# y* B3 v5 y& f/ i# G+ Z2 h
//        Call IDispatch::Invoke()2 B6 }1 V5 r' |+ R8 S: L+ J
& `2 e2 t6 |  W/ j' \4 i$ i
        hr = m_pDisp->Invoke(
9 p( ?9 Y5 z: I$ u) W  d# v% @$ l                requestID,
  }. {: H& A# K                IID_NULL,, a& `( E8 S# U0 E
                LOCALE_SYSTEM_DEFAULT,
; ^8 h$ I5 y& ]. S$ g: H: B                DISPATCH_METHOD,
* M1 W; n) i0 y; V" q' R+ |6 p                &dp2,
, T/ \8 c& V5 j0 p- B                &var,) B6 P. h% s4 a& z' m
                &ei,7 o; t# r# \1 N5 ^$ a
                &uiErr);
( M" B% {8 ]% Q9 {5 B4 x  ^  r# ^# g  E  b: O
        SysFreeString(topicStr);# G1 i; z+ V& e8 s  y. p3 l
        SysFreeString(itemStr);
9 E7 H4 v' b# `请问该程序是获得extend里面的哪个值?) g/ }7 D% l6 \2 `, g% I( S
如果我希望获得extend程序里面的某个变量的数值,那个c++程序应该如何实现????

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

本版积分规则

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

GMT+8, 2026-2-3 00:41 , Processed in 0.019610 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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